Javascript 如何在jQuery之前加载的闭包中检查/使用jQuery?

Javascript 如何在jQuery之前加载的闭包中检查/使用jQuery?,javascript,jquery,closures,Javascript,Jquery,Closures,我有一个包含闭包的js文件,这个文件在jQuery之前加载,假设它不能移动。如何传入或检查jQuery,以便在闭包中使用它 到目前为止,我得到的是: (function MyClosure() { var interval = setInterval(function() { if (typeof jQuery !== 'undefined') { doJqueryStuff(); clearInterval(interv

我有一个包含闭包的js文件,这个文件在jQuery之前加载,假设它不能移动。如何传入或检查jQuery,以便在闭包中使用它

到目前为止,我得到的是:

(function MyClosure() {

    var interval = setInterval(function() {
        if (typeof jQuery !== 'undefined') {
            doJqueryStuff();
            clearInterval(interval);
        }
    }, 500);

    function doJqueryStuff() {
        // Some stuff with jQuery.
    }
})();

它确实有效,但有“更好”的方法吗?每当我使用
setInterval()
来处理类似的事情时,我总是认为我做错了什么,而且事实上我在这500毫秒内浪费了时间。

您可以等待并将执行附加到
窗口。onload
事件,假设一旦加载了窗口,jQuery就被加载了

window.onload = function() {
    // do stuff with jQuery
};

您可以等待并将执行附加到
窗口。onload
事件,假设jQuery在加载窗口后加载

window.onload = function() {
    // do stuff with jQuery
};

别担心——虽然它看起来确实很粗糙(至少对我和你来说),但也不错。通常情况下,您需要等待一个复杂的对象被初始化,并且需要执行相同的操作。最好的办法是确保脚本加载的顺序,以解决任何依赖性问题——但根据您的要求,让我们假设无法调整顺序

我建议的唯一改进是:在匿名setInterval函数中添加转义图案填充。这样,如果jQuery由于某种原因无法使用,脚本可以通知用户并停止检查

var checkCount = 0;
var interval = setInterval(function() {
    if (checkCount++ > 20) {
        alert("jQuery could not be loaded - degrading user experience");
        clearInterval(interval);
    }
    if (typeof jQuery !== 'undefined') {
        doJqueryStuff();
        clearInterval(interval);
    }
}, 500);

别担心——虽然它看起来确实很粗糙(至少对我和你来说),但也不错。通常情况下,您需要等待一个复杂的对象被初始化,并且需要执行相同的操作。最好的办法是确保脚本加载的顺序,以解决任何依赖性问题——但根据您的要求,让我们假设无法调整顺序

我建议的唯一改进是:在匿名setInterval函数中添加转义图案填充。这样,如果jQuery由于某种原因无法使用,脚本可以通知用户并停止检查

var checkCount = 0;
var interval = setInterval(function() {
    if (checkCount++ > 20) {
        alert("jQuery could not be loaded - degrading user experience");
        clearInterval(interval);
    }
    if (typeof jQuery !== 'undefined') {
        doJqueryStuff();
        clearInterval(interval);
    }
}, 500);

等待脚本标记上的onload事件。在这种情况下,dojquerysuff应该是一个全局函数

<script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js" onload='doJqueryStuff()'></script> 

等待脚本标记上的onload事件。在这种情况下,dojquerysuff应该是一个全局函数

<script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js" onload='doJqueryStuff()'></script> 


发生这种情况是因为jQuery包含在结束正文标记之前,但该脚本位于正文的其他位置吗?将“延迟”属性添加到此脚本的脚本元素应该可以在支持该属性的浏览器中修复它,并为不支持该属性的浏览器保留间隔。@dm03514他们使用的是
setInterval
,因此它从调用时起每隔500毫秒检查一次。您可以根据需要调整它@Vladimirs,这与OP的代码基本相同,除了他们使用的是
setInterval
,而不是
setTimeout
@igneosaur在您自己的代码中加载jQuery怎么样?(如果需要,在无冲突模式下)。然后,稍后jQuery将被缓存以进行第二次脚本加载,因此对性能的影响应该最小。这是因为jQuery包含在结束正文标记之前,但该脚本位于正文的其他位置吗?将“延迟”属性添加到此脚本的脚本元素应该可以在支持该属性的浏览器中修复它,并为不支持该属性的浏览器保留间隔。@dm03514他们使用的是
setInterval
,因此它从调用时起每隔500毫秒检查一次。您可以根据需要调整它@Vladimirs,这与OP的代码基本相同,除了他们使用的是
setInterval
,而不是
setTimeout
@igneosaur在您自己的代码中加载jQuery怎么样?(如果需要,在无冲突模式下)。然后,稍后jQuery将被缓存用于第二次脚本加载,因此对性能的影响应该最小。