2010-11-01 52 views
6

我的网站使用jquery.load()在页面的大块内进行导航。我很欣赏的能力,只只包括加载内容的特定部分,在这里使用id =“内容”股利:在jquery.ajax()加载的页面中运行的脚本运行document.ready太早

$(frame_selector).load(url +" #content", function(response, status, xhr) {...}); 

但现在我需要能够运行是网页的一部分脚本被动态加载。 Jquery.load()会去掉这些脚本,但jquery.ajax()不会。所以我复制的jquery.load所述部分内容的功能在调用Ajax这样:

$.ajax({ 
    url: url, 
    dataType: 'html', 
    success: function(data, textStatus, XMLHttpRequest) { 
     // Only include the response within the #content id element. 
     $(frame_selector).html(jQuery("<div>") 
      .append(data) 
      .find("#content") 
    ); 
    } 
}); 

的问题是,它们被动态地从AJAX调用加载的脚本不能可靠地运行。有时他们似乎没有任何效果,可能是因为他们跑得太早。这些脚本只是在jQuery中进行DOM操作 - 而不是依赖图像或Flash或任何不应该加载的东西。为了防止被卡住,我有这个可怕的黑客工作。而不是仅仅使用AJAX加载脚本:

$(document).ready(function() {...}); // unreliable 

我之前运行延迟脚本的200ms:

$(document).ready(window.setTimeout(function() {...}, 200)); // HATE THIS 

任何人都知道我怎样才能使这项工作不可靠的硬编码的延迟?我猜这是<script>和我的逻辑加载#content到一个新的div之间的竞争条件,但我不知道该怎么办。

+0

您可以同步请求以捕获数据。 – dz1984 2010-11-01 23:57:44

+0

这是一个可怕的想法。当同步请求执行时,您的浏览器UI将被锁定。 – 2010-11-02 04:28:45

回答

7

我假设脚本正在对通过AJAX添加的DOM元素进行操作。

jQuery有一个isReady属性,它在页面上触发ready事件后设置。

任何后续调用jQuery.ready(...)将首先检查此isReady标志。如果该标志设置为true,它将立即调用处理程序。你可以看到为什么这会在代码中造成问题。

一个选项是将响应加载到jQuery片段中,并解析出所有<script />标记以供稍后执行。

var ajaxResponse = $(html); 
var scripts = ajaxResponse.find('script'); 

// Move your scripts into a new element 
var tempScripts = $().append(scripts); 

// Append your content, followed by your script tags 
$(document).append(ajaxResponse); 
$(document).append(tempScripts); 
+0

这很好,谢谢! – Neo 2011-05-06 15:05:24

+0

这不适合我。问题似乎是.find()无法找到脚本... – ekkis 2011-06-28 20:07:11

1

@丹有问题。当通过ajax加载脚本时,文档isReady为真。这意味着如果这是您的ajax请求所请求的脚本标记:

<script type="text/javascript"> 
    if (jQuery.isReady) { 
     $('body').append("<div id='new_content'>Document Ready</div>"); 
    } 
    else { 
     $('body').append("<div id='new_content'>Document Not Ready</div>"); 
    } 
</script> 

而不是利用JSON进行解析。一个属性将保存HTML。另一个属性将保存脚本。如果你周围,你的代码就会创建一个封闭的准备功能加载脚本

$(document).append(ajaxResponse.html); 
$(document).append(ajaxResponse.script); 

另外:

然后你就可以做到这一点。此封闭将持续页面的生命周期。内存泄漏将在您每次请求脚本时创建,而不刷新您的页面