我有一个$(document).ready函数(显示移动菜单),它必须等待jQuery导入。我注意到有时它会出现,有时它不依赖于jQuery首先加载。 jQuery导入异步加载。我想延迟$(document).ready函数,直到确定jQuery已经加载为止。我尝试使用延迟和异步但它似乎不起作用。我也尝试添加setTimeout()但它也不起作用。
<script async='async' src='https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js' type='text/javascript' />
<script defer='defer' async='async' type='text/javascript'>
;(function ($, document, window) { var
// default settings object.
defaults = {
label: 'MENU',
duplicate: true,
duration: 200,
easingOpen: 'swing',
easingClose: 'swing',
closedSymbol: '►',
openedSymbol: '▼',
prependTo: 'body',
parentTag: 'a',
closeOnClick: false,
allowParentLinks: false,
nestedParentLinks: true,
showChildren: false,
init: function(){},
open: function(){},
close: function(){}
},... </script>
答案 0 :(得分:2)
问题是您将jQuery加载为异步:
<script async='async' <----------- this is the problem
src='https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js'
type='text/javascript'
/>
async
属性告诉您的浏览器在页面上执行所有其他javascript代码之后可以加载此文件。解决方案是删除async
。
是,但仅适用于页面上其他脚本不依赖的脚本。对于像jQuery这样的库,你需要确定它已被加载,你不应该使用async
。
是的,解决方法是在<head>
标记关闭之前将所有脚本标记移到页面底部<body>
之外:
<html>
<head></head>
<body>
some stuff...
<script src='https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js' type='text/javascript' />
<script type='text/javascript'>
;(function ($, document, window) { var
// default settings object.
defaults = {
label: 'MENU',
duplicate: true,
duration: 200,
easingOpen: 'swing',
easingClose: 'swing',
closedSymbol: '►',
openedSymbol: '▼',
prependTo: 'body',
parentTag: 'a',
closeOnClick: false,
allowParentLinks: false,
nestedParentLinks: true,
showChildren: false,
init: function(){},
open: function(){},
close: function(){}
},... </script>
</body>
</html>
嗯,你仍然可以将你的脚本放在头脑中,但它有点牵扯。基本上你需要监听jquery脚本标记的onload事件。但这意味着您需要动态创建标记,而不是在html中对其进行硬编码:
<html>
<head>
<script>
var jq = document.createElement('script');
jq.src = "https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js";
jq.async = true; // you can still load as async!
jq.onload = function () {
(function ($, document, window) { var
// default settings object.
defaults = {
label: 'MENU',
duplicate: true,
duration: 200,
easingOpen: 'swing',
easingClose: 'swing',
closedSymbol: '►',
openedSymbol: '▼',
prependTo: 'body',
parentTag: 'a',
closeOnClick: false,
allowParentLinks: false,
nestedParentLinks: true,
showChildren: false,
init: function(){},
open: function(){},
close: function(){}
},...
};
document.head.appendChild(jq);
</script>
</head>
<body> .... </body>
</html>
答案 1 :(得分:0)
将您的$(document).ready
功能作为页面上的最后一个脚本。
您可能需要考虑将加载JQuery的脚本放在文档的<head>
中,以确保它在调用之前加载。