2016-09-06 5 views
0

Ich habe die verschiedenen Methoden ausprobiert, die normalerweise funktionieren, aber SmartWizard scheint zu verhindern, dass diese Methoden funktionieren.So deaktivieren Sie die Schaltfläche "Fertig stellen" nach dem ersten Klick

Ich muss die Schaltfläche Fertig stellen deaktivieren und den Text nach dem Klicken ändern, um mehrere Übermittlungen zu verhindern. Egal wo ich den Code platziere, der Bildschirm ändert sich nicht, der Wert der Schaltfläche ändert sich nicht und die Schaltfläche wird nicht deaktiviert.

habe ich versucht, die typische Klick-Funktion ...

$(".actionBar .buttonFinish").click(function(){ 
    $(".actionBar .buttonFinish").addClass("buttonDisabled"); 
    $(".actionBar .buttonFinish").text("Sending..."); 
}); 

Ich habe auch versucht, diese Validierung der letzten Schrittes im Rahmen mit und in den FinishCallback direkt vor dem Ajax-Aufruf. Nichts ändert sich, bis der Ajax-Aufruf abgeschlossen ist und der Ajax-Erfolg ausgeführt wird.

UPDATE

Ok, dann ist dies sicher ein Timing-Problem. Wenn der Ajax-Aufruf fehlschlägt, wird die Schaltfläche deaktiviert und der Text wird geändert. Ich muss sicherstellen, dass diese beiden Dinge auftreten, bevor ich zum Ajax-Aufruf übergehe. Bisher habe ich versucht, diese aber es hat nicht funktioniert:

