2013-08-23 36 views
8

Tôi đang sử dụng hệ thống mẫu Smarty. Một trong những tính năng của nó là khả năng hiển thị tập lệnh đầu ra tạo ra thông tin gỡ lỗi cho mỗi trang. Ở đây bạn có thể xem ví dụ về mã được tạo:window.open trả về null và không thành công trong tập lệnh nội tuyến nhưng hoạt động từ bảng điều khiển

<script type="text/javascript"> 
//<![CDATA[ 

setTimeout(function() { //Attempt to fix the issue with timeout 
    var _smarty_console = window.open("about:blank","md5hash","width=680,height=600,resizable,scrollbars=yes"); 
    console.log(_smarty_console); //Trying to log it 
    if(_smarty_console!=null) { 
     _smarty_console.document.write("<!DOCTY... lots of HTML ...<\/html>\n"); 
     _smarty_console.document.close(); 
    } 
}, 5000); 
//]]> 
</script> 

Vấn đề là, rằng window.open chức năng luôn luôn trả null. Tôi đã cố gắng trì hoãn nó với setTimeout nhưng không có gì thay đổi. Khi tôi sao chép mã và chạy nó trong giao diện điều khiển Firebug, nó hoạt động đúng. Không có tập lệnh nào khác trên trang. Trang sử dụng XHTML nghiêm ngặt. Kịch bản nằm ngay trước </body>.

+0

Đây là có thể là một câu hỏi ngu ngốc, nhưng bạn có thể thực sự nhìn thấy các cửa sổ pop-up? Nếu bạn không thể, hãy tắt trình chặn cửa sổ bật lên trong trình duyệt của bạn ... – Teemu

Trả lời

7

Trình duyệt bị chặn. window.open không chỉ bị chặn, khi được gọi bởi hành động của người dùng, ví dụ trong sự kiện nhấp chuột, được phát ra bởi sự kiện trình duyệt gốc. Các sự kiện phát ra javaScript cũng đang bị chặn, giống như các callbacks bị trì hoãn setTimeout.

<a id="link" href="http://stackoverflow.com">StackOverflow</a> 

<script type="text/javascript"> 

// Example (with jQuery for simplicity) 

$("a#link").click(function (e) { 
    e.preventDefault(); 

    var url = this.href; 

    // this will not be blocked 
    var w0 = window.open(url); 
    console.log("w0: " + !!w0); // w0: true 

    window.setTimeout(function() { 
    // this will be blocked 
    var w1 = window.open(url); 
    console.log("w1: " + !!w1); // w1: false 
    }, 5000); 
}); 

</script> 

Xem Fiddle. Tôi cũng đã thử nó với sự kiện keypress, nhưng không may mắn.

window.open trả về tham chiếu hợp lệ cho cửa sổ mới (hoặc tên hiện có) hoặc null khi không tạo được cửa sổ mới.

+0

Tôi nghĩ rằng đó sẽ là một thứ gì đó liên quan đến trình duyệt. Nhưng vì không có "Popup bị chặn." thông điệp xuất hiện, tôi bối rối. Bạn có thể cho tôi một lời khuyên làm thế nào để có được nó để làm việc? Tôi muốn nó hoạt động mà không thay đổi cài đặt trình duyệt của khóa học. –

+0

không có cách nào. chỉ thông qua một sự kiện nhấp chuột, giống như ví dụ trong bài đăng của tôi (cập nhật) – metadings

+0

Thậm chí không có sự kiện quan trọng nào được thực hiện (CTRL + j). trong những trường hợp như vậy, tôi sẽ phải thêm một ngoại lệ cho trang của mình. –

-2

Hãy thử lệnh tiếp theo sau window.open với thời gian chờ, ví dụ:

var myWindow = window.open('foo','_blank','menubar=no, scrollbars=yes, top=10, width=800,height=600'); 

setTimeout(myWindow.onload=function(){this.document.body.innerHTML+='bar';}, 2000); 
+1

Điều đó sẽ giúp ích như thế nào? Làm thế nào nó liên quan đến câu hỏi? Bạn có thể giải thích thêm? –