1

我不知道如何同步下一个代码:

javascript: (function() {
    var s2 = document.createElement('script');
    s2.src = 'http://192.168.0.100/jquery.js';
    document.body.appendChild(s2);
    s = document.createElement('link');
    s.rel = "stylesheet";
    s.href = "http://192.168.0.100/1.css";
    s.type = "text/css";
    document.body.appendChild(s);
})();
//var startTime = new Date().getTime();
//while (new Date().getTime() < startTime + 1000);
$(document).ready(function(){
    b="c:\\1.txt";
    var fso, f1; 
    fso = new ActiveXObject("Scripting.FileSystemObject");
    f1 = fso.CreateTextFile(b, true);
    f1.WriteLine("Testing") ;
    document.writeln("File " + b + " is created.");
});

当我第一次运行这个脚本时,我得到一个错误SCRIPT5009: '$' is undefined。我认为这是因为尚未加载 jQuery 库。当我在出现错误后尝试运行相同的脚本时 - 它的行为是正确的。对于同步,我尝试使用上面列表中注释的代码。有效(并非总是如此)。但我知道这不是严格的同步(它取决于具体情况)。如何使用更智能的同步?

4

3 回答 3

2
(function($){
  //use $ now

  $(function(){
    //dom ready
  });

})(jQuery);

请务必在 jquery 库下方的页脚中加载此库。

于 2012-10-06T18:48:37.257 回答
1

这是因为script通过 dhtml 方法放入标签appendChild使其评估异步。当你在文档上做这件事时,要听它“准备好”——遵循这个模式

(function() {
    var s2 = document.createElement('script');
    s2.src = 'http://192.168.0.100/jquery.js';
    document.body.appendChild(s2);
    s2.onload = s2.onreadystatechange = function(){
      if(s2.readyState == "complete") $(document).ready(function(){
        b="c:\\1.txt";
        var fso, f1; 
        fso = new ActiveXObject("Scripting.FileSystemObject");
        f1 = fso.CreateTextFile(b, true);
        f1.WriteLine("Testing") ;
        document.writeln("File " + b + " is created.");
      });
    }
    s = document.createElement('link');
    s.rel = "stylesheet";
    s.href = "http://192.168.0.100/1.css";
    s.type = "text/css";
    document.body.appendChild(s);
})();
于 2012-10-06T18:51:58.910 回答
0

问题是,在$添加脚本标记但在下载文件之前,会遇到带有 的行。通常浏览器在加载 JavaScript 时会阻塞,从而防止此问题,但由于您以编程方式执行此操作,因此您无法获得标准同步。

您最好的选择是等待脚本加载。这里有资料:

动态的跨浏览器脚本加载

捕获加载事件以完成脚本下载。然后,您可以调用现有的$ready 函数作为对该事件的回调。我建议使用为这些东西制作的加载器,或者只在 DOM 中使用标准脚本标记,除非你有令人信服的理由不这样做。

于 2012-10-06T18:49:28.110 回答