【问题标题】:Infinite new window loop when triggering click event触发点击事件时无限新窗口循环
【发布时间】:2011-10-10 01:16:36
【问题描述】:

我有一个在表格中显示数据的概览页面。当用户单击该行时会打开一个弹出窗口。但是弹出窗口会一遍又一遍地重新加载,直到它挂起。

概览代码:

<tbody>
    <tr>
       <td>
          <a href="/pop-up/details/1/" onClick="MyWindow=window.open('/details_screen/1/','window1','toolbar=no,location=no,directories=no,status=yes,menubar=no,scrollbars=yes,resizable=yes,width=800,height=600'); return false;">details screen for 1</a>
       </td>
    </tr>
    <tr>
       <td>
          <a href="/pop-up/details/2/" onClick="MyWindow=window.open('/details_screen/2/','window2','toolbar=no,location=no,directories=no,status=yes,menubar=no,scrollbars=yes,resizable=yes,width=800,height=600'); return false;">details screen for 2</a>
       </td>
    </tr>
</tbody>

使行可点击的javascript:

function make_rows_clickable(table){
    $(table).find('tbody tr').each(function() {
                $(this).hover(function(){
                    //rollover
                    $(this).addClass('hover');
                },
                function() {
                    //rolloff
                    $(this).removeClass('hover');
                }).click(function() {
                    $(this).find('a').click();
                });
    });
}

解决方案

正如答案评论所述,锚点点击会触发 tr 点击事件并创建无限循环。我通过删除 onClick 事件并添加属性来解决它。 tr 点击事件打开,然后弹出。

<td>
    <a href="/pop-up/details/2/"element_id="2" pop_w="800" pop_h="600">details screen for 2</a>
</td>

Js:

$(table).find('tbody tr').hover(function(){
                    //rollover
                    $(this).addClass('hover');
                },
                function() {
                    //rolloff
                    $(this).removeClass('hover');
                }).click(function(e) {
                    e.stopPropagation();
                    var anchor = $(this).find('a');

                    var el_id = $(anchor).attr('element_id');
                    var pop_w = $(anchor).attr('pop_w');
                    var pop_h = $(anchor).attr('pop_h');

                    MyWindow=window.open('/details/screen/' + el_id + '/', el_id, 'toolbar=no,location=no,directories=no,status=yes,menubar=no,scrollbars=yes,resizable=yes,width=' + pop_w + ',height=' + pop_h);
});

【问题讨论】:

  • 您不需要有each 函数来添加事件处理程序。删除 each 并添加事件处理程序。做同样的事情。
  • 是的,我知道,我在尝试解决问题以清除它时添加了它:P

标签: javascript jquery popup infinite


【解决方案1】:

所以每个表行中必须有多个 td。因此,当您运行时

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

它找到行中的每个a标签(等于td的数量)并执行它们的点击功能。因此,它会打开多个弹出窗口

将代码替换为:

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

或使用:

$(table).find('tbody tr').click(function() {
   MyWindow = window.open('/details_screen/2/', 'window2', 'toolbar=no, location=no, directories=no, status=yes, menubar=no, scrollbars=yes, resizable=yes, width=800, height=600');
   return false;
})

【讨论】:

  • 是的,但只有一个锚在该行中,所以这不是问题(无论如何都测试过)。所以循环仍然在某个地方:(我认为问题更多在于与jquery click事件合作的onclick事件..
  • 这意味着tr 元素正在调用a 标签的点击事件,这会打开弹出窗口。然后该事件再次传播到tr 元素,该元素再次调用a 标签的点击事件,再次打开弹出窗口......等等。您需要停止来自 a 元素的传播。
  • 正确,这就是问题所在。将采取不同的方法来解决它,方法是删除 onclick,添加一些属性(id、width、height 等)并在 tr click 事件中创建弹出窗口。谢谢!
猜你喜欢
  • 1970-01-01
  • 2011-04-01
  • 1970-01-01
  • 2021-07-24
  • 1970-01-01
  • 2023-03-27
  • 1970-01-01
  • 2013-01-05
  • 2014-01-16
相关资源
最近更新 更多