这是测试用例。
使用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>');
});