Як забараніць карыстальнікам Адпраўка формы двойчы

<input type="submit" name="btnADD" id="btnADD" value="ADD"/>

калі карыстальнік націскае кнопку дадаць у два разы, з атрымаць прадстаўленых у два разы з тымі ж дадзенымі ў табліцы. Таму, калі ласка, дапамажыце мне, каб абмежаваць карыстачу прадставіць у два разы.

12
Увогуле, вы маглі б дадаць некаторыя абмежаванні базы дадзеных або што-то, што не будзе гарантаваць, што нічога дрэннага будзе ў любым выпадку.
дададзена аўтар quazar, крыніца

15 адказы

Пасля таго, як форма адпраўлена, прымацаваць апрацоўшчык з JQuery, які перахоплівае і «адключае» адпраўка апрацоўшчыка:

var $myForm = $("#my_form");
$myForm.submit(function(){
    $myForm.submit(function(){
        return false;
    });
});

Вяртанне "хлусьня" з апрацоўшчыка прадставіць перашкодзіць форму ад прадстаўлення. Адключэнне кнопкі могуць мець дзіўныя эфекты, пра тое, як апрацоўваецца форма. Такі падыход, здаецца, у асноўным не маюць пабочных эфектаў і працуе нават на формах, якія маюць некалькі кнопак адпраўкі.

22
дададзена
Малое нараканне ў тым, што кожны раз, калі карыстальнік націскае на кнопку, вы будзеце дадаваць яшчэ адзін апрацоўшчык падзей. Гэта не выкліча ніякіх праблем, але некаторыя людзі могуць не захацець гэтага. Простае выпраўленне проста выдаліць «Submit» апрацоўшчык на форме перад даданнем новага.
дададзена аўтар yuikonnu, крыніца
Значна пераважней. Вельмі нічога сабе. Такая элегантнасць.
дададзена аўтар Chud37, крыніца
Здаецца, самае лепшае рашэнне, таму што, калі адключыць кнопку адпраўкі да паведамленне адпраўлена, вы не зможаце праверыць, прадставіць значэнне кнопкі, калі ён не будзе пасылаць ...
дададзена аўтар Axi, крыніца
Добры адказ, але раскажыце, калі ласка, якія дзіўныя пабочныя эфекты адключыць кнопку адпраўкі?
дададзена аўтар ADTC, крыніца
Так, я проста трэба дадаць калі ($ form.valid ()) і ён працаваў выдатна.
дададзена аўтар Toadfish, крыніца
Ён працуе, але як ёсць ён таксама будзе адключаць кнопку, калі праверка не пройдзены, і форма не будзе прадстаўлена - у маім выпадку, у любым выпадку.
дададзена аўтар Toadfish, крыніца
Вельмі добра. Дзеля зручнасці і прастаты выкарыстання ў гэта можа быць добрай ідэяй, каб гэты апрацоўшчык таксама змяніць кнопку (ы) знешні выгляд (адключыць ці іншым чынам даць зразумець карыстачу, што «Кампутар зараз сказаць няма, waitaminute ..»)
дададзена аўтар st3inn, крыніца
@JonathanWarner калі ў вас ёсць пацвярджэнне, вы, верагодна, хочаце, каб прымацаваць апрацоўшчык прадставіць толькі пасля таго, як праверка прайшла паспяхова, а не па форме перадаць (ці зрабіць праверку на форме прадставіць і толькі прымацаваць апрацоўшчык, калі гэта атрымаецца).
дададзена аўтар rogueleaderr, крыніца
Можа хто-то калі ласка зрабіць JSFiddle ці нешта, што даказвае, што гэта працуе?
дададзена аўтар nmit026, крыніца

паспрабаваць гэты код ..

<input type="submit" name="btnADD" id="btnADD" value="ADD" onclick="this.disabled=true;this.value='Sending, please wait...';this.form.submit();" />
16
дададзена
Ці не будзе гэта ўсё яшчэ прадстаўляе ў ад таго, калі карыстальнік націскае ўвядзіце ў полі?
дададзена аўтар Ziyan Junaideen, крыніца
@ Foxt7ot, калі карыстальнік з'яўляецца тое, што здаровы сэнс, ён не знойдзе шлях да падвойнаму пост незалежна ад таго, што вы робіце Javascript для яго прадухілення. толькі на боку сервера дублікат праверка можа сапраўды прадухіліць.
дададзена аўтар ADTC, крыніца
@Ziyan, выкарыстоўваючы <�тып = "кнопка» ўвод ..> будзе рабіць трук з Адказ Віджай ў :)
дададзена аўтар Rakesh Shewale, крыніца
@ADTC Ах так! Сапраўды
дададзена аўтар foxt7ot, крыніца
Таксама карыстальнік можа ўключыць кнопку зноў для рэдагавання кода праз вэб-браўзэр (Агледзець элемент)
дададзена аўтар foxt7ot, крыніца
Што рабіць, калі ўваходы няслушныя? Падобна гэтаму, калі карыстальнік увёў адмоўнае значэнне ў ўводзе нумары з атрыбутам мін = 0? Кнопка будзе адключаная, і карыстальнік не зможа паўторна націснуць на яе пасля таго, як адкарэктаваўшы яго ўваходы, праўда?
дададзена аўтар Pawamoy, крыніца

