jQuery .live多次触发!

时间:2010-03-23 18:58:00

标签: php jquery ajax

问候大师,这有点难以解释,但我会试一试。

我对JQuery中的.live()函数有一个简单的问题。我将在这里简化示例。我有一个页面“index.php”,它有一个容器“#display_files_container”,其中填充了由不同页面“process.php”动态生成的锚链接。当根据该链接的属性选择这些链接时,链接将加载到同一<div>。见例子:

的index.php

<html>

<head><title>index.php</title>

<!-- this function below loads process.php and passes it the dirid variable via post.  I then use this post variable inside of process.php to pull other links from the database -->

<script language="text/javascript">
     $('.directory').live("click", function() {
          $('#display_files_container').load('plugins/project_files/process.php', {dirid: $(this).attr('dirid')});
     });
</script>

</head>

<?php 
/*This code initial populates the link array so we have the first links populated before the users clicks for the first time*/
some code to fetch the $current_directory_list array from the database initially....
>?

<body>
<div id='display_files_container'>

<?php

/*Cycle through the array and echo out all the links which have been pulled from DB*/
for($i=0;$i<$current_directory_count;$i++) {
  echo "<a href='#' class='directory' dirid='".$current_directory_list[$i]['id']." '>".$current_directory_list[$i]['directory_name'].
  "</a> ";
}

?>

</div>
</body>
</html>

PROCESS.PHP

此文件包含用于根据从index.php中的.click()方法发送的post变量“$ _POST ['dirid']”从数据库填充$ current_directory_list []数组的代码。然后它回显结果,我们将它们显示在#display_files_container容器中。当您单击这些链接时,该过程将重复。

这有效.....你可以点击目录树,每次都加载新的链接。但是,它似乎想要多次执行.load()process.php文件。加载process.php的次数似乎越多,单击链接的次数就越多。所以例如你可以点击一个链接和firebug报告process.php加载了23次.....最终我会想象我会记录一个stackoverflow。如果您有任何想法,请告诉我。有什么办法可以保证.live()只加载process.php文件一次吗?

谢谢, -cs

2 个答案:

答案 0 :(得分:5)

发生的情况是,每次单击链接时,都会将新的单击事件处理程序绑定到每个链接。这是可能的,因为特定事件可以有多个处理程序。您必须在处理程序中返回false以停止事件冒泡。

更新:我不确定为什么处理程序会多次绑定,但我的猜测是它与“实时事件”实现的特殊性有关。请参阅docs

中的事件委派一章
  

传递给.live()的处理程序永远不会绑定到元素;相反,.live()将一个特殊的处理程序绑定到DOM树的根目录。

另一种解决方案是使用bind()或click()而不是live(),并在加载ajax后显式调用它:

function bind_link_handler() {
    $('.directory').click(function() {
        $('#display_files_container').load('...', bind_link_handler);
    })
}

答案 1 :(得分:1)

就这样每个人都在循环中我的.live()代码的新行看起来像这样:

$('.directory').live("click", function() {
  $('#display_files_container').load('plugins/project_files/process.php', {dirid: $(this).attr('dirid')});
  return false;
});