Đây là the test case.alert() được gọi trên cửa sổ mới dường như được gọi từ trang gốc nếu sử dụng các phương thức của jQuery
Sử dụng Javascript:
$('.js').on('click', function() {
var newwindow = window.open();
newwindow.document.write('<span>test</span>');
newwindow.document.write('<scr' + 'ipt>alert(1)</scr' + 'ipt>');
});
này cho kết quả mong đợi: cảnh báo thoại đang hiển thị bên trong cửa sổ mới.
Sử dụng jQuery:
$('.jquery').on('click', function() {
var newwindow = window.open();
$(newwindow.document.body).append('<span>test</span>', '<scr' + 'ipt>alert(1)</scr' + 'ipt>');
});
Cảnh báo hộp thoại được hiển thị bên trong trang chính.
Tại sao lại có sự khác biệt? Am i thiếu cái gì ở đây?
Hành vi này đã được thử nghiệm trong chrome/FF/safari/IE
EDIT
Như đã chỉ ra bởi mishik, điều này là do cách jQuery xử lý thẻ script, sử dụng phương pháp globalEval
để chạy tập lệnh trong ngữ cảnh chung. Vì vậy, một cách giải quyết có thể cho sử dụng jQuery (nhưng không rơi trở lại với phương pháp Javascript tinh khiết) có thể thiết lập các newwindow
biến trong bối cảnh toàn cầu quá và sử dụng nó như thế, ví dụ:
$('.jquery').on('click', function() {
newwindow = window.open();
$(newwindow.document.body).append('<span>test</span>','<scr' + 'ipt>newwindow.window.alert(1)</scr' + 'ipt>');
});
+1 là đây là lý do, tại sao người ta nói jQuery là nhanh hơn so với javascript? – Praveen