【问题标题】:Why does writing a <script> tag trigger jQuery.ajaxTransport() in 2.X?为什么在 2.X 中编写 <script> 标签会触发 jQuery.ajaxTransport()?
【发布时间】:2020-01-03 16:14:47
【问题描述】:

最近的 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() 工作正常。

为什么会改变这种行为?为什么不直接将文字脚本标签写入文档,让浏览器正常加载外部资源?我做错了吗?

【问题讨论】:

  • 看起来它的设计目的是什么? api.jquery.com/jQuery.ajaxTransportAPI 文档中提到过。
  • 您提供的代码使用jQuery 2.1 对我来说效果很好。在IE 11Firefox 26Chrome 32 上进行了测试。您使用了哪个版本的jQuery,您尝试过哪些浏览器?

标签: jquery ajax


【解决方案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 构造函数或方法 字符串 — jQuery()、.append()、.after() 等 — 可能会执行 代码。

所以它实际上执行了脚本,结果是跨域问题。

【讨论】:

    猜你喜欢
    • 2022-12-13
    • 2014-06-21
    • 2010-09-19
    • 2020-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-01
    • 1970-01-01
    相关资源
    最近更新 更多