Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/419.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript doc.ready()和parseHtml_Javascript_Jquery_Ajax - Fatal编程技术网

Javascript doc.ready()和parseHtml

Javascript doc.ready()和parseHtml,javascript,jquery,ajax,Javascript,Jquery,Ajax,因此,通过ajax检索一些html并使用.html(parseHtml(result,true))将其插入页面时,看起来就像是这样,即执行结果中的javascript时不考虑doc.ready 我猜这是因为父页面本身已经“准备就绪”,并且对于通过解析HTML插入页面的HTML片段+脚本,没有准备就绪事件的概念/实现 我是这样测试的。通常您会期望输出为1,3,2,因为doc ready将在最后出现,但我得到的输出是1,2,3。但这可能纯粹是巧合 console.log('1'); $(docum

因此,通过ajax检索一些html并使用
.html(parseHtml(result,true))将其插入页面时,看起来就像是这样,即执行结果中的javascript时不考虑doc.ready

我猜这是因为父页面本身已经“准备就绪”,并且对于通过解析HTML插入页面的HTML片段+脚本,没有准备就绪事件的概念/实现

我是这样测试的。通常您会期望输出为1,3,2,因为doc ready将在最后出现,但我得到的输出是1,2,3。但这可能纯粹是巧合

console.log('1');

$(document).ready(function () {
    console.log('2');
});
console.log('3');
某些代码在doc.ready中无法正常工作,无法初始化tinyMce编辑器,但如果我在其上设置500毫秒延迟以假装等待doc.ready,则可以正常工作。因此,在将新的html集成到DOM之前,javascript运行得太快似乎是一个问题。显然,这个setTimeout是一个无法持续工作的黑客

所以我的问题是:

结果中的.html($.parseHtml)是否尊重doc.ready,因为它等待新的html在DOM中准备好运行该脚本? 是否有其他方法将脚本包含在ajax html结果中,并让其等待运行,直到添加的html在dom中“就绪”为止?

来自

如果在初始化DOM后调用.ready(),则将立即执行传入的新处理程序

请注意,这通常指的是DOM。当您稍后使用AJAX加载其他元素时,DOM仍处于其初始化状态,因此上述内容适用


如果使用
.load()
加载包含
元素的HTML,我相信所有脚本都将在其他元素添加到DOM后执行。因此,无需使用
$(document).ready()
在这些脚本中,但这样做应该没有什么害处。

您的猜测是正确的。一旦加载了初始文档,
document.ready()
立即执行其功能。它与加载的AJAX文档无关。但是,我相信
.load()
在将所有HTML插入DOM之前不会执行任何Javascript。感谢Barmar。至于.load,我已经测试过了,正在查看源代码,它看起来只执行了
.HTML(
:我试图将所有内容封装在部分HTML中,但看起来我应该将javascript拉出到它自己的js文件中,由父页面加载并调用,这样我就可以控制它何时运行。您必须非常仔细地遵循代码。jQuery在调用
.HTML()之前从HTML中提取所有
标记
。然后它创建一个
节点来执行它找到的所有脚本。实际上,我认为它可能是
.html()
就是这样。它需要特别处理脚本,因为分配给
。innerHTML
不会执行脚本。我告诉过你这很复杂。我认为相关的代码在
domManip
后面
if(hasScripts)
。就最后一部分而言,似乎你是在暗示。load的行为与.html不同。我的观点是.load只调用.html,所以.load什么都不做。html不做脚本处理。就我自己的测试而言。load的行为与.ajax相同。完成(.html),我从未暗示过。
.load()
只是
.ajax()
+
.html()
的简写。不,不是我说的。“你是在暗示.load将与.html”关键字的行为不同。如果我暗示了这一点,那是无意的。在上面的一条评论中,我写道“实际上,我认为可能是.html()实现了这一点”where“this”指延迟Javascript的执行,直到所有剩余的HTML都添加到DOM中。我的意思是:.load使用.HTML,而.HTML延迟脚本的执行,因此这意味着.load也会这样做。