jQuery在页面上加载得很晚,而javascript依赖于jQuery是可用的,这种情况在jQuery之前加载是非常常见的情况,特别是如果您遵循将脚本更接近</body>的做法。
所以基本上我想从以下几个方面着手:
<script>
someFunctionThatUsesLateJQuery(){ [code that relies on jQuery] }
</script>
...
<script src="jquery.js"></script>
<script>
$(function(){
someFunctionThatUsesLateJQuery();
});
</script>像这样的事情:
<script>
_$.ready(function(){ [code that relies on jQuery] });
</script>
...
<script src="jquery.js"></script>就像异步统计数据跟踪(ála Google )一样,有什么东西可以让您在加载jQuery之后注册javascript函数调用而不会出现可怕的$ is undefined错误呢?
,我的意思是在不需要注册和取消注册超时/间隔的情况下,实现。
是否有可能向jQuery添加某种预注册变量,一旦加载,它就会识别和处理这些变量吗?
用例:
值得注意的是,我得到的具体用例是一个附带的JS小部件,在这里,我希望在<script>放置的场景中进行一些DOM操作,因此在jQuery加载到</body>附近的情况下,在jQuery加载之前就有了出现的可能性。
然后,我不希望通过要求用户在代码执行的正确点(这将取决于它们的实现)注册一个特定的函数调用来进一步加重用户的负担.我想让它“工作”
发布于 2014-07-23 11:33:15
当所有函数调用转移到数据属性时,您可以尝试使用常用的解决方案。然后,在加载jQuery时,您将抛出具有这些属性的所有DOM元素,并运行此函数。也就是说,不是函数调用,而是添加data-type='load' data-function='YourNamespace.yourFunctionName',在window.load事件之后,您通过$('[data-type="load"]')选择所有元素,迭代它们,并执行函数调用。
UPD:猜测,异步函数队列模式可以用于阅读:异步设计模式的名称是什么,它在哪里使用?
发布于 2014-07-23 11:40:46
正如建议的这里是rich.okelly,您可以尝试这样做:
(function() {
var runMyCode = function($) {
// jquery-dependent code here
$("#foo").data('bar', true);
};
var timer = function() {
if (window.jQuery && window.jQuery.ui) {
runMyCode(window.jQuery);
} else {
window.setTimeout(timer, 100);
}
};
timer();
})();我还找到了一个更复杂的解决方案,但我个人更喜欢上面的解决方案而不是这个解决方案。
不超时的更新:
<script>
var runMyCode = function($) {
// jquery-dependent code here
$("#foo").data('bar', true);
};
</script>
...
<script src="jquery.js"></script>
<script>
$(function(){
runMyCode(window.jQuery);
});
</script>发布于 2014-07-24 10:44:57
如果注入jQuery脚本包含,则可以侦听onload事件。
function loadJS(url, onloadCallback, elId){
//Inject script include into HEAD
var scriptEl = document.createElement('script');
scriptEl.type = 'text/javascript';
scriptEl.src = url;
if(elId)scriptEl.id = elId;
document.getElementsByTagName('head')[0].appendChild(scriptEl);
if(onloadCallback){
scriptEl.onload = scriptEl.onreadystatechange = function(){
if(!scriptEl.readyState || (scriptEl.readyState === 'complete' || scriptEl.readyState === 'loaded')){
onloadCallback();
scriptEl.onload = scriptEl.onreadystatechange = null;
}
}
}
}
loadJS("http://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js", function(){
console.log( window.$ );
});https://stackoverflow.com/questions/24909230
复制相似问题