2009-10-23 42 views
6

Tengo el siguiente código HTML:jQuery div onclick hacer clic en un href dentro del div

<table class="products"> 
    <tr> 
    <td>Product description probably goes here</td> 
    <td><a href="#">more information</a></td> 
    </tr> 
</table> 

para que sea un poco más atractivo para los navegadores compatibles con Javascript He añadido este jQuery (1.3.2):

$(document).ready(function(){ 
    $('table.products tr').click(function(){ 
    $(this).find('a').click(); 
    return false; 
    }); 
}); 

Pero creo que entra en un ciclo infinito o algo así. Safari muestra esto:

RangeError: Maximum call stack size exceeded. jquery.min.js:12

¿Alguien puede ofrecer una solución o mejor?

Respuesta

9

El problema aquí es que a se encuentra dentro del tr. Ergo, cuando se activa el método a click(), el evento burbujea al tr que lo contiene, creando el bucle recursivo que mencionaste. En lugar de llamar al .find('a').click(), ambos a y tr usan el mismo método de clic.

$('tr, a').click(function(){ 
    //dostuff 
    return false; 
}); 
0

Primero, me gustaría console.log($(this).find('a')) y asegúrese de que es el enlace apropiado. A continuación, creo que el evento click no es lo que desea en el elemento a. Creo que lo que desea es: var a = $(this).find('a'); if (a) document.location.href = a.attr('href');

Mi JavaScript es bastante débil, aunque:)

+0

reason for downvote? – Shawn

+0

hey casi te lleva a 5k;) – Mattis

-2
$(document).ready(function(){ 
    $('table.products tr').click(function(e){ 
    e.stoPropagation(); // for stop the click action (event) 
    $(this).find('a').click(); 
    return false; 
    }); 
}); 
1

simplemente tratar de usar en lugar de bind('click')click() acceso directo, que trabajó para mí en casi mismo caso.

6

que tenían el mismo problema y lo resolvió con la adición de e.stopPropagation(); a la una de clic:

$(document).ready(function() { 
    $('table.products tr').bind('click', function() { 
    $(this).find('a').click(); 
    return false; 
    }); 

    $('table.products tr a').bind('click', function(e) { 
    e.stopPropagation(); 
    }); 
}); 
4

Esta es una respuesta bastante tarde, pero me pareció que esto sea una solución muy corto y simple:

$('ul li').bind('click', function() { 
    location = $(this).find('a').attr('href'); 
}); 
+1

esta es la única respuesta que funcionó para mí, tratando: '$ ('# PARENT'). Cada uno (función() { $ (this) .find (" a ") .click(); return false; }); $ ('# PARENT a'). Bind ('clic', función (e) { e.stopPropagation(); }); ', el clic interno no funcionaría, pero esta solución finalmente funcionó. – bdanin

0

mina era un elemento de la lista en un menú desplegable, así que quería que el evento siguiera burbujeando para que el menú desplegable se cerrara. esta es la solución que utilicé:

$('div#outer').click(function (e) { 
    if (e.target == e.currentTarget) // prevents bubbled events from triggering 
     $($(e.currentTarget).children()[0]).trigger('click'); 
}); 
Cuestiones relacionadas