gpt4 book ai didi

javascript - 仅动态包含一次 javascript 文件

转载 作者:数据小太阳 更新时间:2023-10-29 06:03:57 25 4
gpt4 key购买 nike

我正在编写一个 javascript 函数,用于包含外部 JS 文件,但只有一次。我需要这样一个函数的原因是因为它在通过 AJAX 加载某些内容时被调用,我需要对该内容运行特定于页面的代码(不,仅使用 .live 不会涵盖它)。

这是我的尝试,为简洁起见缩短了:

$.include_once = function(filename) {
if ($("script[src='" + filename + "']").length === 0) {
var $node = $("<script></script>")
.attr({
src : filename,
type : "text/javascript"
})
;
$(document.body).append($node);
}
};

这工作正常:函数被调用,它加载外部文件,并且该文件在加载时正在运行。完美。

问题是它总是会重新加载那个外部文件:我用来检查脚本是否存在的查询总是找不到任何东西!

调试时,我添加了一些行:

alert($("script").length);     // alerts: 4
$(document.body).append($node);
alert($("script").length); // alerts: 4

查看动态源(Firebug 的 HTML 选项卡),我根本找不到脚本标签。

我知道我可以维护我之前包含的文件数组,但我希望使用这样的方法,它(如果有效)似乎更健壮一些,因为并非所有JS 文件以这种方式包含在内。

谁能解释第二个代码段中的行为?

最佳答案

在这种情况下,jQuery 有点笨;它根本不符合您的预期。当你append($node) jQuery 这样做:

jQuery.ajax({
url: $node.src,
async: false,
dataType: "script"
})

糟糕!对于本地文件(例如在同一域中),jQuery 执行标准 XMLHttpRequest对于 .js 文件主体,并通过创建 <script> 的整个复杂过程继续“评估”它标记(再次!)并将其内容设置为您的 .js 文件正文。这是为了模拟eval但在全局范围内。

对于跨域文件,由于不能执行标准的XMLHttpRequest由于同域策略,jQuery 再次创建了一个 <script>元素并将其插入 <head> .

在上面的本地和跨域情况下,jQuery 最终开始这样做:

head.removeChild(script);

然后繁荣你的.length查看!真可惜。

关于您的问题,请不要为此打扰 jQuery。就这样

document.getElementsByTagName('head')[0]
.appendChild(
document.createElement('script')
)
.src = filename;

这将按照您的预期进行,尤其是在稍后查询时。

关于javascript - 仅动态包含一次 javascript 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1878358/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com