2010-05-13 137 views
0

我一直在寻找一段时间,一直没有找到任何符合我的问题,我甚至不知道我能解释得很好,所以采取这是值得的。ajax加载的内容中的jQuery代码只运行一次

我有一个页面通过AJAX(使用.load()方法)将内容加载到div中。导航中有几个链接,这意味着在浏览网站时内容会发生变化,而不会刷新整个页面。 (实际上,说实话,我只是把css-tricks.com的DocTemplate布局[http://css-tricks.com/examples/DocTemplate/]弄成了碎片。显然,虽然我不是一个重新发明轮子类型的程序员,但我是一个反对轮不停地让它工作程序员)。

所以,index.php加载一些div中的数据库内容。 index.php上还有一个jQuery UI模式输入表单。基本上,页面上唯一的HTML是一个空的div和一个表单。这一切工作正常,直到我打电话给另一页,然后去到index.php。数据库内容没有加载,我的表单在所有裸露的荣耀中都显示出来。我知道这是为什么发生。该页面未刷新,没有任何代码加载内容并隐藏表单。

我的问题是,我怎样才能确保AJAX .load()和.dialog()将再次加载index.php时运行?它甚至有可能吗?

谢谢,并且我对这个长度表示歉意。当我困惑时,我会变得冗长。

回答

0

一个简单而快速的解决方案是禁用index.php缓存。你可以通过发送适当的Http头来完成。这样你的页面总是会重新加载。

+0

我不能肯定,将工作。我可能应该提到浏览器永远不会离开index.php。点击导航链接将blah.php加载到index.php的div上,导致一个URL如下所示:index.php#blah.php。我试图刷新页面,但不会将其他页面加载到div中。 – 2010-05-13 13:39:31

0

你的问题不是很容易理解。看来你正在使用浏览器的按钮回到你的index.php文件?

当您点击后退按钮时,浏览器将重新加载页面,因为它最初加载时(即处于任何用户交互之前的状态)。

因此浏览器显示裸露页面是正常的。

它要处理后退按钮一般多在Ajax应用程序的浏览器的历史记录,您可以使用现有的jQuery的历史插件,像this one

我希望它会帮助你,

杰罗姆瓦格纳

+0

呃,是的,我知道这有点粗糙。但是,我没有使用后退按钮。我点击导航链接将页面内容加载到div中......我不确定这是否有帮助。 – 2010-05-13 13:43:15

0

您可以添加一些逻辑,以便当您的页面加载完成后,您检查是否填充动态区域。如果不是,请运行​​例程。

$(document).ready(function() { 
    if($('div#theDIV').find('something_that_should_be_there').length == 0) { 
     $('div#theDIV').load('etc,etc') 
    } 
}) 
+0

页面加载后出现问题。主页面加载,index.php运行其jQuery罚款。然后,我点击另一个导航链接,将about.php加载到之前由index.php中的内容占据的div中。这工作正常,所有ajaxy和spiffy样。然后,我点击主页导航链接以恢复index.php内容 - 其中包含jQuery代码。由于页面永不刷新,jQuery无法运行。地狱,即使我现在混淆了自己。 – 2010-05-13 13:46:20

0

我明白了。当内容再次加载时,我必须手动重新绑定.load()回调函数中的事件。

0

问题是.bind()仅绑定当前存在的元素.bind()运行。由于您稍后在ajax中加载更多内容,在运行.bind()之后,新元素将不会绑定事件。 有2种解决方法,此:

  • 或者,像你这样,重新绑定元件各自AJAX负载
  • 后或使用.live()而不是.bind()。
    .bind()的语法类似于
    $('element').bind('some-event', function() {blabla});。 'some-event'是你绑定的任何事件:click/submit/mouseover/etc。
    .live()是完全一样的:
    $('element').live('some-event', function() {blabla});

注意,有共同的活动速记符号:

$('element').click(function() {blabla}); // These are equivalent to 
$('element').bind('click', function() {blabla}); // You need to use .on() 
$(document).on('click', 'element', function() {blabla});