2011-12-09 14 views
8

Estoy tratando de escribir un script de navegador cruzado que detecta cuando se hace clic en un enlace de una página (enlace de texto, imagen u otro) para que pueda mostrar un mensaje o anuncio (como un intersticial) y luego dirigir el visitante a la url de destino originalmente seleccionada.¿Cómo detectar Clics de enlace (texto, imágenes, etc.) con Javascript?

La secuencia de comandos tiene que funcionar desde sitios de terceros (donde el propietario instala las etiquetas de secuencia de comandos en su sitio).

¿Cómo puedo lograr esto usando javascript?

¿Utilizo un detector de eventos? ¿Repito a través de todos los objetos de enlace? ¿O algo más?

Mis habilidades de JavaScript son nuevas/intermedias entonces los ejemplos detallados/las explicaciones son muy apreciados.

he empezado a basar el detector de eventos aquí, pero hasta ahora estoy detectar todos los clics en la página: addEventListener Code Snippet Translation and Usage for cross-browser detectioin

voy a considerar una alternativa jQuery, pero simplemente no saben cómo funcionará en un sitio de terceros si ese sitio no tiene la biblioteca de JQuery.

Gracias todos.

+1

Una cosa con la que probablemente tendrá que lidiar eventualmente es que algunos sitios tendrán sus propios manejadores para los clics de enlace, y será difícil/imposible asegurarse de que se llame primero a su controlador. – Pointy

+0

@Pointy - Este es un buen punto ... ni siquiera lo consideré. Tendré que señalar las advertencias y advertencias típicas a cualquiera que use mi código. –

Respuesta

5

pensé que iba a tratar un no jQuery (y una solución que no es de otra biblioteca, solo para ... bueno, rellenar g unos pocos minutos):

function clickOrigin(e){ 
    var target = e.target; 
    var tag = []; 
    tag.tagType = target.tagName.toLowerCase(); 
    tag.tagClass = target.className.split(' '); 
    tag.id = target.id; 
    tag.parent = target.parentNode; 

    return tag; 
} 

var tagsToIdentify = ['img','a']; 

document.body.onclick = function(e){ 
    elem = clickOrigin(e); 

    for (i=0;i<tagsToIdentify.length;i++){ 
     if (elem.tagType == tagsToIdentify[i]){ 
      console.log('You\'ve clicked a monitored tag (' + elem.tagType + ', in this case).'); 
      return false; // or do something else. 
     } 
    } 
}; 

JS Fiddle demo.

Modificado lo anterior, para detectar img elementos anidados dentro de un elemento a (que yo creo es lo que está queriendo haber releer su pregunta):

function clickOrigin(e){ 
    var target = e.target; 
    var tag = []; 
    tag.tagType = target.tagName.toLowerCase(); 
    tag.tagClass = target.className.split(' '); 
    tag.id = target.id; 
    tag.parent = target.parentNode.tagName.toLowerCase(); 

    return tag; 
} 

var tagsToIdentify = ['img','a']; 

document.body.onclick = function(e){ 
    elem = clickOrigin(e); 

    for (i=0;i<tagsToIdentify.length;i++){ 
     if (elem.tagType == tagsToIdentify[i] && elem.parent == 'a'){ 
      console.log('You\'ve clicked a monitored tag (' + elem.tagType + ', in this case and one inside an "a" element, no less!).'); 
      return false; // or do something else. 
     } 
     else if (elem.tagType == tagsToIdentify[i]){ 
      console.log('You\'ve clicked a monitored tag (' + elem.tagType + ', in this case).'); 
      return false; // or do something else. 
     } 
    } 
}; 

JS Fiddle demo.

+0

+1 - realmente genial, pero ¿por qué 'var tag = [];' en lugar de ' var tag = {}; '? ¿No es malo poner propiedades dinámicas en una matriz? –

+0

También para IE es probable que desee comprobar 'e.srcElement' si no hay ninguna propiedad de" destino "en el evento. – Pointy

+0

@AdamRackis, es posible, pero no lo sabía hasta tu comentario (aprendí JavaScript por accidente, a través de jQuery ... así que puedo usarlo (¡felizmente!), Pero no necesariamente "bien"). –

7

Para llamar a una función cada vez que un enlace de forma dinámica añadió o no se ha hecho clic, utilice on()

$(document).on("click", "a", function() { 
    //this == the link that was clicked 
    var href = $(this).attr("href"); 
    alert("You're trying to go to " + href); 
}); 

Si está utilizando una versión anterior de jQuery, entonces se usaría delegate() (tenga en cuenta que la orden del selector y el tipo de evento se activa)

$(document).delegate("a", "click", function() { 
    //this == the link that was clicked 
    var href = $(this).attr("href"); 
    alert("You're trying to go to " + href); 
}); 
+0

Gracias por esto, no me di cuenta de que esto era una función. +1 – danludwig

+0

@olivehour - mi placer. –

+0

Lo recojo, ahora tengo que cambiar todas mis llamadas en vivo() ya que ahora está en desuso. ¡Maldito seas! – danludwig

0

utilizo este de esa manera que sólo afecta a las etiquetas con unos eslabones de ellos,

(function($){ 
$("a[href!='']").each(function(){ 
    $(this).click(function(){ 
    var href = $(this).attr("href") 
    }) 
}); 
})(jQuery); 

Pero en esta nota dices que quieres que la gente use esto en sitios web de terceros para que no tengan jQuery, por lo que es posible que necesites este control en la parte superior del archivo, pero luego deberás incluirlo después del uso el mismo código pero el registro para el objeto o un nombre de función

if(typeof(jQuery) == undefined){ 
    var head = docuent.getElementsByTagName('head')[0]; 
    var script = document.createElement("script"); 
    script.setAttribute("type", "text/javascript"); 
    script.setAttribute("src", "http://yourserver.url/jquery.js"); 
    head.appendChild(script); 
} 
+0

Martin, esa segunda parte es un buen código. Solo para referencia futura: después de agregar la etiqueta de script, ¿será necesario volver a cargar la página para ejecutar el resto del script? –

+0

Sí y no la página no necesita volver a cargarse una vez que la etiqueta de script que contiene ese código haya terminado cargará (descargue) su archivo jQuery –

0

Esto es más o menos cómo hacerlo sin uso de jQuery:

<html> 

    <head> 
      <script type="text/javascript"> 
      window.onload = function() { 
       var observed = document.getElementsByTagName('a'); 

       for (var i = 0; i < observed.length; i++) { 
       observed[i].addEventListener('click', function (e) { 
        var e=window.event||e; 

        alert('Clicked ' + e.srcElement.innerText); 

        if (e.preventDefault) { e.preventDefault() } else { e.returnValue=false } 
       }, false); 
       } 
      } 
      </script> 
    </head> 


    <body> 

      <a href="">foo</a> 
      <a href="">bar</a> 

    </body> 
</html> 
Cuestiones relacionadas