似乎最近的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()正常工作。
为什么这种行为发生了变化?为什么不将文字脚本标记写入文档并让浏览器正常加载外部资源?我做错了吗?
答案 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()等 - 可能会执行 代码。
因此它实际执行脚本,结果是跨域问题。