【问题标题】:Problems in synchronous javascript同步javascript中的问题
【发布时间】:2014-10-29 21:52:15
【问题描述】:

我正在学习 javascript,想在我的代码中使用同步 javascript 调用。

例如,我有两个脚本,script1.js 和 script2.js。这是script1.js:

<script>

var value1="Script 1";
alert(value1);

//calling script2
url="script2.js"
document.write("<scr" + "ipt src=\"" + url + "\"></scr" + "ipt>");

</script>

这里是 script2.js

  <script>       
    var value2="Script 2";       
    </script>

现在我的问题是我可以从 script2 打印值吗,就像我在 script1.js 中添加这个(警报(value2);)一样。

<script>

var value1="Script 1";
alert(value1);

//calling script2
url="script2.js"
document.write("<scr" + "ipt src=\"" + url + "\"></scr" + "ipt>");
alert(value2);
</script>

我已经使用异步 js 来做到这一点

 var scr = document.createElement('script');
 scr.setAttribute('src', url);
 var head = document.getElementsByTagName("head")[0];
 head.appendChild(scr);

它正在工作,但我想同步实现这一点有什么建议吗??

提前致谢

【问题讨论】:

  • 有人给了我-1?为什么我要学习 javascript 可能对许多人来说这是一个非常简单的问题,但我对此感到困惑,我只需要解释
  • 脚本打开标签是&lt;script&gt;,结束标签是&lt;/script&gt;
  • 哦,谢谢我已经更新了这个。
  • “现在我的问题是我可以从 script2 打印值,就像我在我的 script1.js 中添加这个(alert(value2);) 一样。” 你尝试运行代码?结果如何?
  • 您为什么将第二种方法称为异步?它也是同步的。更好的描述是使用 DOM 操作

标签: javascript jquery


【解决方案1】:

听起来你想要asynchronous function, with a callback。 (第一个答案,准确地展示了你的例子!)。

基本上,当函数完成加载您的脚本时,它会调用回调函数,您应该可以在其中运行您的alert(value2); 脚本。

否则,如果你想使用 document.write,你有这些选项:

(我认为问题在于,您的 *.js 文件中的 &lt;script&gt;&lt;/script&gt; 标签不是必需的!)

src1.js

document.write('<script src="src2.js"></script'+'>');
document.write('<script>alert(value2);</script'+'>');

src2.js

var value2 = 'foobar!'

HTML

<html>
<body>
<script src="src1.js"></script>
</body>
</html>

这符合您的要求吗?

【讨论】:

  • 我想使用 document.write 内联
【解决方案2】:

像第一种情况一样添加脚本时,您只能在打开新的脚本标签后使用 script2.js 中的值。

index.html

<script>
var value1="Script 1";
alert(value1);

//calling script2
url="script2.js"
document.write("<scr" + "ipt src='script2.js'></scr" + "ipt>");
</script>
<script>
alert(value2);
</script>

script2.js

var value2='yes';

在本地测试并验证它确实有效(我看到一个带有“是”的警报),而你所拥有的(都在同一个脚本标签中)不起作用(抛出异常,因为 value2 未定义)。

【讨论】:

  • 什么意思能详细解释一下吗?
  • 你的意思是添加 document.write("
  • 不,另一个脚本标签。 &lt;/script&gt;&lt;script&gt; do stuff here!
  • 仍然 value2 未定义
  • @KevinB 我添加了这个文档。write("" + "ipt>");调用 sciptt2.js 后仍然无法正常工作
【解决方案3】:

在 javascript 中,脚本的顺序始终是同步的。因为您在初始化后添加了脚本 2,所以您创建了一个如下所示的 DOM。

<html>
   <head>
      <script>
        //script 1
      </script>
   </head>
   <body> 
      ---Body content here
   </body>
</html>
<script src="script2.js"/>

请注意您如何将脚本放在页面末尾。因为 HTML 是同步读取的,所以 script1 会执行完毕(包括 alert() 的 value2 未定义,因为 script2 还没有被解析),然后 HTML body 会被处理,然后是 script2.js。

如果您希望在当前脚本中间同步加载辅助脚本,则必须执行 XMLHTTPRequest 并获取内容,然后运行 ​​eval(script_2_content)。 Eval 将同步编译和解析第二个脚本。

然后你会做的是:

<html>
   <head>
      <script>
        //script 1 before loading script 2
        //script 2 content
        //script 1 content after loading script 2
      </script>
   </head>
   <body> 
      ---Body content here
   </body>
</html>

【讨论】:

  • 为什么投反对票?这就是我对 HTML 解析器如何工作的理解。
猜你喜欢
  • 2022-09-27
  • 2020-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-30
  • 2019-09-25
  • 2010-11-20
  • 1970-01-01
相关资源
最近更新 更多