2011-04-13 82 views
1

我的web应用程序动态加载其用户界面部分jquery.ajax。新的UI部分虽然带有脚本。我加载它们的方式:在ajax加载的页面片段中运行脚本

使用...

$.ajax({ 
    url: url, 
    dataType: 'html', 
    success: function(data, textStatus, XMLHttpRequest) { 
     $(target_selector).html(data); 
     update_ui_after_load(); 
    } 
}); 

这几乎工程。问题是包含在页面动态部分中的脚本在将新页面片段插入到DOM之前运行。但通常这些脚本想要修改它们随附的HTML。我最好的解决方案哈克到目前为止,仅仅是延迟脚本的时候一些合理的量,让DOM插入发生,通过在setTimeout包裹他们:

window.setTimeout(function() { 
    // process downloaded Fragment 
}, 300); 

显然,这是不可靠的,可怕的。什么是更好的方法?

+0

我不太确定'$(document).ready()'是否在这里工作,但值得一试。如果没有,你可以在你的ajax成功回调函数中添加一些东西来启动新加载的javascript。 – Eliasdx 2011-04-13 22:46:15

+0

它仍然运行得太早。等待DOM在运行之前加载,但在ajax调用返回时,DOM通常已经加载。在将HTML交给成功函数并将其合并到主页面之前,Jquery运行脚本。 – Leopd 2011-04-14 15:41:16

回答

0

我解决它通过使一个新的简单准备处理系统如下...

var ajaxOnLoad = (function() { 
    var ajaxOnLoad = {}; 
    var onLoadQueue=[]; 

    ajaxOnLoad.onLoad= function(fn) { 
     onLoadQueue.push(fn); 
    }   

    ajaxOnLoad.fireOnLoad = function() { 
     while(onLoadQueue.length > 0) { 
      var fn = onLoadQueue.shift(); 
      fn(); 
     } 
    } 

    window.ajaxOnLoad = ajaxOnLoad; 
    return ajaxOnLoad; 
})(); 
中得到 .ajax()加载页面

所以,脚本排队等待与运行

ajaxOnLoad.onLoad(function() { 
    // Stuff to do after the page fragment is inserted in the main DOM 
}); 

并且其中不插入时,update_ui_after_load()呼叫之前的代码中,运行

ajaxOnLoad.fireOnLoad(); 

更完整的解决方案可以解析页面,查找脚本标记并自动排队。但是由于我完全控制了插入的碎片,因此我更容易切换到使用ajaxOnLoad.onLoad

0

你是否熟悉live()函数?可能是你在这里寻找的。

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

+0

我可以想象用这种方式构建某些东西,但对我而言,解决方案涉及到“活”这个问题并不明显。也许创建一个新的事件类型,但有其他复杂性。 – Leopd 2011-04-14 15:42:55

+0

live()允许事件处理程序处理动态添加到页面的内容(即来自ajax请求)。不知道这是否是你的问题的一部分,但认为我会建议它以防万一。 – wdm 2011-04-14 16:02:55

0

的问题是,包含在页面运行的动态部分脚本的新页面片段插入到DOM之前。但通常这些脚本想要修改它们随附的HTML。

我确信在这种情况下,唯一明智的做法是将脚本放在HTML元素之后。

其他一切很快就会变得缺憾 - 我猜你可能实现您的HTML已经被插入之后被执行自己的“准备就绪”的处理程序,但是这将是一个大量的工作来实现没有真正的收获。

+0

即使脚本位于''标签之后,jquery仍然在将HTML传递给将其放入页面的'success'函数之前运行该脚本。 – Leopd 2011-04-14 15:40:12

+0

@LeoPD我明白了!臭死了。 (虽然jQuery手册声明'将HTML作为纯文本返回;包含的脚本标记在插入到DOM中时被评估。“但是我假设你已经测试了这一点)也许使用'dataType:”值得一试 - 希望'.html()'按正确的顺序执行? – 2011-04-14 15:47:53

+0

是的,文档中的那一行没有帮助。稍后它会说“如果指定了html,则在将HTML作为字符串返回之前,将执行检索到的数据中的任何嵌入式JavaScript。”如果我把它作为文本解析出来,找到任何脚本标记,并自己运行它们 - 我想用'eval'。这是我想做的一个方法。 – Leopd 2011-04-14 17:05:46

相关问题