$(".actionBar .buttonFinish").addClass("buttonDisabled").text("Sending...").ajax({ 
+0

Haben Sie versucht, die Dinge Hinzufügen Protokollierung, Brennen wird der Click-Handler, um sicherzustellen? – Whothehellisthat

+1

Versuchen Sie, jQuerys 'prop' -Funktion zu verwenden, um das' disabled' Attribut true zu setzen: '$ (". ActionBar .buttonFinish "). Prop ('disabled', true);' vorausgesetzt es ist ein '/ 'Element. –

+0

versuchen Sie mit $ (". ActionBar .buttonFinish"). Off ('klicken') – gaetanoM

Antwort

-1

Versuchen Sie, diese

<input type='button' id='btn' onclick='click_me()' value='click'> 

    var disable = false; 
    function click_me() 
    { 
    if(disable = 'false') { 
     $(".actionBar .buttonFinish").addClass("buttonDisabled"); 
     $(".actionBar .buttonFinish").text("Sending..."); 
     disable = true; 
    } 
    } 
+0

Wo ist die Deaktivierung? Das Hinzufügen einer Klasse, damit sie deaktiviert aussieht, ist nicht dasselbe wie die Deaktivierung. – NoobishPro

+0

SmartWizard erstellt die "Schaltfläche", die eigentlich ein Anker-Tag ist: –

+0

so, was Sie gerade onclick Ereignis mit onfocus ersetzen können und fügen Sie Ihre Methode innerhalb Bedingung ... hinzu und Sie können OnClick-Ereignis auch ein Anker-Tag hinzufügen, wenn Sie nicht bestehen url ein Anker Tag – Aks

0
$(".actionBar .buttonFinish").click(function(){ 
    $(".actionBar .buttonFinish").attr('disabled', 'disabled'); 
    $(".actionBar .buttonFinish").text("Sending..."); 
}); 
+0

Nicht gut. Die Funktion wird ausgelöst, scheint jedoch nach dem Ausführen des Ajax-Aufrufs ausgelöst zu werden. Ich muss es vor dem Ajax laufen. –

+0

Haben Sie versucht vorherSenden: function() {}, – Ankneema

0

Sie können dies am Ende des ‚Onclick‘ Ereignis fügen Sie die Taste deaktivieren

$(this).prop("disabled", true); 

ODER

$(this).attr("disabled", 'disabled'); 

Sie müssen die Funktion 'prop' oder 'attr' abhängig von der JQuery-Version

+0

Nicht gut. Die Verknüpfungsschaltfläche wird nicht deaktiviert und der Text ändert sich erst, nachdem die Ajax-Methode ausgeführt wurde. SmartWizard scheint zuerst seine Funktion auszuführen. –

+0

Ich weiß nicht über den SmartWizard, , aber fügen Sie einfach den Sperrcode am Anfang der Click-Funktion oder kurz vor der Ajax-Anfrage – zakaria35

0

verwenden Versuchen Sie dies.

$(document).ready(function(){ 
 
    $(function(){ 
 
    $(".buttonFinish").on("click", function(){ 
 
     $(this).prop('disabled', true); 
 
     $(this).val("Sending..."); 
 
    }); 
 
    }); 
 
});
input{ 
 
    display: block 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.10.1/jquery.min.js"></script> 
 

 
<div> 
 
    <form> 
 
    <input type="text"> 
 
    <input type="text"> 
 
    <input class="buttonFinish" type="submit"> 
 
    </form> 
 
</div>

UPDATE

Lassen Sie mich sehen, ob ich Sie verstanden, Sie auf die Schaltfläche und den Text vor Ajax-Aufruf deaktivieren? Sie haben es mit vorSenden versucht?

$(document).ready(function(){ 
 
    $(function(){ 
 
    $("form").submit(function(e){ 
 
     e.preventDefault(); 
 
     
 
     $.ajax({ 
 
     beforeSend: function(){ 
 
      $(".buttonFinish").prop('disabled', true); 
 
      $(".buttonFinish").val("Sending..."); 
 
     }, 
 
     complete: function(){ 
 
      // remove disabled and change the text 
 
     }, 
 
     }); 
 
    }); 
 
    }); 
 
});
input{ 
 
    display: block 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.10.1/jquery.min.js"></script> 
 

 
<div> 
 
    <form> 
 
    <input type="text"> 
 
    <input type="text"> 
 
    <input class="buttonFinish" type="submit"> 
 
    </form> 
 
</div>

+0

Ich muss deaktivieren Sie die Schaltfläche VOR dem AJAX-Aufruf. Bei jedem Versuch erscheint der Ajax vor dem Button, der eine Änderung widerspiegelt. Wenn der Ajax-Aufruf langsam oder verzögert ist oder fehlschlägt, kann der Benutzer mehrfach klicken und mehrfach senden. –

0

Da Ihr .buttonFinish ist ein Link, nicht wirklich eine Taste, können Sie deaktivieren es nicht mit .prop('disabled', true) - Sie stattdessen eine "Blockierung pane" verwenden möchten.

Setzen Sie ein div am Ende Ihrer Seite, ich bevorzuge kurz vor dem </body> Tag, das nichts enthält und ungesehen ist, von der Seite und ohne Höhe und Breite.

<div id="blocker"></div> 
</body> 

Wenn die „Button“ geklickt wird dann eine Klasse hinzufügen, damit, dass sie zeigen, machen, indem die volle Höhe/Breite der Seite und mit einem hohen Z-Index, so dass es „vor“ ist von alles andere; Es wird alle Klicks erhalten, die nicht an die darunter liegenden Steuerelemente als niedrigerer Z-Index weitergegeben werden.
Ihr Click-Handler würde $('blocker').addClass('blocking'); der resultierende DOM geben ...

<div id="blocker" class="blocking"></div> 
</body> 

Verwenden CSS Stil #blocker so ist es unsichtbar, dann Stil #blocker.blocking so blockiert es den Rest der Seite.

$('a.finished').click(function(e) { 
 
    e.preventDefault(); 
 
    $('#blocker').addClass('blocking'); 
 
    // when ajax call finishes, 
 
    // use $('#blocker').removeClass('blocking'); 
 
});
#blocker { 
 
    position: fixed; 
 
    top: -10px; 
 
    left: -10px; 
 
    height: 0; 
 
    width: 0; 
 
    z-index: -20; 
 
    background-color: white; 
 
} 
 

 
#blocker.blocking { 
 
    height: auto; 
 
    width: auto; 
 
    bottom: -10px; 
 
    right: -10px; 
 
    opacity: 0.6; 
 
    z-index: 9000; 
 
}
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.4/jquery.js"></script> 
 
<div class="stuff"> 
 
    <p>This is stuff</p> 
 
    <p>This is other stuff</p> 
 
    <p>A <a href="#" class="finished">link</a> is in here.</p> 
 
</div> 
 
<div id="blocker"></div>

Verwandte Themen