为什么写一个<script>标签会在2.X?</script>中触发jQuery.ajaxTransport()

时间:2013-05-16 19:58:16

标签: jquery ajax cors

似乎最近的jQuery版本在向文档附加标记时尝试为脚本源发出自己的AJAX请求,例如:

 var script = $('<script/>', { id: 're_c', type: 'text/javascript', src: 'https://www.google.com/recaptcha/api/js/recaptcha_ajax.js' });
 $('head').append(script);

由于SOP而失败:

XMLHttpRequest cannot load https://www.google.com/recaptcha/api/js/recaptcha_ajax.js?legacy. Origin https://ark.dev.hypem.com is not allowed by Access-Control-Allow-Origin. jquery.js:7774
send jquery.js:7774
jQuery.extend.ajax jquery.js:7230
jQuery.extend._evalUrl jquery.js:5810
jQuery.fn.extend.domManip jquery.js:5605
jQuery.fn.extend.append jquery.js:5387
(anonymous function)
InjectedScript._evaluateOn
InjectedScript._evaluateAndWrap
InjectedScript.evaluate
Error: NETWORK_ERR: XMLHttpRequest Exception 101

看起来domManip会激活jQuery._evalUrl(node.src)。

同时,$ .getScript()正常工作。

为什么这种行为发生了变化?为什么不将文字脚本标记写入文档并让浏览器正常加载外部资源?我做错了吗?

1 个答案:

答案 0 :(得分:1)

有些浏览器并不完全接受它。试试这个:

var script = document.createElement( 'script' );
script.type = 'text/javascript';
script.src = 'https://www.google.com/recaptcha/api/js/recaptcha_ajax.js';
$("head").append( script );

它确实有效,但由于jquery设计,我们无法在某些浏览器上看到它。在Jquery API Documentation, additional notes它说

  

按照设计,任何接受HTML的jQuery构造函数或方法   string - jQuery(),. append(),. after()等 - 可能会执行   代码。

因此它实际执行脚本,结果是跨域问题。