0

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

スクリプト要素を追加しようとしています。この要素には、がありvar myVar = "hello world"、その直後にを使用しますmyVar。残念ながら、私が以上のことをしない限り、typeof myVarです。 のは動作しません。スクリプト要素を作成するGoogleAnalyticの方法をコピーしましたが、問題なく機能しているようです。私は何かが足りないのですか?undefinedsetTimeout0setTimeout0

注:何らかの理由で、jsbinは、このコードを.htmlファイルにコピーして貼り付けてローカルで試す場合と同じように動作しません。jsbinにはすでに遅延があり、それが機能していると思いsetTimeoutます0

(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は、、またはjqueryのようなイベントを使用するのが最適です。ready

 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 に答える