0

http://jsbin.com/iwuhum/1/

我正在尝试添加一个脚本元素,该元素具有var myVar = "hello world",并且紧随其后,我想使用myVar. 不幸的typeof myVarundefined,除非我做的setTimeout不止一个0setTimeout0不起作用。我复制了 Google Analytic 创建脚本元素的方法,他们似乎让它工作得很好。我错过了什么吗?

注意:由于某种原因,jsbin 的行为与将这段代码复制/粘贴到 .html 文件并在本地尝试不同。我想 jsbin 已经有一个延迟,这使得setTimeoutof0工作。

(function () {
    var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.defer = false;
    ga.src = 'http://bakersdozen13.lfchosting.com/test.js';
    var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
})(); // note: the () executes it immediately (or it should!)

$("#out").append('typeof myVar is ' + typeof myVar); // "undefined" :(

setTimeout(function() {
    $("#out").append('<br/>typeof myVar is ' + typeof myVar); // "undefined" :(
}, 0);    

setTimeout(function() {
    $("#out").append('<br/>typeof myVar is ' + typeof myVar); // "string"
}, 1000);
4

2 回答 2

3

我会认为这里的问题是脚本在您第一次调用 typeof 时尚未加载。

您最好使用onload或类似 jqueryready的事件来触发脚本加载时的回调。

 ga.onload = function(){
        $("#out").append('typeof myVar is ' + typeof myVar);
    }

作为对评论的回应,类似以下的内容应该可以工作,但这是一个坏主意:

var xhReq = new XMLHttpRequest();
//The false at the end makes the request sychronous
xhReq.open("GET", "http://bakersdozen13.lfchosting.com/test.js", false);
xhReq.send(null);
// I know eval is evil, but this is just a demonstration. This won't happen until the page is loaded.
eval(xhReq.responseText);
// Assuming myVar is a global variable initialized within the script this should now work
$("#out").append('typeof myVar is ' + typeof myVar);

进一步阅读:https ://developer.mozilla.org/en-US/docs/DOM/XMLHttpRequest/Synchronous_and_Asynchronous_Requests

于 2013-01-16T21:06:10.703 回答
1

脚本文件必须加载。没有办法等待它加载。由于看起来您正在使用 jQuery,因此请使用 getScript()

$.getScript("http://bakersdozen13.lfchosting.com/test.js", function() { 
    alert(myVar);
});

JSFiddle

于 2013-01-16T21:23:48.510 回答