2017-02-28 4 views
1

Ich wollte nur ein kurzes Userscript erstellen, um zu verhindern, dass Webseiten Links in neuen Tabs öffnen, so dass ich wählen kann, wann dies geschieht. Oh Junge.Event.PreventDefault() funktioniert nicht immer

Ich wollte plain Javascript verwenden; Ich denke, es reicht für so eine leichte Aufgabe. Ich habe alle meine Tests in Quora gemacht, weil ich beschlossen habe, diesen kleinen Code zu schreiben.

Nun, nichts hat funktioniert. Ich fing einfach an und erhöhte die Verrücktheit meines Codes angesichts des Fehlers: der Link öffnete sich egal wieviele preventDefault() 's, geben falsche zurück, verhindern [*] Propagation(), eventListeners ... Sogar ändernd das dom, um das Element a von seinem Ziel zu entfernen = "_ blank".

Am Ende biss ich meine Zunge und versuchte jQuery mit diesem kleinen Schnipsel:

$("a").click(function(event){ 
     event.preventDefault(); 
     alert("Was preventDefault() called: " + event.isDefaultPrevented()); 
    }); 

Aber das etwas Gutes entweder nicht tat. Also habe ich aufgegeben. Ich erkannte dann, dass der Code auf anderen Websites zu funktionieren schien. Außer auf Quora.com. Eine regelmäßige Quoren Link sieht wie folgt aus:

<a href="http://thewebsite.to/go" 
    rel="noopener nofollow" 
    target="_blank" 
    onclick="return Q.openUrl(this);" 
    class="external_link" 
    data-qt-tooltip="thewebsite.to" 
    data-tooltip="attached"> 
    Link text 
</a> 

Es gibt viel Mist da, sicher, aber ich habe nach unten worden Strippen Attribute so oft, bis die blanken Knochen: <a href="http://thewebsite.to/go"></a> und immer noch nicht funktioniert. Das Beste von allem ist, dass, obwohl der Link öffnet, event.isDefaultPrevented() wahr zurückgibt!

Warum passiert das und wie kann ich es beheben?

+0

Das hat eine Inline-Event-Handler. Wird das dynamisch erstellt? – Jai

+0

Es ist wahrscheinlich, warum? –

Antwort

0

Sie sind sicher, dass Links ausgewählt werden? Vielleicht Hilfe:

$(document).on('click', 'a', function(e) { 
    e.preventDefault(); 
}); 
+0

$ (Dokument) .on ('klicken', 'a', Funktion (e) {ist spezifischer und schneller. –

+0

@ A.T. Ich habe es geändert – Sojtin

0

Das Problem ist die Onclick Definition im einem Tag. Es erstellt einen neuen On-Click-Ereignis-Listener, bevor der Code etwas tut.

Um es zu verhindern, dass Sie diese vorherige Frage mit dem Ereignis um, sehen müssen spielen, um: How to order events bound with jQuery

Verwandte Themen