gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 02:42:34 24 4
gpt4 key购买 nike

这是 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> 的方式标签。

domManip jQuery 源代码中的函数:

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

domManipappend() 调用方法:

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

关于javascript - 如果使用 jQuery 的方法,在新窗口上调用的 alert() 似乎是从原始页面调用的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17814240/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com