您可以使用一个肮脏的技巧 - jQuery 对名为 define 的函数有一个 jsonp 回调,因此它可以与 AMD 一起正常工作。您可以将定义回调用作 jsonp 回调来运行依赖于 jQuery 的代码:
<html>
<head>
<title>Maybe jQuery</title>
</head>
<body>
<div id=status>jQuery loading...</div>
<!--<script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>-->
<script>
function jQueryReady() {
// Place your on-jQuery-load statements here
$('#status').text('jQuery loaded.');
}
if (!window.jQuery) {
define = jQueryReady;
define.amd = { jQuery: true };
var script = document.createElement('script');
script.src = '//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js';
script.async = true;
var s = document.getElementsByTagName('script')[0];
s.parentNode.insertBefore(script, s);
} else {
jQueryReady();
}
</script>
</body>
</html>
演示:http ://brass9.com/test/maybe-jquery/
由于您的问题说您在基本上可以有任何东西的第三方网站上使用它,我已经稍微修改了答案以确保如果页面上存在此代码对现有库的损害(较少) - 它实际上仍然会损害像 require.js 这样的库,如果 require 已经加载而 jQuery 没有加载,那么异步是完全可能的。我稍后会更新以解决此问题。
以前的答案(不像大卫所说的那样工作):
<script>
if (!window.jQuery) {
var script = document.createElement('script');
script.src = '//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js';
var s = document.getElementsByTagName('script')[0];
s.parentNode.insertBefore(script, s);
}
</script>
<script>
// Work with jQuery as needed
</script>