4

以下代码遇到错误SCRIPT5009: "jQuery" is undefined in IE9(可能也在较旧的 IE 版本中):

var $tx;
if (window.jQuery) {
    $tx = jQuery;
    if( jQuery().jquery.replace(".", "") < 17.1 ) {
        addjQuery();
    }   
} else {
    addjQuery();
}
function addjQuery() {
    document.write('<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"><\/script>');
    document.write('<script type="text/javascript">$tx = jQuery.noConflict();<\/script>');
}
document.write('<script src="workingScript.js"><\/script>');

我解决了!它以这种方式工作正常:

var $tx;
if (window.jQuery) {
    $tx = jQuery;
    if( jQuery().jquery.replace(".", "") < 17.1 ) {
        addjQuery();
    }   
} else {
    addjQuery();
}
function addjQuery() {
    loadScript("http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js", function(){
        $tx = jQuery.noConflict(true);
    });
}
document.write('<script src="workingScript.js"><\/script>');

function loadScript(url, callback){

    var script = document.createElement("script")
    script.type = "text/javascript";

    if (script.readyState){  //IE
        script.onreadystatechange = function(){
            if (script.readyState == "loaded" ||
                    script.readyState == "complete"){
                script.onreadystatechange = null;
                callback();
            }
        };
    } else {  //Others
        script.onload = function(){
            callback();
        };
    }
    script.src = url;
    document.getElementsByTagName("head")[0].appendChild(script);
}

工作脚本.js:

(function ($) {
    // some code here
})($tx);

错误发生在这里“$tx = jQuery.noConflict();” 如果addjQuery函数被调用。如果网站已经使用当前的 jQuery 版本,那么一切都可以正常工作。

有谁知道如何解决这个问题?

4

1 回答 1

3

您的脚本在执行期间会加载其他脚本,它们不会同步执行,而是异步执行。执行时$tx = jQuery.noConflict();不能保证 jQuery 已加载。

如果您需要同步执行此操作,请查看此问题,或者最好使用RequireJS之类的工具来为您处理此问题。(它也允许这种回退)。

于 2013-04-07T14:41:22.340 回答