2016-03-20 11 views
1

Ich habe Button, mit zwei Klickereignissen. Was ich versuche zu tun ist, um beide oder alle Ereignisse auf dieser Schaltfläche abhängig von einem Kriterium zu verhindern.Stoppen Sie eines der Click-Ereignisse auf der gleichen Schaltfläche

Ich habe versucht, event.preventDefault(); und event.stopPropagation(); und return false; zu verwenden, aber nichts funktioniert, wie ich brauche.

/* I need to stop $('button') event if the if condition 
 
inside $('#btn') event passed */ 
 

 
$('#btn').click(function(e){ 
 
    var term = $('#term').val(); 
 

 
    if(term != '') { 
 
    //e.preventDefault(); 
 
    //e.stopPropagation(); 
 
    return false; 
 
    alert(2); 
 
    } else { 
 
    // continue 
 
    } 
 
}); 
 

 
$('button').click(function(e){ 
 
    alert(1); 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<input id="term" type="text" placeholder="type here .."> 
 
<button type="button" id="btn">Check</button>

JSfiddle example

+0

Sie kann nach dem 'return; keinen Code einfügen.' Wenn Sie 'return' einstellen, wird nichts unter dieser Zeile verarbeitet. Selbst Wurffehler auf dich. Deshalb können Sie Ihre "Warnung (2)" nicht sehen. –

+0

Sie können den zweiten Event-Handler nicht stoppen, besonders wenn er zuerst registriert wird – charlietfl

Antwort

0

Ich nehme an, Sie beide Ereignisse beenden möchten. Wenn dies der Fall ist, sollten Sie eine Klausel zu Ihrem $ ('button') hinzufügen. . Zuerst wird in der $ ('# btn')() klicken Handler hinzufügen Eigenschaft zu überprüfen, ob Ereignis aufhören sollte:

if(term != '') { 
    //e.preventDefault(); 
    //e.stopPropagation(); 
    this.stop = 1; 
... 

Dann ist es überprüfen:

if (this.getAttribute("id") !== "btn" || this.stop !==1) { 
     alert(1); 
    } 

Hier JSFiddle

+0

'this.getAttribute (" id ")" AKA 'this.id' –

+0

Großartig! das ist funktioniert – user3003810

+0

@ user3003810 wird aufhören zu arbeiten, sobald Sie den Text aus dem Eingabefeld entfernen ... –

1

Um aus Ihrer Funktion Gebrauch zu brechen nur return; (statt return false;)

Sie können aber auch keinen Code nach einer return so eingestellt, hier gehen Sie :

$('#btn').click(function(e){ 
    e.preventDefault(); 

    var term = $.trim($('#term').val()); 

    if(term !== "") { 
    alert("Value exists! I'm breaking any further operations."); 
    return; // "Exit" my function 
    // YOU CANNOT WRITE CODE AFTER A RETURN STATEMENT! 
    } else { // Else is actually not needed but it's cool to have it for clearance 
    alert("Value is empty."); 
    } 
}); 

$('button').click(function(e){ 
    alert(1); // You'll see this in any case. 
}); 

Um auf Ihre Frage zu erweitern Wie die Warnung (1) verhindern, dass popping

$('#btn').click(function(e){ 
 
    e.preventDefault(); 
 

 
    this.term = $.trim($('#term').val()); 
 

 
    if(this.term) { 
 
    alert("Value exists!"); 
 
    } else { 
 
    alert("Value is empty."); 
 
    } 
 
}); 
 

 
$('button').click(function(e){ 
 
    if(!this.term) { 
 
    alert(1); 
 
    } 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<input id="term" type="text" placeholder="type here .."> 
 
<button type="button" id="btn">Check</button>

+0

Sie haben mich verpasst verstanden, ich muss keinen Code hinzufügen, wenn Bedingung, was ich brauche ist, wenn der Begriff! == "" zweites Ereignis, welches Rufalarm (1); gestoppt werden! – user3003810

+1

@ user3003810 Sie können nicht AFAIK (ohne Verwendung eines booleschen Flags). Es ist schon zu spät, da der Listener * fast * gleichzeitig mit dem anderen $ (# # btn) 'click gesetzt und getriggert wird. Selbst wenn Sie '$ (this) .off()' verwenden, wird die Warnung (1) nicht daran gehindert, Sie anzuschreien. –

+0

@ user3003810 deshalb habe ich geschrieben * '" // Du wirst das auf jeden Fall sehen. "' * –