diff --git a/typo3/sysext/backend/Resources/Public/JavaScript/SplitButtons.js b/typo3/sysext/backend/Resources/Public/JavaScript/SplitButtons.js index 9279cf369801d73a9cbbb1f66c78260528fad040..7c11585ca252a915a2e94df3780b2ecdb9e4843d 100644 --- a/typo3/sysext/backend/Resources/Public/JavaScript/SplitButtons.js +++ b/typo3/sysext/backend/Resources/Public/JavaScript/SplitButtons.js @@ -31,6 +31,7 @@ define(['jquery', 'TYPO3/CMS/Backend/Icons'], function($, Icons) { * Initializes the save handling */ SplitButtons.initializeSaveHandling = function() { + var preventExec = false; var elements = [ 'button[form]', 'button[name^="_save"]', @@ -39,45 +40,49 @@ define(['jquery', 'TYPO3/CMS/Backend/Icons'], function($, Icons) { 'a[data-name="CMD"][data-value^="save"]' ].join(','); $('.t3js-module-docheader').on('click', elements, function(e) { - var $me = $(this), - linkedForm = $me.attr('form') || $me.attr('data-form') || null, - $form = linkedForm ? $('#' + linkedForm) : $me.closest('form'), - name = $me.data('name') || this.name, - value = $me.data('value') || this.value, - $elem = $('<input />').attr('type', 'hidden').attr('name', name).attr('value', value); + // prevent doubleclick double submission bug in chrome, + // see https://forge.typo3.org/issues/77942 + if (!preventExec) { + preventExec = true; + var $me = $(this), + linkedForm = $me.attr('form') || $me.attr('data-form') || null, + $form = linkedForm ? $('#' + linkedForm) : $me.closest('form'), + name = $me.data('name') || this.name, + value = $me.data('value') || this.value, + $elem = $('<input />').attr('type', 'hidden').attr('name', name).attr('value', value); - // Run any preSubmit callbacks - for (var i = 0; i < SplitButtons.preSubmitCallbacks.length; ++i) { - SplitButtons.preSubmitCallbacks[i](e); - } - - $form.append($elem); - - // Disable submit buttons - $form.on('submit', function() { - if ($form.find('.has-error').length > 0) { - return false; + // Run any preSubmit callbacks + for (var i = 0; i < SplitButtons.preSubmitCallbacks.length; ++i) { + SplitButtons.preSubmitCallbacks[i](e); } + $form.append($elem); + // Disable submit buttons + $form.on('submit', function() { + if ($form.find('.has-error').length > 0) { + preventExec = false; + return false; + } - var $affectedButton, - $splitButton = $me.closest('.t3js-splitbutton'); + var $affectedButton, + $splitButton = $me.closest('.t3js-splitbutton'); - if ($splitButton.length > 0) { - $splitButton.find('button').prop('disabled', true); - $affectedButton = $splitButton.children().first(); - } else { - $me.prop('disabled', true); - $affectedButton = $me; - } + if ($splitButton.length > 0) { + $splitButton.find('button').prop('disabled', true); + $affectedButton = $splitButton.children().first(); + } else { + $me.prop('disabled', true); + $affectedButton = $me; + } - Icons.getIcon('spinner-circle-dark', Icons.sizes.small).done(function(markup) { - $affectedButton.find('.t3js-icon').replaceWith(markup); + Icons.getIcon('spinner-circle-dark', Icons.sizes.small).done(function(markup) { + $affectedButton.find('.t3js-icon').replaceWith(markup); + }); }); - }); - if ((e.currentTarget.tagName === 'A' || $me.attr('form')) && !e.isDefaultPrevented()) { - $form.submit(); - e.preventDefault(); + if ((e.currentTarget.tagName === 'A' || $me.attr('form')) && !e.isDefaultPrevented()) { + $form.submit(); + e.preventDefault(); + } } }); };