2009-10-23 16 views
6

Ho il seguente codice HTML:jQuery div onclick a fare clic su un href all'interno del div

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

per renderlo un po 'più sexy per i browser JavaScript abilitati Ho aggiunto questa jQuery (1.3.2):

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

Ma penso che entri in un ciclo infinito o qualcosa del genere. Safari mostra questo:

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

Qualcuno può offrire una soluzione alternativa o migliore?

risposta

9

Il problema qui è che una bugie all'interno del tr. Ergo, quando viene attivato un metodo click(), l'evento bolle al tr che lo contiene, creando il ciclo ricorsivo che hai menzionato. Piuttosto che chiamare .find('a').click(), avere sia a che tr utilizzare lo stesso metodo di clic.

0

In primo luogo, vorrei console.log($(this).find('a')) e assicurarsi che sia il collegamento appropriato. Successivamente, credo che l'evento click non sia quello che vuoi sull'elemento a. Credo che si desidera solo: var a = $(this).find('a'); if (a) document.location.href = a.attr('href');

mio JavaScript è piuttosto debole però:)

+0

motivo per downvote? – Shawn

+0

hey ti ha quasi portato 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

semplicemente provare a utilizzare bind('click') invece di click() scorciatoia, ha funzionato per me in quasi lo stesso caso.

6

Ho avuto lo stesso problema e ho risolto con l'aggiunta di e.stopPropagation(); al di sopra 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

Questa è una risposta piuttosto tardi, ma ho trovato questo per essere una soluzione molto breve e semplice:

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

questa è l'unica risposta che ha funzionato per me, provando: '$ ('# PARENT'). Each (function() { $ (this) .find (" a ") .click(); return false; }); . $ ('# Capogruppo a') bind ('click', function (e) { e.stopPropagation(); }); ', l'interno click non avrebbe funzionato, ma questa soluzione, infine, ha fatto il trucco. – bdanin

0

il mio era un elemento di elenco in un menu a discesa, quindi volevo che l'evento continuasse a girare, quindi il menu a discesa sarebbe stato chiuso. questa è la soluzione che ho usato:

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