2011-12-23 42 views
81

tengo enlaces de esta manera:preventDefault dentro atributo onclick de una etiqueta

<a href="#" onclick="myfunc({a:1, b:'hi'})" />click</a> 
<a href="#" onclick="myfunc({a:3, b:'jo'})" />click</a> 

y me gustaría hacer un preventDefault() dentro myfunc, porque un # se añadirá en la barra de direcciones cuando se hace clic en el enlace (sin hacer return false; o href='javascript:void(0);')

¿Esto es posible? puedo obtener el evento dentro de myfunc

+6

¿Qué pasa con el resultado falso? – Alex

+5

detiene la propagación también – Omu

+4

'return false' solo detiene la propagación dentro de jQuery. – cruzanmo

Respuesta

112

Creo que se puede pasar en event a la función en línea que será el objeto event para el caso planteado en los navegadores compatibles con el W3C (es decir, versiones antiguas de IE aún requerirá la detección en el interior de su función de controlador de eventos para mirar window.event).

A quick example.

function sayHi(e) { 
 
    e.preventDefault(); 
 
    alert("hi"); 
 
}
<a href="http://google.co.uk" onclick="sayHi(event);">Click to say Hi</a>

  1. Ejecutar como es y observe que el enlace no hace redirección a Google después de la alerta.
  2. Luego, cambie event pasado al controlador onclick a otra cosa como e, haga clic en ejecutar, luego observe que la redirección tiene lugar después de la alerta (el panel de resultados se pone blanco, lo que demuestra una redirección).
+5

ok, veo que todo lo que tenía que hacer era poner mi parámetro en el segundo 'myfunc (event, {a: 123, b:" asdas "})' – Omu

+1

@ChuckNorris - sí, eso es correcto. –

+1

@Omu El argumento de evento pasado, puede estar en cualquier lugar, no tiene que ser el primero, siempre y cuando esté en el lugar correcto de la lista de parámetros definidos para la función. Por ejemplo, 'function myfunc (o, e) {...}', entonces se puede llamar como 'myfunc ({a: 1, b: 'hi'}, event)'. – cateyes

2

¿No puede simplemente eliminar el atributo href de la etiqueta a?

+0

sí, también es una opción, aunque de forma predeterminada el enlace no tendrá subrayado, y si javascript está desactivado no va a haber href para ir a – Omu

9

Prueba esto:

<script> 
    $("a").click(function(event) { 
     event.preventDefault(); 
    }); 
</script> 
+0

, esto requiere una etiqueta

4

Añadir una clase única de los enlaces y un javascript que impide por defecto en los vínculos con esta clase:

<a href="#" class="prevent-default" 
    onclick="$('.comment .hidden').toggle();">Show comments</a> 

<script> 
    $(document).ready(function(){ 

    $("a.prevent-default").click(function(event) { 
     event.preventDefault(); 
      }); 
    }); 
</script> 
3

Creo que cuando utilizamos onClick que queremos hacer algo diferente que la predeterminada. Por lo tanto, para todos sus enlaces con onClick:

$("a[onClick]").on("click", function(e) { 
    return e.preventDefault(); 
}); 
74

La solución más sencilla es simplemente:

<a href="#" onclick="event.preventDefault(); myfunc({a:1, b:'hi'});" />click</a> 

En realidad es una buena manera de hacer de almacenamiento en caché para documentos con un repliegue sin JS activado navegadores (sin el almacenamiento en caché si no hay JS)

<a onclick=" 
if(event.preventDefault) event.preventDefault(); else event.returnValue = false; 
window.location = 'http://www.domain.com/docs/thingy.pdf?cachebuster=' + 
Math.round(new Date().getTime()/1000);" 
href="http://www.domain.com/docs/thingy.pdf"> 

Si JavaScript está activado, se abre el PDF con una cadena de consulta almacenamiento en caché, si no que simplemente se abre el PDF.

+0

Podría usar la tecnología del lado del servidor para volver a escribir ese enlace si lo que está buscando es la prevención del almacenamiento en memoria caché. – mpen

+0

Sería mejor, pero no tengo acceso al código del lado del servidor. Trabajando con lo que tengo. – JuLo

-1

¡Simple!

onclick="blabla(); return false" 
Cuestiones relacionadas