2010-07-29 6 views
24

Ich habe echte Schwierigkeiten, e.preventDefault(); zu arbeiten.e.preventdefault(); funktioniert nicht

Hier ist mein Code

$('#ListSnapshot a').live('click', function(e){ 
    var url = $(this).attr('href') +' #WebPartWPQ2 .ms-listviewtable'; 
    $('#ListSnapshot').load(url); 
    e.preventDefault(); 
}); 

Könnte jemand erklären, was ich falsch mache, kann ich die Ladefunktion der Arbeit sehen, aber dann wird die Seite umleitet auf den geklickt Link, die ich verhindern müssen.

Ich habe auch versucht, e.preventDefault(); an die Spitze der Funktion zu bewegen, vergeblich.

+0

Ich habe das Gefühl, es ist etwas anderes los hier, weil 'preventDefault' * sollte * funktionieren. Können wir den Markup/anderen Code sehen? – James

+0

Wie J-P gesagt hat, sieht es so aus, als würde hier etwas anderes passieren, es sollte wie erwartet funktionieren. Können Sie den HTML-Code für #ListSnapshot und seine untergeordneten Elemente bereitstellen? – GenericTypeTea

+0

Ich entfernte die Antwort von Ihrer Frage, Sie sollten es als Antwort posten, wenn die Frage wieder offen ist. –

Antwort

2

Versuchen Sie, false zurückzugeben. live funktioniert nicht immer genauso wie bind funktioniert. überprüfen Sie jquery docs.

+2

Danke, ich habe mir das schon ausprobiert, aber immer noch kein Glück. Vielen Dank nochmal Gary – Gary

+0

Ich benutze .on() und return false arbeitete für mich! – servermanfail

6

Der von Ihnen bereitgestellte Code sollte auf jeden Fall funktionieren (working example). Es muss ein anderes Problem mit Ihrem Code geben.

Versuchen Sie, eine Warnung in Ihrem Ereignishandler zu platzieren, um sicherzustellen, dass sie überhaupt auslöst. Es ist möglich, dass Ihr #ListSnapshot a nichts findet.

Wenn etwas anderes in Ihrem Handler falsch ist, verursacht das eine Ausnahme, die verhindern könnte, dass das Javascript den gesamten Weg zum preventDefault Aufruf ausführt. Ich sehe nicht, was das in dem Code sein könnte, den du bereitgestellt hast, tho.

+2

Ich denke, das ist wahrscheinlich die Antwort. 'try..catch' sollte helfen. – Josh

+1

Ich habe die Frage bearbeitet, weil ich nicht sicher war, wie man eine Antwort hinzufügt, und konnte nicht alles in diese Box passen. Danke Wieder – Gary

+0

@Gary: Du hast das beste getan - Bearbeiten Sie Ihre Frage mit Details und dann kommentieren, um andere wissen zu lassen, Ihre bearbeitete Frage zu überprüfen, ist der geeignete Weg, damit umzugehen. Angesichts dessen, dass die Warnung zeigt, bin ich mir nicht sicher, was das Problem ist. Es ist keine Ausnahme, wie ich vermutet hatte :-( – Josh

3

Ich denke @ David Hedlunds Antwort ist richtig, es muss eine Ausnahme passieren. Wenn ich Ereignishandler schreibe, verwende ich einen try...catch Block, um sicherzustellen, dass die Standardaktion nicht passiert. Versuchen Sie folgendes:

$('#ListSnapshot a').live('click', function(e){ 
    try { 
     var url = $(this).attr('href') +' #WebPartWPQ2 .ms-listviewtable'; 
     $('#ListSnapshot').load(url); 
    } catch(ex) { 
     alert('An error occurred and I need to write some code to handle this!'); 
    } 
    e.preventDefault(); 
}); 

auf diese Weise, da e.preventDefault(); außerhalb des try Block ist, selbst wenn ein Fehler auftritt, e.preventDefault(); wird noch genannt werden.

8

Ich glaube, Sie die folgende scenerio mindestens ... haben können, dies den Fehler reproduziert

Sie ein Ereignis höherer kann bis das Setup für das Hover-Ereignis ist, kann dieses Ereignis mit bind sein, und Selbst wenn du e.preventdefault aufruft, ruft es immer noch zuerst die Bindung auf, also musst du möglicherweise die höhere Bindung live verwenden anstatt sie zu binden. dann sollte es wie erwartet funktionieren. Überprüfen Sie dieses Beispiel.

http://jsfiddle.net/rodmjay/mnkq3/

$('div').bind ('click', function(){ // <-- switch this to live and you will see different behavior 

    alert('div click'); 

}); 

$('a').live('click', function(e){ 


    alert('a click'); 

    e.stopImmediatePropagation(); 


}); 
+1

Dies kann geschehen, um Link für Rails zu löschen, da Rails Ereignisse hinzufügen wird, denen Sie möglicherweise nicht bewusst sind. – lulalala

3

Haben Sie versucht, zuerst die Event-Handler in $ (document) .ready (...) Wickeln? Nur ein Gedanke.

2

e.preventDefault() sollte vor den anderen Codezeilen im Handler ausgeführt werden.

+0

Ja, das hat es für mich beim Testen behoben Das iPhone 6S Plus. Danke! – mattauckland

0

Alte Frage, aber das ist nur die Art von Moment sollte sehen, was Firebug meldet sich in der Konsole oder kehrt als Fehler zurück. Etwas in Ihrem Code verhindert offensichtlich, dass preventDefault() eine Weiterleitung verhindert.

22

Ich hatte ein ähnliches Problem, in dem e.preventDefault() würde in einigen Fällen funktionieren, aber nicht in anderen. Es zeigte keine Fehler und try-catch wurde nicht catch alert angezeigt. Hinzufügen e.stopImmediatePropagation() tat den Trick, falls es jemand hilft (großes Dank an wcpro)

+0

danke. Ihre Lösung funktionierte wie ein Charme. Nochmals vielen Dank :) – Vidhi

Verwandte Themen