2010-01-25 10 views
10

¿cómo puedo interceptar los clics del enlace en el documento? debe ser multiplataforma.use javascript para interceptar todos los clics en el enlace del documento

Estoy buscando algo como esto:

// content is a div with innerHTML 
var content = document.getElementById("ControlPanelContent"); 

content.addEventListener("click", ContentClick, false); 

function ContentClick(event) { 

    if(event.href == "http://oldurl") 
    { 
    event.href = "http://newurl"; 
    } 
} 

Gracias de antemano por la ayuda.

Respuesta

18
for (var ls = document.links, numLinks = ls.length, i=0; i<numLinks; i++){ 
    ls[i].href= "...torture puppies here..."; 
} 

alternativamente si solo quiere interceptar, no cambiar, agregue un controlador onclick. Esto se llamará antes de navegar a la url:

var handler = function(){ 
    ...torment kittens here... 
} 
for (var ls = document.links, numLinks = ls.length, i=0; i<numLinks; i++){ 
    ls[i].onclick= handler; 
} 

Tenga en cuenta que también contiene document.linksAREA elementos con un atributo href - no sólo A elementos.

2

Acabo de descubrir esto y puede ayudar a algunas personas. Además de la interceptación, si desea deshabilitar el enlace para cargar otra página o volver a cargar la página actual. Simplemente configure el href en '#' (como en el prefijo de la página ref interna). Ahora puede usar el enlace para llamar a una función mientras permanece en la misma página.

+2

Actualización: Esta no es la mejor manera. Usar 'href =" javascript: void (0) "' a menudo es mejor ya que no obliga a la página a recargarse. [más aquí] (http://stackoverflow.com/questions/134845/href-attribute-for-javascript-links-or-javascriptvoid0) – worldsayshi

+1

Tenga en cuenta que estas dos formas evitan que los usuarios utilicen las acciones de clic derecho en los enlaces (abrir en una nueva pestaña, etc.) –

9

¿Qué pasa con el caso en el que se generan los enlaces mientras se usa la página? Esto ocurre con frecuencia con los marcos frontales más complejos de hoy en día.

La solución adecuada sería probablemente poner el detector de eventos click en el documento. Esto se debe a que los eventos en los elementos se propagan a sus padres y porque el padre superior actúa sobre un enlace.

Esto funcionará para todos los enlaces, ya sean cargados con la página, o generados dinámicamente en el front end en cualquier momento.

function interceptClickEvent(e) { 
    var href; 
    var target = e.target || e.srcElement; 
    if (target.tagName === 'A') { 
     href = target.getAttribute('href'); 

     //put your logic here... 
     if (true) { 

      //tell the browser not to respond to the link click 
      e.preventDefault(); 
     } 
    } 
} 


//listen for link click events at the document level 
if (document.addEventListener) { 
    document.addEventListener('click', interceptClickEvent); 
} else if (document.attachEvent) { 
    document.attachEvent('onclick', interceptClickEvent); 
} 
Cuestiones relacionadas