【问题标题】:Javascript script/dom dependency?Javascript脚本/dom依赖?
【发布时间】:2013-01-26 23:21:49
【问题描述】:

在帮助某人拥有一个相当大且包含许多内容的网站时,我遇到了一个错误并且无法理解它。是这样的

<script src=...></script>
<div ...
<script>
alert('myscript');
</script>

在我使用 html 的那部分并使用 jquery 将内容 ajax 输入之前,此页面运行良好。它破坏了代码,但我不明白为什么。我看到了我的警报。我可以看到脚本正在通过浏览器网络日志进行访问。我看到了第一个脚本标记的一些结果,但它已损坏。

为什么顺序很重要?我认为只要 dom 准备好并且脚本执行完毕,一切都应该没问题。但在这种情况下,被 ajaxed 打破它。我不能花太多时间,但很高兴看到某些事情取决于时间。

--edit--
我还注意到,如果该脚本已经包含在页面 ajaxing 的内容中,它将运行良好

有人知道为什么内容中的 ajaxing 会中断吗?当它没有被罚款时。

【问题讨论】:

  • 您应该将用于 ajax 的代码发布到页面中。在某些情况下,jQuery 在注入内容时会忽略脚本。
  • 请出示您的代码。我们还能怎么看问题出在哪里?
  • @Pointy:什么情况?我无法访问上述代码。
  • @acidzombie24 如果您使用.load() 变体,它允许在 url 后使用选择器字符串:$('#foo').load('http://what.ever #content-I-want', function() { ... }),则所选内容块中的脚本将不会被执行。

标签: javascript ajax


【解决方案1】:

根据你的说法,我给出以下评价:

40% 的可能性——这与脚本加载有关。 ajaxed 脚本中对其他脚本的依赖关系、您在页面上定义的变量,甚至应该加载的 DOM 内容,在脚本被 ajaxed 和执行时可能不会被加载。 尝试更改页面上脚本标记的顺序,将脚本的加载放在文档ready 事件处理程序中,或者使用 setTimeout 或 defer="defer" 延迟脚本执行——或者如果你真的很酷,创建一个引导加载程序这确保每个脚本都按照您指定的确切顺序加载和执行:通过将无依赖的同时加载集链接到依赖加载的序列。

Script1

所以首先加载 1,然后是所有 2. 脚本,然后是 3.

40% 的可能性——这与安全模型有关。您从哪个网站进行 ajaxing,那在哪里?它与页面所在的域有什么关系?你在localhost 上测试这个吗?如果是这样,有更多的限制。在实际服务器上呢?是否在 ajax 响应中正确设置了 Access-Control-Allow-Origin 标头?

20% 的可能性——这是脚本和 DOM 之间的循环依赖。假设元素 X 上的某个事件处理程序在引用元素 X 的范围内关闭。然后在对 X 的引用中会有对 X 的引用,因此它们不能都被垃圾收集,因此 X 将持续存在,导致内存泄漏,并且可能会创建一个不可用的引用,这可能会破坏您的代码。

--编辑--

根据您对 .html(...) 的评论,我认为运行脚本的 .html 或 .load 太杂乱,甚至可能根本不起作用。请参阅.load() doesn't load scripts 了解使用 ajax 加载脚本的好方法。或者你可以jQuery.getScript(...)

此外,我似乎记得即使使用 ajax 从纯 HTML 加载 html 节点时也会遇到问题。这对我来说似乎太乱了。如果您想通过 ajax 传输结构化信息,请使用 JSON,然后使用 javascript 和 HTML 在您身边呈现该信息。所以,不要抓整个数据+演示,只抓数据,然后在你身边做自己的演示。它整洁多了。

【讨论】:

  • 内存泄漏不会造成这么严重的问题。
  • +1。我将补充一点,它使用 iis 在 localhost 上运行。 ajaxing 使用 jquery.html(thepage),它位于同一域 (localhost) 上,并且在页面加载后 (10+sec) 做得很好。我不知道标题设置为我没想到的。
  • @icktoofay ...对。但是,隐藏在事件处理程序中某个封闭范围内的不可用引用可能会也可能不会显示在调试器上,可能会默默地失败。
  • 如果附加事件处理程序的元素从 DOM 中移除,但是由于垃圾收集器不处理循环引用,它和事件处理程序被保留,那么,好吧,他们'被保留。如果在该元素上触发了适当的事件,则将调用事件处理程序,但没有从根到元素的引用,因此不会触发任何事件。除了内存不足之外,我看不出它会出现什么问题。
  • 如果它对对象进行了垃圾收集,但仍然存在对该垃圾收集对象的内存位置的引用,这不被视为对该对象的引用,因为 GC 没有遵循循环引用,所以现在存在对 javascript 不知道是垃圾的垃圾内存位置的引用,但 GC 不知道存在,然后在引用上触发事件并撞到一面坏墙和默默地失败? Javascript 是一个无底之谜,其深度尚未完全探明
猜你喜欢
  • 1970-01-01
  • 2012-02-27
  • 2013-08-17
  • 2015-09-22
  • 1970-01-01
  • 1970-01-01
  • 2017-11-09
  • 2019-12-25
  • 2010-09-05
相关资源
最近更新 更多