我使用以下命令将jQuery库附加到dom:
var script = document.createElement('script');
script.src = 'https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js';
script.type = 'text/javascript';
document.getElementsByTagName('head')[0].appendChild(script);
但是当我跑步时:
jQuery(document).ready(function(){...
控制台报告错误:
Uncaught ReferenceError: jQuery is not defined
如何动态加载jQuery以及在dom中使用它?
答案 0 :(得分:111)
这里有一个有效的JSFiddle,其中有一个小例子,它可以准确显示您正在寻找的内容(除非我误解了您的请求):http://jsfiddle.net/9N7Z2/188/
这种动态加载JavaScript的方法存在一些问题。当谈到非常基础的框架,比如jQuery,你实际上可能想要静态加载它们,否则,你将不得不编写一个完整的JavaScript加载框架...
您可以使用一些现有的JavaScript加载器,或者通过观察window.jQuery
来定义自己编写。
// Immediately-invoked function expression
(function() {
// Load the script
var script = document.createElement("SCRIPT");
script.src = 'https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js';
script.type = 'text/javascript';
script.onload = function() {
var $ = window.jQuery;
// Use $ here...
};
document.getElementsByTagName("head")[0].appendChild(script);
})();
请记住,如果您需要支持 真正的 旧浏览器(如IE8),load
事件处理程序不会执行。在这种情况下,您需要使用重复的window.jQuery
轮询window.setTimeout
的存在。这里有一个有效的JSFiddle:http://jsfiddle.net/9N7Z2/3/
有很多人已经完成了你需要做的事情。查看一些现有的JavaScript Loader框架,例如:
答案 1 :(得分:7)
还有另一种动态加载jQuery的方法(source)。你也可以使用
document.write('<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"><\/script>');
使用document.write
被认为是不好的做法,但为了完成,最好提及它。
请参阅Why is document.write considered a "bad practice"?了解原因。 专家是document.write
阻止您的网页加载其他资源,因此无需创建回调函数。
答案 2 :(得分:6)
<强> Encosia's website recommends: 强>
<script type="text/javascript"
src="http://www.google.com/jsapi"></script>
<script type="text/javascript">
// You may specify partial version numbers, such as "1" or "1.3",
// with the same result. Doing so will automatically load the
// latest version matching that partial revision pattern
// (e.g. 1.3 would load 1.3.2 today and 1 would load 1.7.2).
google.load("jquery", "1.7.2");
google.setOnLoadCallback(function() {
// Place init code here instead of $(document).ready()
});
</script>
但即使他承认,只有在达到最佳性能时才做以下比较:
<script src="//ajax.aspnetcdn.com/ajax/jQuery/jquery-1.7.2.min.js" type="text/javascript"></script>
<script type="text/javascript"> window.jQuery || document.write('<script src="js/libs/jquery-1.7.2.min.js">\x3C/script>')</script>
<script type="text/javascript" src="scripts.js"></scripts>
</body>
</html>
答案 3 :(得分:2)
你需要在jQuery完成加载后运行你的代码
var script = document.createElement('script');
document.head.appendChild(script);
script.type = 'text/javascript';
script.src = "//ajax.googleapis.com/ajax/libs/jquery/3.1.0/jquery.min.js";
script.onload = function(){
// your jQuery code here
}
或者如果您在异步功能中运行它,可以在上面的代码中使用await
var script = document.createElement('script');
document.head.appendChild(script);
script.type = 'text/javascript';
script.src = "//ajax.googleapis.com/ajax/libs/jquery/3.1.0/jquery.min.js";
await script.onload
// your jQuery code here
如果您想首先检查页面中是否已存在jQuery,请尝试this
答案 4 :(得分:0)
HTML:
<html>
<head>
</head>
<body>
<div id='status'>jQuery is not loaded yet.</div>
<input type='button' value='Click here to load it.' onclick='load()' />
</body>
</html>
脚本:
<script>
load = function() {
load.getScript("jquery-1.7.2.js");
load.tryReady(0); // We will write this function later. It's responsible for waiting until jQuery loads before using it.
}
// dynamically load any javascript file.
load.getScript = function(filename) {
var script = document.createElement('script')
script.setAttribute("type","text/javascript")
script.setAttribute("src", filename)
if (typeof script!="undefined")
document.getElementsByTagName("head")[0].appendChild(script)
}
</script>
答案 5 :(得分:0)
您收到此错误的原因是JavaScript不等待加载脚本,因此当您运行时
jQuery(document).ready(function(){...
无法保证脚本已准备好(永远不会)。
这不是最优雅的解决方案,但可行。基本上,你可以检查jQuery对象广告每1秒运行一个函数,当它加载你的代码时。我会添加一个超时(比如运行20次后的clearTimeout)以阻止检查无限期地发生。
var jQueryIsReady = function(){
//Your JQuery code here
}
var checkJquery = function(){
if(typeof jQuery === "undefined"){
return false;
}else{
clearTimeout(interval);
jQueryIsReady();
}
}
var interval = setInterval(checkJquery,1000);
答案 6 :(得分:0)
使用require.js,您可以以更安全的方式执行相同的操作。您可以只定义对jquery的依赖关系,然后在加载时使用依赖项执行所需的代码,而不会污染命名空间:
我通常建议使用此库来管理Javascript的所有依赖项。它很简单,可以有效地优化资源加载。但是,在使用JQuery时可能需要考虑一些precautions。我最喜欢的处理它们的方法在github repo中进行了解释,并通过以下代码示例反映出来:
<title>jQuery+RequireJS Sample Page</title>
<script src="scripts/require.js"></script>
<script>
require({
baseUrl: 'scripts',
paths: {
jquery: 'https://ajax.googleapis.com/ajax/libs/jquery/1.6.0/jquery.min'
},
priority: ['jquery']
}, ['main']);
</script>