Вы можаце адключыць кнопку пасля націску або схаваць яго.

<input type="submit" name="btnADD" id="btnADD" value="ADD" onclick="disableButton(this)"/>

Яш:

 function disableButton(button) {
     button.disabled = true;
     button.value = "submitting...."
     button.form.submit();
}
4
дададзена

Вы можаце паведаміць карыстальніка аб тым, што ён п'е занадта шмат кавы, але лепш за ўсё адключаная кнопка з JavaScript, напрыклад так:

$("#btnADD").on('click', function(btn) {
  btn.disabled = true;
});
3
дададзена
Хех. Я толькі што гэта сапраўды праблема, хто-то прадставіў тую ж самую форму 11 разоў! На тэставанні Аказалася, што ў іх ёсць хуткі палец на курок. Што, у сваю чаргу, прывяло мяне сюды ...: D
дададзена аўтар Chud37, крыніца

<�Моцны> Калі вы працуеце з Java на боку сервера сцэнарыяў, а таксама з дапамогай распорак 2, то вы глядзіце гэтую спасылку, якая пра перамовы аб выкарыстанні маркера.

http://www.xinotes.org/notes/note/369/

Маркер павінен быць сфарміраваны і захоўваецца ў сесіі для пачатковай старонкі візуалізацыі, калі запыт ўяўляюцца разам з маркерам ў першы раз, у распорках дзеянні запусціць струмень з імем патоку ў якасці маркераў ідэнтыфікатара і запусціць логіку незалежна ад таго, як кліента просіцца, калі кліент зноў адправіць той жа запыт, праверыць, ці з'яўляецца паток ўсё яшчэ працуе (thread.getcurrentthread (). перарваны), калі ўсё яшчэ працуе, то адправіць кліента перанакіравання 503.

І <�моцнага>, калі вы не выкарыстоўваеце рамкі і шукаеце простую трэніроўку . Вы можаце скарыстацца дапамогай

java.util.UUID.randomUUID();

Проста змесціце выпадковы UUID у сесіі, а таксама ў схаваным поле формы і на другім баку (СПЯ старонкі, дзе вы апрацоўку іншых работ, як захоўванне дадзеных у базе дадзеных і г.д.) выняць UUID з сесіі і схаванага палі формы, калі форма поля запалак чым ісці далей, выдаліць UUID з сесіі і, калі не чым гэта можа быць магчыма, што форма была паўторна.

Для вашай дапамогі я пішу некаторы фрагмент кода, каб даць ўяўленне пра тое, як дасягнуць рэч.

<%
String formId=(java.util.UUID.randomUUID()).toString();
session.setAttribute(formId,formId);
%>
<input type='hidden' id='formId' name='formId' value='<%=formId%>'>
3
дададзена
xinotes.org/notes/note/369 Спасылка, якую вы падзяліліся, калі я выкарыстоўвайце гэты метад, магчыма, што другі запыт атрымлівае забаўляў і першы будзе адменены. Ці правільна я?
дададзена аўтар Sunny Gupta, крыніца

Я зрабіў рашэнне, заснаванае на адказ rogueleaderr у:

jQuery('form').submit(function(){
    jQuery(this).unbind('submit');//unbind this submit handler first and ...
    jQuery(this).submit(function(){//added the new submit handler (that does nothing)
        return false;
    });
    console.log('submitting form');//only for testing purposes
});
2
дададзена

Калі карыстальнік націскае на кнопку адпраўкі адключыць гэтую кнопку.

<form onSubmit="disable()"></form>

