如果JSONP只是动态脚本,请求何时发出?

时间:2013-11-22 17:41:30

标签: javascript ajax jquery jsonp

显然,使用jQuery.ajax的JSONP请求实际上不是异步的,而是仅使用Script DOM Element方法,向页面添加脚本标记。我从这里发现:https://groups.google.com/forum/#!topic/jquery-dev/5-tKI-7zQvs,其中说明:

  

跨域JSONP根本不是AJAX。它不使用XMLHttpRequest。   它只不过是一个加载JavaScript的动态脚本元素   代码。

然后在页面加载后处理该动态脚本元素(在JSONP的情况下,这意味着使用源自.ajax调用中指定的url的JSON数据的参数执行回调函数)。

因此,如果我在HTML网页中有以下代码:

<script>
    jQuery(document).ready(function() {
        jQuery.ajax({dataType:'jsonp', data:'FIRST'...});
    });
</script>
<script>
    jQuery(document).ready(function() {
        jQuery.ajax({dataType:'jsonp', data:'SECOND'...});
    });
</script>

事情的顺序是什么?

它会是:

(1)脚本标签做了添加到DOM的第一个请求

(2)脚本标签将SECOND请求添加到DOM

(3)提出第一个请求

(4)提出第二次请求

或:

(1)脚本标签做了添加到DOM的第一个请求

(2)提出第一次请求

(3)脚本标签将SECOND请求添加到DOM

(4)提出第二次请求

或者上述两种情况都不是我的误解?

谢谢。

1 个答案:

答案 0 :(得分:5)

  

显然,使用jQuery.ajax的JSONP请求并不是真正的异步

这是错的,他们是。

  

而是它只使用Script DOM Element方法,向页面添加脚本标记。

这是真的。

  

跨域JSONP根本不是AJAX。它不使用XMLHttpRequest。

XMLHttpRequest不是Ajax的先决条件。 (并且XML不是Ajax或XMLHttpRequest的先决条件(因为XML当时很酷,并且开发人员需要说服管理人员将其添加到产品中),因此只能在其名称中使用XML;)

  

事情的顺序是什么?

  1. 第一个脚本将运行(创建就绪事件处理程序)
  2. 第二个脚本将运行(创建第二个就绪事件处理程序)
  3. 准备好的事件将会触发
  4. 第一个动态脚本元素将添加到页面
  5. 第二个动态脚本元素将添加到页面
  6. 第一个动态脚本元素将执行
  7. 第二个动态脚本元素将执行