问候大师,这有点难以解释,但我会试一试。
我对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
答案 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;
});