2009-10-23 78 views
6

我有以下HTML:的jQuery的div的onclick点击DIV中一个href

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

,使其成为支持JavaScript的浏览器性感一点我已经添加了这个jQuery(1.3.2):

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

但我认为它进入了一个无限循环或什么。 Safari展示了这一点:

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

任何人都可以提供解决方法或更好的方法?

回答

9

这里的问题是一个谎言在tr。 Ergo,当click()方法被触发时,事件冒泡到包含它的tr,创建你提到的递归循环。不要致电.find('a').click(),请让atr使用相同的点击方法。

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

首先,我会console.log($(this).find('a')),并确保它是适当的链接。 接下来,我相信点击事件不是你想要的a元素。我觉得你只是想:var a = $(this).find('a'); if (a) document.location.href = a.attr('href');

我的JavaScript是相当薄弱的,虽然:)

+0

downvote的原因是什么? – Shawn 2009-10-23 19:48:40

+0

嘿几乎让你到5K;) – Mattis 2011-08-20 18:14:08

-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

简单地尝试使用bind('click'),而不是click()快捷方式,它为我工作几乎相同的情况下。

6

我有同样的问题,我将e.stopPropagation();到一个上点击解决它:

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

这是一个相当晚的答案,但我发现这是一个很短的和简单的解决方案:

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

这是我工作的唯一答案,尝试: '$('#PARENT')。each(function(){(this).find(“a”) .click(); return false; }); ('#PARENT a')。bind('click',function(e){e.stopPropagation(); });',内部点击不起作用,但是这个解决方案终于实现了。 – bdanin 2015-03-30 13:13:10

0

我是一个下拉列表项,所以我希望事件继续冒泡,所以下拉将被关闭。这是我使用的解决方案:

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