0

我正在尝试获取 TestService.Server.WWW_SERVER_URL,但 TestService.Server 未定义。当我调用 test1() 时,它运行良好。但我无法访问对象文字 TestServer。有不同的方法吗?

测试.html

<script type="text/javascript" language="javascript" src="TestService.js"></script>
<script type="text/javascript" language="javascript">
    function test() {
        alert("TestService.Server.WWW_SERVER_URL[" + TestService.Server.WWW_SERVER_URL + "]");
        //test1();
    }
</script>

测试服务.js

document.write("<scr" + "ipt type='text/javascript' src='TestServer.js'><" + "/scr" + "ipt>");

var TestService = {
    Server: TestServer,
    Delimiter: ""
};

function test1() {
    test2();
}

测试服务器.js

var TestServer = {
    WWW_SERVER_URL: "http://www.test.com"
};


function test2() {
    alert("test2 has been called!");
}
4

2 回答 2

1

你的 TestService.js 中有这个

document.write("<scr" + "ipt type='text/javascript' src='TestServer.js'><" + "/scr" + "ipt>");

var TestService = {
    Server: TestServer,
    Delimiter: ""
};

您正在尝试设置尚未加载的属性,TestService因为TestServer您没有时间加载新添加的脚本

TestService.Server将评估为undefined因为TestServer尚不存在

设置一个 onload 函数,该函数将添加您的脚本,然后在加载时设置您的 TestService.Server 变量

var TestService = {
    Server: null,
    Delimiter: ""
};

function test1() {
    test2();
}

window.onload = function() {
    var head = document.querySelector("head");
    var script = document.createElement("script"); 
    script.setAttribute("type", "text/javascript");
    script.setAttribute("src", "TestServer.js");

    head.addEventListener("load", function(event) {
        if (event.target.nodeName === "SCRIPT"){
            TestService.Server = TestServer;
        }
    }, true);

    head.appendChild(script); 
}
于 2013-09-24T02:03:04.690 回答
0

如果您动态附加脚本,IE、Firefox 和 Chrome 都会以异步方式下载脚本。

Firefox 和 Chrome 将等到所有异步请求返回,然后将按照它们在 DOM 中附加的顺序执行脚本,但 IE 按照它们通过网络返回的顺序执行脚本。

资源

在你的情况下,你不能保证TestServer.js之前被执行TestService.js。所以我会建议你改变你访问全局变量交叉文件的方式。

您可以在之前添加TestServer.js到您的 html 中TestService.js,以便它们可以一一执行。

无论如何,不​​建议这样做,您可以将它们包装在自己的命名空间中。另外,您最好在使用之前检查要跨文件使用的变量是否未定义。

于 2013-09-24T02:09:01.513 回答