Klick in Iframe mit JavaScript erkennen

Lesezeit: 10 Minuten

Klick in Iframe mit JavaScript erkennen
Russ Bradberry

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

Klick in Iframe mit JavaScript erkennen
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 });
<div id="message"></div>
<iframe width="50%" height="300" src="https://example.com"></iframe>

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:

<div class="banner" bannerid='yyy'>
    <iframe src="http://somedomain.com/whatever.html"></iframe>
<div>

damit:

$(document).ready( function() {
    var overiFrame = -1;
    $('iframe').hover( function() {
        overiFrame = $(this).closest('.banner').attr('bannerid');
    }, function() {
        overiFrame = -1
    });

… 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);

Hier kannst du es testen: http://jsfiddle.net/oqjgzsm0/

  • 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.

1646524512 545 Klick in Iframe mit JavaScript erkennen
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


1646524513 247 Klick in Iframe mit JavaScript erkennen
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!

Weiß noch nicht, ob es idiotensicher ist

window.addEventListener('blur',function(){
      if(document.activeElement.id == 'CrossDomainiframeId'){
        //do something :-)
      }
});

Viel Spaß beim Codieren

  • 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


1646524513 317 Klick in Iframe mit JavaScript erkennen
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)
        }
    });
});

950940cookie-checkKlick in Iframe mit JavaScript erkennen

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy