繁体   English   中英

jQuery Click()错误-堆栈空间不足

[英]Jquery Click() Error - Out of stack space

好吧,我被困在这里。 我有一个包含表的控件。 我允许用户单击底部行中的超链接直接转到关联的视图。

另一方面,用户可以单击表内的其他任何位置,然后进行选择。 该选择将激活工具栏,该工具栏允许用户对所选项目执行某些任务。 如果用户再次单击所选项目,则我要以编程方式单击超链接。 但是,当我运行jQuery以编程方式单击超链接时,我不断收到“栈空间不足”错误。 我完全知道click事件是递归调用的,但是我不知道如何防止它! 这是我的代码...

<head runat="server">
<title></title>

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>

<style>
.mouseOver, .mouseOut, .selected
{
    width: 120px;
    height: 120px;
    text-align: center;
    vertical-align: top;
    display: inline-block;
    margin: 5px;
    cursor: pointer;

}
.mouseOver
{
    border: solid thin #99defd;
    background: #e9f8fe;
}
.mouseOut
{
    border: solid thin White;
}
.selected
{
    border: solid thin #e0a403;
    background: #f8f4de;
}
</style>

<script>
(function($) {
    $(document).ready(function() {
        var $items = $('.mouseOut');
        $items.mouseenter(function() {
            if ($(this).attr('class') != 'selected')
                $(this).attr('class', 'mouseOver');
        });
        $items.mouseleave(function() {
            if ($(this).attr('class') != 'selected')
                $(this).attr('class', 'mouseOut');
        });

        $items.click(function() {
            if ($(this).attr('class') == 'selected') {
                $(this).find('a').click();
            }
            else {
                $('.selected').attr('class', 'mouseOut');
                $(this).attr('class', 'selected');
            }
        });
    });
})(jQuery);
</script>
</head>
<body runat="server">
    <form id="form1" runat="server">
        <table cellpadding="5" class="mouseOut">
            <tr>
                <td>
                user module thumbnail...
                </td>
            </tr>
            <tr>
                <td>
                    <a id="A1" href="javascript:__doPostBack('ControlPanelHost1$cphCtrl0$lvCollectionView$ctrl0$lnkBtn','')">Users</a>
                </td>
            </tr>
        </table>

        <table cellpadding="5" class="mouseOut">
            <tr>
                <td>
                stats module thumbnail...
                </td>
            </tr>
            <tr>
                <td>
                    <a id="A2" href="javascript:__doPostBack('ControlPanelHost1$cphCtrl0$lvCollectionView$ctrl1$lnkBtn','')">Stats</a>
                </td>
            </tr>
        </table>
    </form>
</body>

此精简版将充分展示该问题。 感谢任何能提供帮助的人!

问题在于,在元素的后代上触发click事件也会在该元素上触发它,因为该事件在DOM树中冒泡。 由于您的代码在处理其祖先的相同事件时会触发后代的click事件,因此会发生无限递归。

解决此问题的一种方法是使用stopPropagation()来防止在您的超链接上触发的click事件冒泡:

$(this).find("a").click(function(e) {
    e.stopPropagation();
});

编辑:但是,由于您的逻辑也驻留在祖先的事件处理程序中,因此上述代码无法按预期工作。 仅当当前正在处理的事件是在祖先元素或未在子元素上触发的事件被触发时,我们才可以切换问题的方法,并使用带有is()的 event.target来触发后代超链接上的click事件。超链接本身:

$items.click(function(event) {
    if ($(this).attr('class') == 'selected' && !$(event.target).is("a")) {
        $(this).find('a').click();
    } else {
        $('.selected').attr('class', 'mouseOut');
        $(this).attr('class', 'selected');
    }
});

由于某些奇怪的原因,此解决方案有效。

更换:

$(this).find('a').click();

与:

window.location = $(this).find('a').attr('href');

FrédéricHamidi提供的代码很棒,但是click()从未发布回服务器。

似乎函数__doPostBack是未定义的,这可能是导致错误的原因

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM