如果使用jQuery的方法,javascript – alert()调用新窗口似乎是从原始页面调用的

前端之家收集整理的这篇文章主要介绍了如果使用jQuery的方法,javascript – alert()调用新窗口似乎是从原始页面调用的前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
这是 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>');
});

DEMO

解决方法

这似乎是jQuery处理< script>的方式.标签.

jQuery的domManip函数代码

// 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>元素,在全局上下文中进行评估,然后禁用.

domManip由append()方法调用

append: function() {
    return this.domManip( arguments,function( elem ) {

猜你在找的jQuery相关文章