2009-10-22 2 views
42

Ich habe einen Iframe auf einer Seite, der von einer Drittpartei (einer Anzeige) stammt. Ich möchte ein Klickereignis auslösen, wenn dieser Iframe angeklickt wird (um einige interne Statistiken aufzunehmen). Etwas wie:So fügen Sie ein Click-Ereignis zu einem Iframe mit JQuery hinzu

$('#iframe_id').click(function() { 
    //run function that records clicks 
}); 

..based auf HTML-Code:

<iframe id="iframe_id" src="http://something.com"></iframe> 

Ich kann nicht scheinen, jede Variation dieser Arbeit zu bekommen. Gedanken?

Antwort

32

Es gibt kein ‚Onclick‘ Ereignis für ein iframe, aber Sie können versuchen, das Click-Ereignis des Dokuments in der iframe zu fangen:

document.getElementById("iframe_id").contentWindow.document.body.onclick = 
function() { 
    alert("iframe clicked"); 
} 

EDIT Obwohl dies nicht dein Kreuz löst Website Problem, FYI wurde jQuery aktualisiert, gut zu spielen mit iFrames:

$('#iframe_id').on('click', function(event) { }); 

aktualisieren 1/2015 T Der Link zur iframe-Erklärung wurde entfernt, da er nicht mehr verfügbar ist.

Hinweis Der obige Code funktioniert nicht, wenn der Iframe von einer anderen Domäne als der Host-Seite stammt. Sie können immer noch versuchen, die in Kommentaren erwähnten Hacks zu verwenden.

+2

Danke, das gut funktioniert, aber nur für Inhalte von meiner Domain. Wenn ich versuche, Inhalte von Drittanbietern aus einer anderen Domäne zu laden, wird das Klickereignis nicht ausgelöst. Ich habe einige andere Postings im Web erwähnt, die etwas Ähnliches erwähnen ... im Grunde können Sie mit Iframe-Inhalten spielen, aber nur wenn es Ihre eigenen sind. Ich würde mich definitiv nur mit Inhalten Dritter beschäftigen. Hmm, irgendwelche anderen Ideen? –

+6

Ja, eigentlich. Versuchen Sie, ein transparentes div über den iframe zu setzen (use position: absolute). Sie können dann Klicks auf dieses div fangen. Vergessen Sie nicht, sie an den iframe weiterzuleiten (funktioniert nur, wenn es sich um einen einfachen Iframe-Inhalt handelt - wenn er eine eigene gleichmäßige Handhabung enthält - verwenden Sie diese Methode nicht). –

+0

Nur zu aktualisieren: Ich habe die absolute Positionierung versucht, und alle Ereignisse wurden ignoriert, wenn es 3rd-Party-Inhalt im Iframe gab. Ich denke nicht, dass dies passieren wird, aber ich schätze die Tatsache sehr, dass Sie etwas Hilfe anbieten. –

13

Versuchen Sie, diese mit: iframeTracker jQuery Plugin, wie folgt aus:

jQuery(document).ready(function($){ 
    $('.iframe_wrap iframe').iframeTracker({ 
     blurCallback: function(){ 
      // Do something when iframe is clicked (like firing an XHR request) 
     } 
    }); 
}); 
+1

Die einzige Sache, die mir half, Klickereignis auf eingebettetem Youtube iframe zu fangen. Vielen Dank! –

+0

Yeap, es funktioniert gut. – Alliswell

+0

Super Plugin, funktioniert wie ein Charme! –

1

Keine der vorgeschlagenen Antworten für mich gearbeitet. Ich löste einen ähnlichen Fall die folgende Art und Weise:

<a href="http://my-target-url.com" id="iframe-wrapper"></a> 
<iframe id="iframe_id" src="http://something.com" allowtrancparency="yes" frameborder="o"></iframe> 

Die CSS (natürlich exakte Positionierung sollte entsprechend den App-Anforderungen ändern):

#iframe-wrapper, iframe#iframe_id { 
    width: 162px; 
    border: none; 
    height: 21px; 
    position: absolute; 
    top: 3px; 
    left: 398px; 
} 
#alerts-wrapper { 
    z-index: 1000; 
} 

Natürlich können Sie jetzt jeden Fall fangen auf der Iframe-Wrapper.

+1

Dies verhindert, dass alle Klicks im iframe registriert werden. –

+0

Sie haben Recht. Es wird alle Klicks auf das Iframe-Wrapper-Element leiten. Das funktioniert für mich, weil der iframe in meinem Fall keine interaktiven Elemente hat, sondern nur zur Anzeige. – ramigg

11

Ich habe versucht, eine bessere Antwort zu finden, die mehr Standalone war, also begann ich darüber nachzudenken, wie JQuery Ereignisse und benutzerdefinierte Ereignisse ausführt. Da es sich bei click (aus JQuery) nur um ein Ereignis handelt, dachte ich, dass ich nur das Ereignis auslösen müsste, da der Inhalt des iframes angeklickt wurde. So war meine Lösung

$(document).ready(function() { 
    $("iframe").each(function() { 
     //Using closures to capture each one 
     var iframe = $(this); 
     iframe.on("load", function() { //Make sure it is fully loaded 
      iframe.contents().click(function (event) { 
       iframe.trigger("click"); 
      }); 
     }); 

     iframe.click(function() { 
      //Handle what you need it to do 
     }); 
    }); 
}); 
+1

Das hat in Firefox funktioniert. Vielen Dank. –

+1

das ist so praktisch, danke :) –

+2

Es funktioniert nur, wenn der Frame Seite aus der gleichen Domäne enthält (nicht gleich Herkunft Policy verletzen) –

-1

für ppl interessant Dies kann unter Verwendung Primefaces (die CLEditor verwendet):

document.getElementById('form:somecontainer:editor') 
.getElementsByTagName('iframe')[0].contentWindow 
.document.onclick = function(){//do something} 

ich im Grunde nahm nur die Antwort von Reisen Tech Guy und geändert, um die Auswahl ein wenig ..;)

1

Sie können diesen Code verwenden, um auf ein Element zu klicken, das sich in iframe befindet.

jQuery('.class_in_iframe',jQuery('[id="id_of_iframe"]')[0].contentWindow.document.body).on('click',function(){ \t 
 
\t console.log("triggered !!") 
 
});

4

sehen:

var iframe = $('#your_iframe').contents(); 

iframe.find('your_clicable_item').click(function(event){ 
    console.log('work fine'); 
}); 
+0

Fügen Sie einige Erklärung mit der Antwort für diese Antwort helfen OP bei der aktuellen Problem beheben –

+0

ändern ' your_clicable_item 'mit' body 'und das ist die perfekte Antwort – geegee

+3

Es funktioniert nur, wenn der Frame Seite aus der gleichen Domäne enthält (nicht gegen die Richtlinie gleichen Ursprungs) –

-1

Lösung, die für mich arbeiten:

var editorInstance = CKEDITOR.instances[this.editorId]; 

      editorInstance.on('focus', function(e) { 

       console.log("tadaaa"); 

      }); 
Verwandte Themen