2009-10-23 26 views
6

Ich habe folgende HTML klicken:jQuery div Onclick ein href innerhalb der div

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

Um es ein bisschen sexier für Javascript-fähige Browser habe ich diese jQuery hinzugefügt (1.3.2):

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

Aber ich denke, es wird in eine Endlosschleife oder so etwas. Safari zeigt dies:

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

Kann jemand bitte einen Workaround oder einen besseren Weg bieten?

Antwort

9

Das Problem hier ist, dass a innerhalb der tr liegt. Ergo, wenn die a click() -Methode ausgelöst wird, sprudelt das Ereignis zum tr, der es enthält, wodurch die rekursive Schleife entsteht, die Sie erwähnt haben. Rufen Sie statt .find('a').click() beide a und tr die gleiche Klickmethode.

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

Zuerst würde ich console.log($(this).find('a')) und stellen Sie sicher, dass es die entsprechende Verbindung ist. Als nächstes glaube ich, dass das Klickereignis nicht das ist, was Sie unter a möchten. Ich glaube, Sie wollen einfach nur: var a = $(this).find('a'); if (a) document.location.href = a.attr('href');

Mein JavaScript ziemlich schwach ist, aber:)

+0

Grund für downvote? – Shawn

+0

hey fast brachte Sie zu 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

einfach versuchen bind('click') statt click() Verknüpfung zu verwenden, funktioniert es in für mich fast gleichen Fall.

6

Ich hatte das gleiche Problem, und ich löste es e.stopPropagation(); zum einen auf, klicken Sie fügen hinzu:

$(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

Dies ist eine ziemlich spät Antwort ist, aber ich fand das eine sehr kurze und einfache Lösung sein:

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

Dies ist die einzige Antwort, die für mich arbeitete, versuchen: '$ ('# PARENT'). Je (function() { $ (this) .find (" a ") .click(); return false; }); $ ('# PARENT a'). Bind ('klick', funktion (e) { e.stopPropagation(); }); ', der Innenklick würde nicht funktionieren, aber diese Lösung hat endlich den Zweck erfüllt. – bdanin

0

Mine war ein Listenelement in einem Drop-Down, damit ich das Ereignis sprudelt halten wollte, so würde die Drop-Down-geschlossen werden. das ist die Lösung, die ich verwendet:

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