function disable()
{
     document.getElementById('submitBtn').disabled = true;
    //SUBMIT HERE
}
1
дададзена
@NOX дзякуй я абнавіў код
дададзена аўтар PSR, крыніца
Я выкарыстаў гэтую тэхніку, але я сутыкнуўся з праблемай з ім. ўваходы для інвалідаў не перадаюцца на сервер, і калі я змяніў сцэнар сервера для тэставання $ _ POST [ «submitBtn»] (таму што я дадаў некалькі кнопак скарыцца і неабходна ведаць, якія яны выкарыстоўвалі) гэта не ўдалося таму што ён не быў усталяваны.
дададзена аўтар Barmar, крыніца
@Barmar вы можаце схаваць кнопку() або (калі вам трэба трымаць кнопку бачнай), змесціце DIV-над кнопкі (ы), так што яна не можа быць націснутая. Такім чынам, кнопка ня адключаная, і адпраўляецца з дадзенымі формы.
дададзена аўтар ADTC, крыніца
<�Б> +1 Гэта добрая ідэя, каб напісаць код цалкам, і зрабіць jsFiddle таксама ;) .
дададзена аўтар user1823761, крыніца

Маё рашэнне па аналагічным пытаньні было стварыць асобную кнопку, схаваныя, ўявіць. Ён працуе наступным чынам:

  • Вы выберыце першы, кнопку бачнай.
  • Першая кнопка адключаная.
  • Элемент OnClick выклікае кнопку другі прадставіць націснуць.
  • форма ўяўляецца.
<input type="submit" value="Email" onclick="this.disabled=true; this.value='Emailing...'; document.getElementById('submit-button').click();">
<input type="submit" id='submit-button' value="Email" name="btnSubmitSendCertificate" style='display:none;'>

Я пайшоў па гэтым шляху толькі для яснасці для тых, хто працуе над кодам. Ёсць і іншыя рашэнні, якія могуць быць суб'ектыўна лепш.

1
дададзена

Вы можаце выкарыстоўваць JavaScript.

Прыкласці form.submit.disabled = TRUE; да onsubmit падзеі формы.

Дасведчаны карыстач можа абыйсці яго, але ён павінен прадухіліць 99% карыстальнікаў ад прадстаўлення двойчы.

1
дададзена

Create a class for the form, in my case I used: _submitlock

$(document).ready(function() {
  $(document).on('submit', '._submitlock', function (event) {

     //Check if the form has already been submitted
      if (!$(this).hasClass('_submitted')) {
         //Mark the form as submitted
          $(this).addClass('_submitted');

         //Update the attributes of the submit buttons
          $(this).find('[type="submit"]').attr('disabled', 'disabled');
         //Add classes required to visually change the state of the button
          $(this).find('[type="submit"]').addClass("buttoninactive");
          $(this).find('[type="submit"]').removeClass("buttonactive");

      } else {
         //Prevent the submit from occurring.
          event.preventDefault();
      }

  });});
1
дададзена

Вы можаце дадаць клас у форму і ваш адправіць кнопку і выкарыстоўваць JQuery:

<div class="snippet" data-lang="js" data-hide="false" data-console="true" data-babel="false"> <div class="snippet-code">

$(function() {

   //prevent the submit button to be pressed twice
    $(".createForm").submit(function() {
        $(this).find('.submit').attr('disabled', true);
        $(this).find('.submit').text('Sending, please wait...');
    });
})
</div> </div>
1
дададзена

Вы можаце адлюстраваць паведамленне аб паспяховым выкарыстанні усплываючых з дапамогай кнопкі OK, калі націсніце кнопку ОК перанакіроўваць куды-небудзь

1
дададзена

Адключыць кнопку Submit

$('#btnADD').attr('disabled','disabled');

      or

$('#btnADD').attr('disabled','true');
1
дададзена

Пакладзеце клас на ўсіх кнопках тыпу = «Submit», як, напрыклад, «Кнопка адключэння з-за-onsubmit» і выкарыстоўваць jQuery скрыпт так:

$(function(){
    $(".button-disable-onsubmit").click(function(){
         $(this).attr("disabled", "disabled");
         $(this).closest("form").submit();
    });
});

Не забудзьцеся захаваць гэты код на родавым файла JavaScript, так што вы можаце выкарыстоўваць яго ў многіх старонках. Як гэта, становіцца элегантным і простым ў паўторным выкарыстанні раствора. Акрамя таго, вы нават можаце дадаць яшчэ адзін радок, каб змяніць значэнне тэксту, а таксама:

$(this).val("Sending, please wait.");
0
дададзена

Дадайце клас у форме, калі ўяўляецца, спыняючы карыстальнікам двайны пстрычка/Дасылаем

$('form[method=post]').each(function(){
   $(this).submit(function(form_submission) {
     if($(form_submission.target).attr('data-submitted')){
        form_submission.preventDefault();
     }else{
        $(form_submission.target).attr('data-submitted', true);
     }
  });
});
0
дададзена