2012-06-19 3 views
15

Wenn ich einen Klick mit jquery initiiere, der window.open() tut, wird es durch Pop-up-Blocker blockiert, wenn ich den Klick manuell mache, wird das Fenster nicht blockiert. Wie unterscheidet sich der Browser zwischen den beiden?Wie unterscheidet der Browser den Unterschied zwischen Benutzerklick und programmatischem Klick?

+1

Hier ist ein [jsfiddle] (http://jsfiddle.net/twMSG/1/) zu demonstrieren. Es wird versuchen, beim Laden der Seite zu popup, aber blockiert werden. Wenn Sie das Click-Ereignis programmgesteuert aufrufen, wird es zwar blockiert, aber wenn Sie es innerhalb eines anderen Click-Ereignisses aufrufen, wird es ausgeführt. – sachleen

Antwort

6

Die Firefox Umsetzung dieser wird ausführlich auf this bug, diskutiert und this other bug hat einigen weiteren interessanten Hintergrund, einschließlich dem, was wird, um Längen Seiten geht durch ein unerwünschtes Popup-Fenster auf ahnungslosen Benutzern (in diesem Fall aufzuzuzwingen: Aufruf window.open() aus in einem Bild load Ereignis). Wenn Sie in der Umgebung von Bugzilla suchen, werden Sie feststellen, dass die Mozilla-Benutzer einige Jahre gebraucht haben, um alles richtig zu machen, zum Beispiel here's a bug from 2001.

So wie es zur Zeit arbeitet, ist dies: Wenn Firefox ein Click-Ereignis von dem Betriebssystem erhält, für eine gewisse Zeit window.open() ist in JavaScript (suchen Sie nach dom.disable_open_click_delay in about:config) aktiviert. Wenn Sie das click()-Ereignis von Code aufrufen, ohne dass ein Benutzerklick auftritt, dann wird der erste Schritt, die Aktivierung von window.open(), niemals ausgeführt, obwohl der Aufruf an window.open() selbst erfolgreich sein wird to stop sites detecting that you have popup blocking enabled.

Ich bin nicht sicher, wie andere Browser dieses Zeug implementieren, aber es wäre überraschend für mich, wenn es viel anders wäre.

1

Ich glaube, dass Aufruf click über jQuery tatsächlich nicht wirklich einen Klick auf das Element auslöst, sondern ruft stattdessen die Funktion auf den Klick zu hören. Also, obwohl Sie click() anrufen, rufen Sie eigentlich nur eine Funktion auf.

Wenn der Benutzer klickt, ist es ein echter Klick.

Beispiel:

var handler = function() { 
    alert('hi'); 
}; 

$('#example').on('click', handler); 
$('#example').click(); // really just calls handler(); 
+0

Gilt das auch für das native Javascript .click()? – nbrooks

+1

Interessant zu beachten: Wenn Sie als Benutzer alles tun, was dazu führt, dass der Klickcode ausgeführt wird, tut es das immer noch. Dazu gehört auch das Klicken auf etwas, das das Click-Ereignis aufruft. Oder sogar ein Pressetermin kann es nennen und es wird funktionieren. – sachleen

+0

Es ist schwer vorherzusagen, wie der Browser diese Prüfung implementiert, da in der Spezifikation nichts zu bestimmen ist, wann der Benutzer dazu aufgefordert werden sollte. http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-2651361 – Fenton

0

der nativen Code des Browsers übernimmt das eigentliche Klick-Ereignis Maus (vom Betriebssystem) und erstellt das Browser-Ereignisobjekt. An diesem Punkt im nativen Code des Browsers weiß der Browser, dass dieses Ereignis durch einen echten Mausklick erstellt wurde.

Meine Vermutung wäre, dass es einige versteckte Daten (nicht zugänglich von Javascript) an das Ereignis angehängt, die den Browser verfolgen, ob das Ereignis über einen echten Mausklick initiiert wurde oder nicht, obwohl es andere Implementierungsmechanismen könnte auch.

Verwandte Themen