0

我正在使用内部自定义库来复制 jsonp 调用。在你们要求我使用 JQuery 或其他库之前,让我告诉我由于某些限制我不能使用它。

以下是用于发出请求的代码:

BurrpJsonAjaxRequest.prototype.send = function() {
   this.script = document.createElement("script");
  this.script.type = "text/javascript";
  this.script.charset = "UTF-8";
  this.script.src = this.URL;

  if (typeof(this.callBack) == "function") {
    this.script.callback = this.callBack;
  }

  var currRequest = this;

  //sleep(100);

  if (this.script.src.readyState) {  //IE
    this.script.src.onreadystatechange = function() {
      if (this.script.src.readyState == "loaded" ||
        this.script.src.readyState == "complete") {
        this.script.src.onreadystatechange = null;
        currRequest.hideLoading();
        currRequest.callback();
      }
    };
  } else {  //Others
    this.script.src.onload = function() {
      currRequest.hideLoading();
      currRequest.callback();
    };
  }


  this.docHead.appendChild(this.script);
};

这在第一次执行时有效。在随后的执行中,发出请求但不执行回调。

如果我使用如下的睡眠方法(在代码中注释),回调也会在后续调用中执行。

function sleep(milliseconds) {
  var start = new Date().getTime();
  for (var i = 0; i  milliseconds){
      break;
    }
  }
}

睡眠如何影响回调的执行?虽然在 Firefox 中运行良好。

4

1 回答 1

0

第一次通过时,this.script.src.readyState 为false(脚本仍在加载),并且为 onLoad 事件创建了一个处理程序。当 onLoad 被触发时,匿名 onLoad 函数被调用——这看起来与 onReadyStateChange 处理程序非常相似。但是,onLoad 仅触发一次,因此您的函数仅被调用一次。

睡眠会减慢执行 enuf 的速度,因此当您执行 if 语句时,您的 this.script.src.readyState 为真。

你怎么看?

于 2010-02-12T17:12:32.533 回答