Ich verstehe, dass es nicht möglich ist zu sagen, was der Benutzer in einem tut iframe wenn es domänenübergreifend ist. Was ich tun möchte, ist zu verfolgen, ob der Benutzer überhaupt darauf geklickt hat iframe. Ich stelle mir ein Szenario vor, in dem es ein Unsichtbares gibt div oben auf iframe und die div wird nur dann das Click-Ereignis an die übergeben iframe.
Ist so etwas möglich? Wenn ja, wie würde ich dann vorgehen? Die iframes sind Anzeigen, daher habe ich keine Kontrolle über die verwendeten Tags.
Es ist möglich und es gibt eine Crossbrowser-Lösung: stackoverflow.com/a/32138108/1064513
– Dmitri Kochin
21. August 2015 um 10:32 Uhr
Paul Tucher
Dies ist sicherlich möglich. Dies funktioniert in Chrome, Firefox und IE 11 (und wahrscheinlich anderen).
const message = document.getElementById("message");
// main document must be focused in order for window blur to fire when the iframe is interacted with.
// There's still an issue that if user interacts outside of the page and then click iframe first without clicking page, the following logic won't run. But since the OP is only concerned about first click this shouldn't be a problem.
window.focus()
window.addEventListener("blur", () => {
setTimeout(() => {
if (document.activeElement.tagName === "IFRAME") {
message.textContent = "clicked " + Date.now();
console.log("clicked");
}
});
}, { once: true });
Achtung: Dies erkennt nur den ersten Klick. Soweit ich weiß, ist das alles, was Sie wollen.
@the_joric, das liegt daran, dass es 4 Jahre nach der Frage war und die Leute normalerweise nicht über die ersten paar Antworten hinaus scrollen.
– Paul Tucher
30. März 2015 um 18:32 Uhr
Beachten Sie auch, dass beim Wechseln der Browser-Registerkarten der Fokus ();
– Linnay
31. März 2015 um 4:31 Uhr
Es funktioniert NICHT in Firefox. JSFiddle enthält Fehler, die dies verbergen: = statt ===. Es gibt eine Crossbrowser-Lösung (sogar in IE8): stackoverflow.com/a/32138108/1064513
– Dmitri Kochin
21. August 2015 um 10:34 Uhr
Das Unschärfeereignis wird nicht ausgelöst, wenn der Benutzer nicht zuerst in das Hauptdokument klickt! Dies ist auch nicht zum Erkennen von Klicks auf mehrere Iframes geeignet, da kein Ereignis ausgelöst wird, wenn der Fokus von einem Iframe zu einem anderen wechselt (iframe’s blur Ereignis wird nicht ausgelöst).
– Tomáš Kafka
17. Februar 2016 um 15:43 Uhr
warum gibt es eine Abhängigkeit von focus();
– Prasad Shinde
21. Dezember 2018 um 12:08 Uhr
Basierend auf der Antwort von Mohammed Radwan habe ich mir die folgende jQuery-Lösung ausgedacht. Im Grunde verfolgt es, was iFrame-Leute schweben. Wenn das Fenster dann unscharf wird, bedeutet dies höchstwahrscheinlich, dass der Benutzer auf das Iframe-Banner geklickt hat.
Der Iframe sollte in ein div mit einer ID eingefügt werden, um sicherzustellen, dass Sie wissen, auf welchen Iframe der Benutzer geklickt hat:
… dies hält overiFrame auf -1, wenn keine iFrames bewegt werden, oder die ‘bannerid’, die im Wrapping-Div gesetzt ist, wenn ein iframe bewegt wird. Alles, was Sie tun müssen, ist zu prüfen, ob ‘overiFrame’ gesetzt ist, wenn das Fenster unscharf wird, etwa so: …
$(window).blur( function() {
if( overiFrame != -1 )
$.post('log.php', {id:overiFrame}); /* example, do your stats here */
});
});
Sehr elegante Lösung mit einem kleinen Nachteil: Wenn ein Benutzer ALT-F4 drückt, während er mit der Maus über einen iFrame fährt, wird dies als Klick protokolliert. Dies geschah jedoch nur in FireFox, IE, Chrome und Safari haben es nicht registriert.
Nochmals vielen Dank Mohammed, sehr nützliche Lösung!
Ich habe dieser Antwort +1 gegeben, obwohl sie die folgenden Probleme hat: 1. Wenn mehrere Iframes vorhanden sind, klicken Sie auf einen davon und dann sofort auf einen anderen – der zweite Klick wird nicht erkannt. 2. Mehrfachklicks innerhalb eines Iframes werden ebenfalls nicht gezählt. 3. Funktioniert auf Mobilgeräten nicht richtig, da Sie mit dem Finger kein „Hover“-Ereignis ausführen können.
– Sych
28. April 2015 um 9:53 Uhr
Das obige Skript wird von mir verwendet, um Klicks von meiner Website weg zu erkennen. Die meisten Werbenetzwerke liefern jetzt Banner in Frames. Wenn Sie auf einen und dann schnell auf einen anderen klicken, bevor Sie mit dem ersten Klick aufgehört haben, möchte ich technisch gesehen wissen, mit welchem letzten Klick Sie tatsächlich aufgehört haben. Also in meinem Fall ist es gewolltes Verhalten. Es erkennt auch Klicks auf mobile Banner. Der Hover muss also unmittelbar vor der Ausführung des Klicks gestartet werden
– Patrick
28. April 2015 um 22:20 Uhr
Funktioniert nicht bei SVG-Elementen in Iframe-Inhalten 🙁 stackoverflow.com/questions/32589735/…
– Serhiy
15. September 2015 um 18:18 Uhr
Diese Antwort ist die beste von ihnen, wenn Sie jedoch jeden Klick in den Iframe erhalten möchten, Sie müssen den Fokus daraus nehmen, sobald der Benutzer geklickt hat um weitere Klicks zu überwachen. Dies sollte dem Abschnitt $(window).blur() hinzugefügt werden: setTimeout(function(){ window.focus(); }, 0);. Jetzt klickt der Benutzer, setzt den Fokus in den Iframe, das Skript zieht diesen Fokus zurück und kann nun weitere Fokusänderungen durch zukünftige Klicks überwachen.
– Helfende Hand
6. September 2016 um 15:49 Uhr
@HelpingHand würde der Benutzer den Fokus im Iframe verlieren. Stellen Sie sich vor, wenn der Benutzer eine Eingabe im Iframe fokussiert, würde die Methode ihn den Fokus verlieren lassen. oderz….
– xianshenglu
12. November 2020 um 1:48 Uhr
Dies ist eine kleine Lösung, die in allen Browsern funktioniert, sogar in IE8:
var monitor = setInterval(function(){
var elem = document.activeElement;
if(elem && elem.tagName == 'IFRAME'){
clearInterval(monitor);
alert('clicked!');
}
}, 100);
Was ist, wenn Sie mehrere Iframes haben und deren ID nicht kennen?
– Shankshera
28. August 2015 um 8:15 Uhr
einzige browserübergreifende zuverlässige Lösung, die auch in der neuesten FF funktioniert! Vielen Dank. Es verdient mehr Upvotes
– BrainOverflow
12. Oktober 2015 um 11:33 Uhr
@shankshera Holen Sie sich einfach elem.id, das ist Ihre Iframe-ID :). Sehen jsfiddle.net/oqjgzsm0/219
– Tomáš Kafka
17. Februar 2016 um 15:35 Uhr
Ich verwende dies, um Klicks auf Social-Like-Buttons zu verfolgen. Aber da 3/4 der von mir verwendeten Iframes verwenden, muss ich Klicks in mehreren Iframes nachverfolgen. Ich habe die Geige aktualisiert, um dies zu ermöglichen: jsfiddle.net/oqjgzsm0/273. Es legt ein neues Intervall fest, das überprüft, ob ein Klick außerhalb des zuletzt angeklickten Iframes liegt. Setzt dann das ursprüngliche Intervall zurück, um erneut nach Klicks zu suchen. Es verfolgt nicht mehrere Klicks im selben Iframe ohne einen Klick außerhalb davon.
– bruxhaha
7. April 2016 um 19:07 Uhr
Abgesehen von der Tatsache, dass die Verwendung eines Intervalls mit kontinuierlicher Schleife bei einer solchen Rate keine sehr gute Idee ist, werden dadurch Fehlalarme erkannt, wenn der Benutzer den Fokus auf den Iframe durch die Navigation mit der Tabulatortaste legt
– Kaiido
23. April 2016 um 10:43 Uhr
Ist so etwas möglich?
Nein. Alles, was Sie tun können, ist zu erkennen, dass die Maus in den Iframe geht und möglicherweise (wenn auch nicht zuverlässig), wenn sie wieder herauskommt (d. h. versuchen, den Unterschied zwischen dem Mauszeiger, der auf seinem Weg an eine andere Stelle über die Anzeige fährt, und dem Verweilen herauszufinden auf der Anzeige).
Ich stelle mir ein Szenario vor, in dem sich ein unsichtbares Div über dem Iframe befindet und das Div das Click-Ereignis einfach an den Iframe weitergibt.
Nein, es gibt keine Möglichkeit, ein Klickereignis zu fälschen.
Indem Sie das Mousedown abfangen, würden Sie verhindern, dass der ursprüngliche Klick zum Iframe gelangt. Wenn Sie feststellen könnten, wann die Maustaste gedrückt werden sollte, könnten Sie versuchen, das unsichtbare Div aus dem Weg zu räumen, damit der Klick durchgeht … aber es gibt auch kein Ereignis, das kurz vor einem Mousedown ausgelöst wird.
Sie könnten versuchen zu erraten, indem Sie zum Beispiel nachsehen, ob der Zeiger zur Ruhe gekommen ist, und vermuten, dass ein Klick kurz bevorsteht. Aber es ist völlig unzuverlässig, und wenn Sie versagen, haben Sie nur einen Klick verloren.
Mohammed Radwan
Der folgende Code zeigt Ihnen, ob der Benutzer auf den Iframe klickt/schwebt oder sich aus ihm herausbewegt:-
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Detect IFrame Clicks</title>
<script type="text/javascript">
$(document).ready(function() {
var isOverIFrame = false;
function processMouseOut() {
log("IFrame mouse >> OUT << detected.");
isOverIFrame = false;
top.focus();
}
function processMouseOver() {
log("IFrame mouse >> OVER << detected.");
isOverIFrame = true;
}
function processIFrameClick() {
if(isOverIFrame) {
// replace with your function
log("IFrame >> CLICK << detected. ");
}
}
function log(message) {
var console = document.getElementById("console");
var text = console.value;
text = text + message + "\n";
console.value = text;
}
function attachOnloadEvent(func, obj) {
if(typeof window.addEventListener != 'undefined') {
window.addEventListener('load', func, false);
} else if (typeof document.addEventListener != 'undefined') {
document.addEventListener('load', func, false);
} else if (typeof window.attachEvent != 'undefined') {
window.attachEvent('onload', func);
} else {
if (typeof window.onload == 'function') {
var oldonload = onload;
window.onload = function() {
oldonload();
func();
};
} else {
window.onload = func;
}
}
}
function init() {
var element = document.getElementsByTagName("iframe");
for (var i=0; i<element.length; i++) {
element[i].onmouseover = processMouseOver;
element[i].onmouseout = processMouseOut;
}
if (typeof window.attachEvent != 'undefined') {
top.attachEvent('onblur', processIFrameClick);
}
else if (typeof window.addEventListener != 'undefined') {
top.addEventListener('blur', processIFrameClick, false);
}
}
attachOnloadEvent(init);
});
</script>
</head>
<body>
<iframe src="www.google.com" width="100%" height="1300px"></iframe>
<br></br>
<br></br>
<form name="form" id="form" action=""><textarea name="console"
id="console" style="width: 100%; height: 300px;" cols="" rows=""></textarea>
<button name="clear" id="clear" type="reset">Clear</button>
</form>
</body>
</html>
Sie müssen den src im Iframe durch Ihren eigenen Link ersetzen. Hoffe das hilft. Grüße, Mo.
Basierend auf schnellen Tests scheint das angegebene Beispiel (nach dem Korrigieren der URL) im IE 8 zu funktionieren, einigermaßen zuverlässig in Chrome 14.0.835.186 m, aber überhaupt nicht in Firefox 6.0.2.
– Matthäus Flaschen
23. September 2011 um 23:54 Uhr
Funktioniert gut für Chrome, aber nicht für Firefox v62, denn wenn Sie auf iframe klicken verwischen Ereignis wird nicht ausgelöst
– schlapp
2. Oktober 2018 um 11:27 Uhr
Toni
Ich habe gerade diese Lösung gefunden … Ich habe es versucht, ich habe es geliebt …
Funktioniert für domänenübergreifende iFrames für Desktop und Mobilgeräte!
Basierend auf schnellen Tests scheint das angegebene Beispiel (nach dem Korrigieren der URL) im IE 8 zu funktionieren, einigermaßen zuverlässig in Chrome 14.0.835.186 m, aber überhaupt nicht in Firefox 6.0.2.
– Matthäus Flaschen
23. September 2011 um 23:54 Uhr
Funktioniert gut für Chrome, aber nicht für Firefox v62, denn wenn Sie auf iframe klicken verwischen Ereignis wird nicht ausgelöst
– schlapp
2. Oktober 2018 um 11:27 Uhr
Vince
Sie können dies erreichen, indem Sie das Blur-Ereignis für das Fensterelement verwenden.
Hier ist ein jQuery-Plugin zum Verfolgen von Klicks auf Iframes (es löst eine benutzerdefinierte Callback-Funktion aus, wenn auf ein Iframe geklickt wird): https://github.com/finalclap/iframeTracker-jquery
Verwenden Sie es wie folgt:
jQuery(document).ready(function($){
$('.iframe_wrap iframe').iframeTracker({
blurCallback: function(){
// Do something when iframe is clicked (like firing an XHR request)
}
});
});
9509400cookie-checkKlick in Iframe mit JavaScript erkennenyes
Es ist möglich und es gibt eine Crossbrowser-Lösung: stackoverflow.com/a/32138108/1064513
– Dmitri Kochin
21. August 2015 um 10:32 Uhr