2011-08-03 12 views
11

Desafortunadamente, estoy trabajando con javascript de terceros, que inserta enlaces en mis páginas. En lugar de simplemente usar estos enlaces como están, quiero usar elementos proxy, que, cuando se hace clic, desencadenan el evento click en los enlaces de terceros.Desencadenar javascript en el atributo href con jQuery .click() (o similar)

Los enlaces 3rd Party Pack javascript en el atributo href, así:

<a id="horribleLink" href="javascript:doSomething()">Click me</a> 

Mi elemento de proxy es el siguiente:

<button rel="horribleLink" class="linkProxy">No, click me</button> 

y un poco de jQuery'd Javascript para vincularlos juntos:

$('button.linkProxy').click(function(){ 
    $('#' + $(this).attr('rel')).click(); 
}); 

Ahora, esto funciona perfectamente si el enlace de terceros es solo un enlace estándar ( <a id="horribleLink" href="http://www.google.com">Click</a>) o un onclick ligeramente menos horrible (<a href="#" id="horribleLink" onclick="doSomething()">Click</a>), pero cuando el javascript está dentro del atributo href, activar 'clic' no hace nada.

¿Alguien me puede decir por qué y si hay una solución razonable?

Actualizado Como dijo milimétrica, la causa principal parece ser que los navegadores impiden 'falsificar clics' de anclas - He quitado mi ejemplo 'eslabón estándar', ya que es otra situación que no funciona. El controlador onclick funciona, sin embargo, como era de esperar.

+0

desafortunado hecho ... –

+0

Para el inicio, se puede comprobar la sintaxis? 'onclick =" doSomething() 'debe ser' onclick = "doSomething()" ' – dugokontov

+0

No debería' href = "javascript: doSomething" 'be' href = "javascript: doSomething()" '? –

Respuesta

11

La respuesta aceptada aquí entra en un poco de profundidad en cuanto a "por qué está sucediendo esto": Can I call jquery click() to follow an <a> link if I haven't bound an event handler to it with bind or click already?. Básicamente, parece que no puedes hacer clic() en un enlace porque el navegador no admite el clic falso.

Una solución alternativa:

Si establece location.href para esos casos, funciona:

$('button.linkProxy').click(function(){ 
    location.href = $('#' + $(this).attr('rel')).attr('href'); 
}); 

violín de trabajo: http://jsfiddle.net/uv29x/3/

Dos trabajo en torno:

Puede obtener el href de esos enlaces y hacer un eval() en ellos, ¿verdad?

+0

Me doy cuenta de que esto es horrible en términos de seguridad, pero la configuración te obliga a hacerlo, creo. – Milimetric

+0

Esa es la solución que tengo en este momento: funciona bien, pero realmente me gustaría entender lo que está pasando, también. – Beejamin

+3

La respuesta aceptada aquí entra en un poco de profundidad: http://stackoverflow.com/questions/1694595/can-i-call-jquery-click-to-seguir -an-a-link-if-i-havent-bound-a-event-handl. Básicamente, parece que no puede hacer un 'click()' en un enlace porque el navegador no admite el clic falso. – Milimetric

-1

Si he entendido bien la pregunta, el problema es que tiene algo como esto:

<a href="javascript:alert('hello');" onclick="javascript:alert('clicked');">Test</a> 

Y usted afirma que cuando el javascript está en el href, el evento onclick no se dispara. ¿Correcto? Si es así, lo que estoy viendo es que ambos son despedidos, primero con un clic y luego con el javascript dentro de href.

+0

Este no es el problema en absoluto. El problema es que está intentando activar la acción 'href' desde otra función de JavaScript. –

+0

No, los enlaces con los que estoy trabajando no tienen onclick, solo javascript dentro del href. No se activa cuando el evento de clic se desencadena programáticamente. – Beejamin

+0

@Beejamin Veo a qué te refieres. – Icarus

4

Conjunto window.location al valor href.

$('button.linkProxy').click(function(){ 
    window.location = $('#'+$(this).attr('rel')).attr('href'); 
}); 

DEMO: http://jsfiddle.net/dmSUm/

+0

¡Un enfoque interesante! Puedo ver por qué funciona esto, pero me parece mucho peor que el método eval. – Beejamin

+0

@Beejamin: No sé qué método es mejor, prefiero evitar 'eval'. –

+1

* leve * enmienda para acomodar los tres tipos de enlaces: http://jsfiddle.net/dmSUm/2/ –

2

Acababa de terminar de escribir esto cuando vi la respuesta de milimétrica.Aquí está el código de todos modos por lo que vale la pena -

eval($('#horribleLink').attr('href').replace('javascript:','')); 
+0

Gracias - esto es a lo que recurrí antes de hacer la pregunta (probablemente debería haber mencionado). Espero que alguien sepa * por qué * también. – Beejamin

0

Utilice el método nativo Javascript click y usted se tiene un trabajo, haga clic!

$('button.linkProxy').click(function(){ 
    $('#' + $(this).attr('rel')).click()[0].click(); 
}); 

me quedé con el jQuery click suponiendo que Javascript click pasará por alto jQuery trigger s en cuyo caso usted querrá tener ambas cosas. De lo contrario, si estoy equivocado (que o no es necesario dar cuenta de trigger) se puede reducir a:

$('button.linkProxy').click(function(){ 
    $('#' + $(this).attr('rel'))[0].click(); 
}); 
Cuestiones relacionadas