全局变量在<script>标记内定义。但是在<script>标记之外访问它时会被覆盖

时间:2018-01-05 01:57:00

标签: javascript node.js facebook-javascript-sdk ejs

我正在尝试在HTML中访问Facebook SDK。

&#xA;&#xA;

我有一个全局变量 accessToken 。此变量的值将在SDK内生成。 SDK包含在&lt; script&gt; 标记内的ejs文件中。

&#xA;&#xA;

我的EJS代码:

&#xA;&#xA;
 &lt; body&gt;&#xA;&lt;!--------------------- Facebook SDK script Start ---------------------&gt;&#xA;&lt;%var accessToken; %GT;&#XA;&LT;脚本&GT;&#XA; window.fbAsyncInit = function(){&#xA; FB.init({&#xA; appId:'****',&#xA; cookie:true,&#xA; xfbml:true,&#xA; version:'v2.11'&#xA;} );&#xA;&#xA;&#xA; FB.getLoginStatus(function(response){&#xA; statusChangeCallback(response);&#xA;});&#xA;&#xA; };&#XA;&#XA; (function(d,s,id){&#xA; var js,fjs = d.getElementsByTagName(s)[0];&#xA; if(d.getElementById(id)){return;}&#xA; js = d.createElement(s); js.id = id;&#xA; js.src =“https://connect.facebook.net/en_US/sdk.js";
 fjs.parentNode.insertBefore (js,fjs);&#xA;}(文档,'script','facebook-jssdk'));&#xA;&#xA; function statusChangeCallback(response){&#xA;&#xA; if(response.status ==='connected'){&#xA; accessToken = response.authResponse.accessToken;&#xA; console.log(“用户已登录。访问令牌:”+ accessToken); &#XA;&#XA; }&#XA;否则&#XA; {&#XA; console.log(“未登录FB”); &#XA; };&#XA;&#XA; &#xA;&#xA;&#xA; function checkLoginState(){&#xA; FB.getLoginStatus(function(response){&#xA; statusChangeCallback(response);&#xA;});&#xA;}&#xA;&#xA;&lt; / script&gt;&#xA;&lt;! -  =============== Facebook SDK脚本结束===============  - &gt;&#xA;&#xA;&lt; fb:login-button&#xA;范围= “public_profile,电子邮件,user_friends” &#XA; onlogin =“checkLoginState();”&gt;&#xA;&lt; / fb:login-button&gt;&#xA;&lt; h1&gt;点击此处登录FB:&lt; / h1&gt;&#xA;&lt;表单action =“/ checkdp”method =“GET”&gt;&#xA; &lt; input type =“hidden”name =“accessToken”value =“&lt;%= accessToken%&gt;”&gt; &#XA; &lt; button&gt;点击此处&lt; / button&gt;&#xA;&lt; / form&gt;&#xA;&#xA;&lt; / body&gt;&#xA;  
&#xA;&# xA;

您可能已经注意到,我在&lt; script&gt; 标记之外引入了带有空值的 var accessToken ,并在&lt; 中定义了它的值。脚本&gt; 标签。

&#xA;&#xA;

再次添加代码:

&#xA;&#xA;
  if(response.status ==='connected'){&#xA; accessToken = response.authResponse.accessToken;&#xA; console.log(“用户已登录。访问令牌:”+ accessToken); &#xA;  
&#xA;&#xA;

我控制台记录了该值并完美打印。但是当我在HTML表单中再次访问变量时,变量值 =“”(null)。

&#xA;&#xA;

似乎&lt; script&gt; 标记内分配的值一旦超出&lt; script&gt就会被覆盖; 标签。

&#xA;&#xA;

我问的开发人员说它是异步的或类似的东西。我不明白,所以我无法得到他的进一步帮助。

&#xA;&#xA;

问题:有人想尝试一下吗?

&#xA;

1 个答案:

答案 0 :(得分:0)

隐藏输入字段的值似乎在解析HTML时在页面加载期间分配。此时accessToken的值仍为undefined

尝试在检索到访问令牌后设置input元素的值:

if (response.status === 'connected'){
    accessToken= response.authResponse.accessToken;
    document.querySelect( "[name=accessToken]").value = accessToken;
    console.log("User Logged in. Access Token: " + accessToken);

(未测试)。