在页面加载后调用数据时,jquery函数不起作用

时间:2011-10-23 05:12:10

标签: php javascript jquery html

我要问的可能是不可能的,我会尽量保持清醒。

我设置了我的网站,只有一个实际的网页(index.php)。所有html和页面内容都存储在php脚本中。所以我只是根据他们想要查看的页面发布数据,并在我的页面模板中发布.html()。这一切都很棒,就像我想要的那样。

问题是任何jquery函数都使用我从服务器调用的html中的元素标记,并在页面加载后不再起作用。我不确定为什么会这样。 jquery是否将页面上的所有页面元素都加载到内存中,以便不考虑在页面后加载的id和类?

任何见解或不同的方式都将受到赞赏。

提前致谢!

3 个答案:

答案 0 :(得分:2)

听起来你可以使用.delegate(),它比.live()

有更多的好处

http://api.jquery.com/delegate

这允许您将事件附加到页面加载的元素以及之后创建的元素.HTML()

对于你正在做的任何不受事件限制的事情,你应该在每次更换页面上的内容后立即运行所有jquery内容。不只是页面加载。

将所有内容放入一个函数中,以便轻松调用它。

答案 1 :(得分:1)

这是您的解决方案

http://api.jquery.com/live/

加载dom后添加的任何内容都应使用live或delegate

答案 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。