我要问的可能是不可能的,我会尽量保持清醒。
我设置了我的网站,只有一个实际的网页(index.php)。所有html和页面内容都存储在php脚本中。所以我只是根据他们想要查看的页面发布数据,并在我的页面模板中发布.html()。这一切都很棒,就像我想要的那样。
问题是任何jquery函数都使用我从服务器调用的html中的元素标记,并在页面加载后不再起作用。我不确定为什么会这样。 jquery是否将页面上的所有页面元素都加载到内存中,以便不考虑在页面后加载的id和类?
任何见解或不同的方式都将受到赞赏。
提前致谢!
答案 0 :(得分:2)
听起来你可以使用.delegate(),它比.live()
有更多的好处http://api.jquery.com/delegate
这允许您将事件附加到页面加载的元素以及之后创建的元素.HTML()
对于你正在做的任何不受事件限制的事情,你应该在每次更换页面上的内容后立即运行所有jquery内容。不只是页面加载。
将所有内容放入一个函数中,以便轻松调用它。
答案 1 :(得分:1)
答案 2 :(得分:0)
我不确定你是否确定了你遇到的确切问题。这里可能存在两个问题,分层以创建您的印象:
1)jQuery .bind()及其快捷函数如.click(),. hover()等在调用时绑定,而不是像CSS规则一样。
例如:
$(document).ready(function() {
$('div.stuff').click(function(){alert('Hi');}
});
<div class=stuff>Say hi</div>
首次加载页面后,无法处理插入到文档中的新HTML,因为$(document).ready()
在正文标记关闭/ jQuery完成初始化时触发,以秒为准,而不是在加载新HTML时再触发
一个天真的答案是使用.live()
$('div.stuff').live('click', function(){alert('Hi');}
如果它包含带有类内容的div,这将导致加载到页面中的新HTML被触发,因为jQuery会侦听body标记上的实时事件,该标记保留在原位,然后匹配触发事件的标记以查看如果它与选择器匹配。第二步有点贵,而且有很多实时选择器,您的页面会慢慢响应事件。那很糟糕。
更好的答案是加载新的HTML并绑定。也许是这样的:
function pageBinds() {
$('div.stuff').click(function(){alert('Hi');}
}
$(document).ready(pageBinds);
function loadPage() {
$.ajax(...)
pageBinds();
}
这可以获得响应加载内容的高性能绑定。
在加载新内容之前,您可能会考虑取消绑定,因为保留绑定的现有事件可能会根据事件和浏览器污染jQuery,但是需要大量事件和大量页面加载才能对桌面(智能手机可能会感觉快一点)。但是,取消绑定会更加复杂。
2)innerHTML'd内容中的脚本标记将被忽略。
这使许多使用UpdatePanels的ASP.Net程序员感到困惑,它完全按照PHP中的编码方式执行。您加载的页面中的任何脚本标记都可能不存在 - 浏览器只是抛出它们。要使用HTML运行脚本,您需要使用eval()或其他一些更复杂的技巧来显式执行它。
您可以通过将任何内容加载为脚本分隔符html来解决此问题。因此,您使用分隔符字符序列,将您构建的AJAX调用与.split()分开传入字符串,eval脚本部分,以及innerHTML HTML。