2009-10-22 16 views
42

Tengo un iframe en una página, procedente de un tercero (un anuncio). Me gustaría lanzar un evento de clic cuando se haga clic en ese iframe (para registrar algunas estadísticas internas). Algo así como:Cómo agregar un evento de clic a un iframe con JQuery

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

..based en HTML de:

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

Me parece que no puede conseguir cualquier variación de que esto funcione. ¿Pensamientos?

Respuesta

32

No hay 'onclick' caso de un iframe, pero se puede tratar de atrapar el evento click del documento en el iframe:

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

EDITAR Aunque esto no resuelve su cruz problema con el sitio, para tu información jQuery se ha actualizado para jugar bien con iFrames:

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

actualización 1/2015 T El enlace a la explicación del iframe se ha eliminado porque ya no está disponible.

Nota El código anterior no funcionará si el iframe pertenece a un dominio diferente de la página de host. Aún puedes intentar usar hacks mencionados en los comentarios.

+2

Gracias, esto funciona muy bien, pero sólo por el contenido de mi dominio. Si intento cargar contenido de terceros desde otro dominio, el evento click no se activa. Me encontré con otras publicaciones en la web mencionando algo similar ... básicamente, puedes jugar con contenido de iframe, pero solo si es tuyo. Definitivamente estaría lidiando solo con contenido de terceros. Hmm, ¿alguna otra idea? –

+6

Sí, en realidad. Intenta colocar un div transparente encima del iframe (usa la posición: absoluta). A continuación, puede capturar clics en ese div. No olvide pasarlos al iframe (funciona solo si se trata de un contenido de iframe simple; si contiene un manejo propio e imparcial), no use este método). –

+0

Solo para actualizar: he intentado el posicionamiento absoluto, y todos los eventos fueron ignorados si había contenido de terceros en el iframe. No creo que esto vaya a suceder, pero agradezco mucho el hecho de que hayas ofrecido algo de ayuda. –

13

Pruebe con esto: iframeTracker jQuery Plugin, así:

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

Lo único que me ayudó a detectar el evento click en el iframe de Youtube incorporado. ¡Gracias! –

+0

Yeap, funciona bien. – Alliswell

+0

Awesome Plugin, funciona como un encanto! –

1

Ninguna de las respuestas sugeridas trabajó para mí. He resuelto un caso similar de la siguiente manera:

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

El css (posicionamiento del curso exacto debe cambiar de acuerdo a los requerimientos de aplicaciones):

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

Por supuesto, ahora se puede coger cualquier caso en el iframe-wrapper.

+1

Esto evitará que todos los clics se registren en el iframe. –

+0

Tienes razón. Dirigirá todos los clics al elemento iframe-wrapper. Esto funciona para mí porque en mi caso el iframe no tiene elementos interactivos, lo necesito solo para mostrarlo. – ramigg

11

Estaba tratando de encontrar una mejor respuesta que fuera más independiente, así que comencé a pensar en cómo JQuery realiza eventos y eventos personalizados. Como el clic (de JQuery) es cualquier evento, pensé que todo lo que tenía que hacer era desencadenar el evento dado que se había hecho clic en el contenido del iframe. Por lo tanto, este fue mi solución

$(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

Eso funcionó en Firefox. Gracias. –

+1

esto es tan práctico, gracias :) –

+2

Funciona solo si el marco contiene páginas del mismo dominio (no infringe la política del mismo origen) –

-1

Esto puede ser interesante para PPL utilizando Primefaces (que utiliza CLEditor):

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

Yo, básicamente, acaba de tomar la respuesta de viajar individuo de la tecnología y ha cambiado la selección un poco ...;)

1

Puede usar este código para enlazar haga clic en un elemento que está en el iframe.

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

4

ver esto:

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

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

Agregue algunas explicaciones con la respuesta de cómo esta respuesta ayuda OP en la edición actual problema –

+0

change ' your_clicable_item 'with' body 'y esta es la respuesta perfecta – geegee

+3

Funciona solo si el marco contiene páginas del mismo dominio (no infringe la política de origen) –

-1

solución que funciona para mí:

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

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

       console.log("tadaaa"); 

      }); 
Cuestiones relacionadas