var el = idocument.createElement('script');el.text = injected_script;$(idocument.body).append(el);
输出为: window.id == parent,显然jQuery不是单纯调用 appendChild(),还做了别的处理。 下面来看jQuery源码。
在Github可访问jQuery源码,看这个文件: manipulation.js。 在真正插入
disableScript如果做到禁用脚本的呢?请看:
function disableScript( elem ) { elem.type = ( elem.getAttribute( "type" ) !== null ) + "/" + elem.type; return elem;}
对于设置了 type="text/javascript的脚本,其 type被重写为 type = "true/text/javascript";对于未设置 type的脚本,其 type被重写为 false/。 总之,浏览器不再把该标签识别为页面脚本,从而禁止了浏览器对
jQuery.globalEval()最终调用了JavaScript eval来执行脚本, 所以脚本上下文在jQuery所在的 window里。源码: core.js
jQuery.extend( { // ... globalEval: function( code ) { var script, indirect = eval; code = jQuery.trim( code ); if ( code ) { if ( code.indexOf( "use strict" ) === 1 ) { script = document.createElement( "script" ); script.text = code; document.head.appendChild( script ).parentNode.removeChild( script ); } else { indirect( code ); } } },
在jQuery最新的 master分支中,上下文的问题已经被 修正了。 domManip()方法中最后会调用 DOMEval而不是 globalEval, 同时 globalEval也被实现为 domEval了(见 master/core.js), 不再使用JavaScript eval()。
// manipulation.jsDOMEval( node.textContent.replace( rcleanScript, "" ), doc );// core.jsglobalEval: function( code ) { DOMEval( code );}
声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。TEL:177 7030 7066 E-MAIL:11247931@qq.com