javaScript在被ajax加载时不能运行
javaScript doesn't run when loaded by ajax
我有一个javaScript函数在view/loadMoreDataWater.php
<td ondblclick="updateCell()">
</td>
现在在table.php
在public_html
文件夹我有一个表时,onscroll应该加载更多的数据:
qlimit =0;
$("#waterDBTable tbody").scroll(function() {
if ($("#waterDBTable").scrollTop() > $("#waterDBTable").height() - 300) {
qlimit = qlimit + 5;
$("#loadingDiv").css('display','block');
$.ajax({
url: "controllers/loadMoreDataWater.php?qlimit=" + qlimit + "&table=water",
success: function(result) {
$("#waterDBTable").append(result);
$("#loadingDiv").css('display','none');
}
});
}
});
当内容被ajax加载时。Ondblclick函数不工作。我发现了一些关于使用
$(body).on('click', '#something', function() {
但是我很困惑,它不适合我,我不知道我必须在哪个文件中放置这样的代码。
谢谢
您正在阅读有关事件委托的内容。
$('body').on('click', '#something', function() {
// do stuff
});
此代码将向body
元素添加一个事件侦听器,侦听click
事件,并将处理程序函数附加到从id
为' something
'的元素中冒出的任何click
事件。
ondblclick=
属性,你附加一个事件监听器,像这样:
$('body').on('dblclick', 'td', function() {
// do whatever updateCell() does, using `$(this)` for the td that was clicked
});
因此,实际上您是在将事件处理程序委托给一个元素。这很有用,有几个原因,其中最主要的原因是,当您删除内容时,body元素不会去任何地方,当添加到DOM中时,事件处理程序也不需要附加到新元素。
要了解它是如何工作的,请对其进行逆向工程。想象一下这实际上在做什么:所有事件都从它们的源节点冒泡到顶级节点。这意味着每个单击事件都注册为对事件目标(您要向其添加事件处理程序的元素)和的单击,因为您在单击元素时也单击了主体。
"所以",有人可能会问,"当你可以在主体中添加一个巨大的事件侦听器并在事件处理程序函数中实现一些交换机逻辑时,为什么要向许多单独的元素添加许多事件侦听器呢?"
如果没有jQuery,你可以像这样做一个基本的事件分派器:
document.body.addEventListener('dblclick', function(){
var el = this;
if ( el.classList.contains('dblclick-to-update') ){
updateCell(el);
}
// other if statements could be below, handling other dblclick events, on elements other than td cells, if necessary
});
所以,与其说:
- 如果单击此单元格
- 更新。
可能几十次甚至几百次,我们说:
- 如果在页面的任何地方有点击,
- 检查点击了什么,
- 如果它是我们想要更新的东西,
- 使用要更新的单元格触发updateCell函数。
- 如果它是我们想要更新的东西,
- 检查点击了什么,
理想情况下,每个td
元素将被赋予一个CSS类(如class="dblclick-update"
)或一个数据属性(如data-dblclickupdate="true"
),然后您可以将其中任何一个用作委托事件处理程序的选择器。这将代替使用' td
'作为选择器,这将搞砸,如果你有其他td
元素,不需要有updateCell()
行为附加到他们。
$('body').on('dblclick', '.dblclick-update', function(){
updateCell($(this));
});
使用updateCell($(this))
将为您提供单击的td
,但您需要更改updateCell()
函数以处理作为参数传入的元素。在函数定义中,首先需要声明函数需要一个参数,因此可能会出现如下情况:
function updateCell() {
// do stuff to 'this'
}
你需要这样定义函数:
function updateCell(cell) {
// do stuff to 'cell', which is passed in as a parameter now
}
显然,如果你选择使用事件委托,你将不再需要那些ondblclick=
属性,所以删除它们,只使用<td class="dblclick-update"></td>
或类似的东西。
至于为什么 ondblclick="updateCell()"
不能为新添加的td
元素工作,我的猜测是您在 $(document).ready
块中定义了updateCell()
函数,这意味着该函数不可用于新添加的元素,因为它不在全局作用域中。
试着把函数放在全局作用域中,要么在$(document).ready
之外定义updateCell()
(以及在任何其他函数之外),要么在全局window
对象中直接引用它,像这样:
window.updateCell = function(){
// do stuff to cell
};
或者,如果使用事件委托,
window.updateCell = function(cell){
// do stuff to cell
};
感谢您的贡献。问题出在新嵌入元素的id中,因为它包含一个变量,而这个变量导致了id的重复。现在工作得很好。由于@amdouglas
- ASP.NET 应用在VS2010中运行,但在发布/部署后不能运行
- javaScript在被ajax加载时不能运行
- Flexslider jQuery插件不能运行幻灯片
- 不能运行我的Node.Js应用程序与我的机器的IP地址,但可以与本地主机
- 为什么这个javascript热/冷应用程序不能运行?
- c# WPF应用程序浏览器不能运行angularjs
- Php编程错误(不能运行while循环)
- 不能运行简单的Jquery函数
- 有人能解释为什么这个JavaScript不能运行吗?
- 为什么这个javascript不能运行,我们的目的是在弹出式
- 不能运行或测试我的NodeJS脚本
- 不能运行任何JS相关的东西.MVC页面
- 我有编程经验,但不熟悉Javascript,我不知道为什么我的代码不能运行
- Ruby on rails -不能运行javascript
- 为什么html5视频不'不能运行在Chrome使用爆米花.js
- 不能运行yui jar文件-缺少变量名和函数体后缺少}
- 为什么JavaScript不能运行?
- 可以运行Javascript,但不能运行jQuery
- 不能运行xmlHttp.本地服务器上的responseXML
- 为什么这个程序不能运行