这是
the test case.
使用JavaScript:
$('.js').on('click',function () { var newwindow = window.open(); newwindow.document.write('<span>test</span>'); newwindow.document.write('<scr' + 'ipt>alert(1)</scr' + 'ipt>'); });
这给出了预期的结果:对话框警报显示在新窗口中.
使用jQuery:
$('.jquery').on('click',function () { var newwindow = window.open(); $(newwindow.document.body).append('<span>test</span>','<scr' + 'ipt>alert(1)</scr' + 'ipt>'); });
为什么有区别?我在这里遗漏了什么吗?
这个行为已经在chrome / FF / safari / IE中测试过了
编辑
如mishik所指出的,这是由于jQuery如何处理脚本标签,使用globalEval方法在全局上下文中运行脚本.因此,使用jQuery(但不能回溯到纯JavaScript方法)的可能的解决方法可能是在全局上下文中设置newwindow变量,并使用它,例如:
$('.jquery').on('click',function () { newwindow = window.open(); $(newwindow.document.body).append('<span>test</span>','<scr' + 'ipt>newwindow.window.alert(1)</scr' + 'ipt>'); });
解决方法
这似乎是jQuery处理< script>的方式.标签.
// Evaluate executable scripts on first document insertion for ( i = 0; i < hasScripts; i++ ) { node = scripts[ i ]; if ( rscriptType.test( node.type || "" ) && !jQuery._data( node,"globalEval" ) && jQuery.contains( doc,node ) ) { if ( node.src ) { // Hope ajax is available... jQuery._evalUrl( node.src ); } else { jQuery.globalEval( ( node.text || node.textContent || node.innerHTML || "" ).replace( rcleanScript,"" ) ); } } }
domManip将剥离所有< script>元素,在全局上下文中进行评估,然后禁用.
append: function() { return this.domManip( arguments,function( elem ) {