包括javascripts不工作

时间:2012-10-19 07:44:23

标签: javascript jquery

我发现了一个包含javascripts的小javascript片段,只要它们之前没有包含在内。

这正在使用我自己的脚本,但是有两个第三方库,它不起作用,我真的不知道为什么。

    var included_files = new Array();
    function include_once(script_filename) {
        if (!in_array(script_filename, included_files)) {
            included_files[included_files.length] = script_filename;
            include_dom(script_filename);
        }
    }
    function in_array(needle, haystack) {
        for (var i = 0; i < haystack.length; i++) {
            if (haystack[i] == needle) {
                return true;
            }
        }
        return false;
    }
    function include_dom(script_filename) {
        var html_doc = document.getElementsByTagName('head').item(0);
        var js = document.createElement('script');
        js.setAttribute('language', 'javascript');
        js.setAttribute('type', 'text/javascript');
        js.setAttribute('src', script_filename);
        html_doc.appendChild(js);
        return false;
    }

function loaded() {
    include_once("shared/scripts/jquery.min.js");
    include_once("shared/scripts/iscroll.js");

    $(document).ready(function () {
        alert("hello");
    });
}

错误:$未定义。 如果我以常规的方式导入jQuery它的工作并且它没有定义“iScroll”(因为我以后使用它)。

有什么想法吗?

4 个答案:

答案 0 :(得分:7)

include_dom是异步的。它并行加载脚本,您无法确定何时加载脚本。您尝试在开始下载后立即使用jQuery,但这不起作用。

您需要使用允许您为加载的脚本指定回调的脚本。我推荐require.js

答案 1 :(得分:4)

您正在将脚本添加到DOM中,但在尝试使用它们提供的功能之前不要让它们加载。

您需要将回调绑定到要添加的脚本元素的load事件。

(至少在大多数浏览器中,您可能必须在其他浏览器中实现一些黑客攻击;您可能希望检查jQuery的getScript方法的源代码)。

答案 2 :(得分:2)

使用脚本加载器。 yepnope将完成您要做的所有事情以及更多

答案 3 :(得分:2)

有人说回电吗?

function include_once(script_filename, callback) {
        if (!in_array(script_filename, included_files)) {
            included_files[included_files.length] = script_filename;
            include_dom(script_filename, callback);
        }
    }

function include_dom(script_filename, callback) {
    var html_doc = document.getElementsByTagName('head').item(0);
    var js = document.createElement('script');
    js.setAttribute('language', 'javascript');
    js.setAttribute('type', 'text/javascript');
    js.setAttribute('src', script_filename);
    if(callback && callback != 'undefined'){
        js.onload =  callback;
        js.onreadystatechange = function() {
            if (this.readyState == 'complete') callback();
        }
    }
    html_doc.appendChild(js);
    return false;
}

function loaded() {
    include_once("shared/scripts/jquery.min.js", function(){
        $(document).ready(function () {
            alert("hello");
        });
    });
    include_once("shared/scripts/iscroll.js");
}