我有一个我写的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);
}
};
Run Code Online (Sandbox Code Playgroud)
这样可以正常工作:调用该函数,它加载外部文件,并在加载时运行该文件.完善.
问题是它将始终重新加载该外部文件:我用来检查脚本是否存在的查询总是找不到任何东西!
在调试时,我添加了一些行:
alert($("script").length); // alerts: 4
$(document.body).append($node);
alert($("script").length); // alerts: 4
Run Code Online (Sandbox Code Playgroud)
查看动态源代码(Firebug的HTML选项卡),我根本找不到脚本标记.
我知道我可以维护一个我以前包含的文件数组,但是我希望使用这样的方法,如果它工作的话,它看起来更健壮了,因为不是所有的JS文件都是以这种方式包括在内.
任何人都可以解释在第二个片段中看到的行为吗?
在这种情况下,jQuery有点愚蠢; 它完全不符合你的期望.当你append($node)jQuery做到这一点:
jQuery.ajax({
url: $node.src,
async: false,
dataType: "script"
})
Run Code Online (Sandbox Code Playgroud)
Woops!对于本地文件(例如在同一个域上),jQuery XMLHttpRequest为.js文件体执行标准,并通过创建<script>标记的整个复杂过程(再次!)继续"评估"它,并将其内容设置为.js文件身体.这是为了模拟,eval但在全球范围内.
对于跨域文件,由于XMLHttpRequest同一域策略无法执行标准,jQuery会再次创建一个<script>元素并将其插入<head>.
在上面的本地和跨域案例中,jQuery 终于可以做到这一点:
head.removeChild(script);
Run Code Online (Sandbox Code Playgroud)
并鼓励你的.length检查!游民.
所以关于你的问题,不要打扰jQuery.做就是了
document.getElementsByTagName('head')[0]
.appendChild(
document.createElement('script')
)
.src = filename;
Run Code Online (Sandbox Code Playgroud)
哪个会做你期望的,尤其是稍后查询它.
| 归档时间: |
|
| 查看次数: |
5267 次 |
| 最近记录: |