2013-07-23 19 views
10

Đâ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>'); 
}); 

DEMO

+0

+1 là đây là lý do, tại sao người ta nói jQuery là nhanh hơn so với javascript? – Praveen

Trả lời

8

Có vẻ như đây là cách jQuery xử lý thẻ <script>.

domManip hàm trong mã nguồn 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 sẽ gỡ bỏ tất cả các yếu tố <script>, đánh giá chúng trong bối cảnh toàn cầu và sau đó vô hiệu hóa.

domManip được gọi bởi append() phương pháp:

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

Hmmmm. Vì vậy, làm thế nào để bạn giải quyết điều này bằng cách sử dụng jQuery? – Neal

+1

@Neal dự phòng cho các phương thức JavaScript thuần túy. – mishik

+0

+1 Nghiên cứu thú vị và nhanh chóng. – Praveen

Các vấn đề liên quan