2012-05-21 34 views
0

我有两个文件(html和js),如下所示。无法设置外部JavaScript文件的变量

的test.html

<body> 
    <script> 
    /*Loads the fb api*/ 
    window.fbAsyncInit = function() { 
     FB.init({ 
     appId  : '<APP-ID>', 
     status  : true, 
     cookie  : true, 
     xfbml  : true, 
     oauth  : true, 
     }); 
    TimelineScript(); /* function that loads the external javascript */ 
    }; 
    (function(d){ 
     var js, id = 'facebook-jssdk'; if (d.getElementById(id)) {return;} 
     js = d.createElement('script'); js.id = id; js.async = true; 
     js.src = "//connect.facebook.net/en_US/all.js"; 
     d.getElementsByTagName('head')[0].appendChild(js); 
    }(document)); 

    . . . 
    . . . 
    . . . 

    function TimelineScript(){ 
    FB.getLoginStatus(function(response) { 
    if (response.status === 'connected') { 
     var dt = new Date(); 
     var _testvar = 100;/*Used in the external javascript file*/  

     /*Loading my external javscript*/ 
     (function() { 
      var sa = document.createElement('script'); 
      sa.type = 'text/javascript'; 
      sa.async = true; 
      sa.src = 'http://www.mywebsite.com/javascripts/testing.js?random='+dt.getTime(); 
      var script_tag = document.getElementsByTagName('script')[0]; 
      script_tag.parentNode.insertBefore(sa, script_tag); 

      })(); 

    } else if (response.status === 'not_authorized') { 
     alert("the user is logged in to Facebook, but not auth your app"); 
    } else { 
     alert('user is not logged into fb!'); 
    } 
    }); 
} 

</script> 

    . . . 
    . . . 
    . . . 

    </body> 

testing.js

alert('loaded testing .js'); //works 
alert(_testvar); //throws error 

在testing.js文件警报抛出了在Firebug控制台错误_testvar is not defined。如果我有一个纯粹的脚本(没有所有的facebook api代码)只是声明一个变量,然后加载外部js,警报工作正常。这种情况出了什么问题?

回答

0

的Javascript会为您创建的每个功能的新的变量范围,不管是匿名与否。

所以在下面的代码_testvar是当地的匿名功能,不通别的,至少所有其它脚本文件:

function TimelineScript(){ 
    FB.getLoginStatus(function(response) { 
    if (response.status === 'connected') { 
     var dt = new Date(); 
     var _testvar = 100;/*Used in the external javascript file*/  
+0

Thanx! Dint看到了! – serpent403

0

如果你在函数的外部定义了“_testvar”,它应该可以工作。这允许跨范围只是一个功能外使用的变量:

<script> 
var _testvar = 0; 
.... 
function TimelineScript(){ 
FB.getLoginStatus(function(response) { 
    if (response.status === 'connected') { 
     var dt = new Date(); 
     _testvar = 100;/*Used in the external javascript file*/  

     /*Loading my external javscript*/ 
     (function() { 
      var sa = document.createElement('script'); 
      sa.type = 'text/javascript'; 
      sa.async = true; 
      sa.src = 'http://www.mywebsite.com/javascripts/testing.js?random='+dt.getTime(); 
      var script_tag = document.getElementsByTagName('script')[0]; 
      script_tag.parentNode.insertBefore(sa, script_tag); 

     })(); 

    } else if (response.status === 'not_authorized') { 
    alert("the user is logged in to Facebook, but not auth your app"); 
    } else { 
    alert('user is not logged into fb!'); 
    } 
}); 

}

0

变量_testvar通过FB.getLoginStatus定义 asynchronus(我认为)电话。 因此,当你测试变量的时候(即马上),这还没有设置,因为FB试图获得登录状态。

这是因为异步模式;您可能会尝试设置同步模式,或者在获取异步响应时,而不是在代码之后检查_testvar