我的HTML中有内联javascript。需要动画或动作的每个单独组件(滑块,扩展文本区域等)都有自己的内联脚本,可以为该单个组件设置动画等。
我设置它的方式,每个脚本都是位置相关的:它引用自己在DOM中的位置,并遍历它以找到它想要操作的组件(例如“添加onclick到父div”)。出于以下几个原因,这通常是一个非常糟糕的主意:
然而,第二个问题很容易通过GZIP解决,我已经解决了第一个也是最后一个问题。
这具有引用局部性的优点:它们所需的组件和脚本保存在一个地方,而不是分散在单独的文件上。此外,我在(function(){})()中隔离了每组脚本,并避免污染全局命名空间,因此每个组件的每组脚本都写入一次,并且不与其他地方编写的脚本交互。完美的模块化
所以问题是,当我进行Ajax DOM插入/替换时,如何阻止JQuery吃掉我的脚本标签?如果它没有吃掉我的脚本,因为每个组件都是完全独立的,并且有自己的脚本,我可以简单地在新组件的DOM中运行每个脚本标签,那就是那个;一切都将成立。不再需要根据改变的组件决定需要重新运行哪些全局脚本。
然而,由于JQuery似乎坚持剥离我的脚本标签并将它们移动到某个地方,因此它不再起作用。我可以通过修改替换整个文档的HTML来进行插入,但这会导致整个屏幕在重新流动时闪烁(以及其他问题)。有什么想法吗?
答案 0 :(得分:0)
在你的html中使用容器div保留所有替换的空间,这样你通过AJAX替换的所有内容在DOM中都有一个特殊的位置。 jQuery不会吃掉你的脚本标签。
或者,您也可以在脚本标记上添加id,然后使用ID访问。
答案 1 :(得分:0)
我不明确地了解jQuery,但是大多数库将从XHR返回的内容中删除脚本元素,这些内容是他们打算使用innerHTML插入的。这是因为插入innerHTML不会执行脚本(在绝大多数浏览器中)。查看jQuery源代码, load 方法将删除脚本元素。
因此,他们删除脚本元素,然后插入HTML。这可确保脚本不会被执行或导致问题。
某些库有一个“执行脚本”(或类似)标志,如果设置,则意味着它们会将脚本元素内容传递给 eval ,但也存在陷阱。
一种解决方案是将所有脚本片段放入单独的文件中,然后在脚本元素上使用src属性。如果找不到不删除脚本的jQuery方法,那么编写自己的“get”或“load”或任何不支持的函数,或使用已编写的数千个函数中的一个,都非常简单。
如果您只使用脚本元素,则只需创建一个脚本元素,设置 src 属性并将其放入DOM(这是一种执行AJAX的方法)。