2012-11-14 34 views
5

Tôi muốn sử dụng window.open để mở một cửa sổ đến một trong các tệp JSP của tôi. Nhưng trình duyệt vẫn hiển thị connecting... Và ngay cả firebug ngừng hoạt động mỗi khi tôi nhấp vào văn bản. Cả p lẫn input thẻ làm việc, nhưng khi tôi sử dụng một href để liên kết các JSP nó có thể liên kết đến tập tin:javascript window.open không hoạt động

<!DOCTYPE html> 
<html> 
<head><title>Sample JSP Page</title> 
<script> 
function open(){ 
    //window.open("hello.jsp","hello","height=700, width=800"); 
    var x=window.open("hello.jsp","window","status=1,height=700, width=800"); 
    x.focus(); 
} 
</script> 
</head> 
<body> 
<h1>Sample JSP Page</h1> 
<p onclick="open()">do not work</p> 
<form> 
<input type="button" value="new window" onclick="window.open('test-with-utils')"></form> 
</body> 
</html> 
+2

Có thể muốn đổi tên hàm open() của bạn giống như trong phạm vi tương tự như window.open() – Neps

Trả lời

10

Đó là bởi vì bạn đã định nghĩa lại window.open khi bạn xác định các chức năng mở. Thay vào đó, hãy sử dụng tên hàm khác.

+0

Rất thông minh! Tôi đã dành thời gian với một vấn đề tương tự. Cảm ơn bạn! – rigon

+0

Trình tiết kiệm cuộc sống. Chỉ cần chạy vào điều này: P –

5

Đối tượng cửa sổ là đối tượng cấp cao nhất trong JavaScript, và chứa trong bản thân một số đối tượng khác, chẳng hạn như "tài liệu", "lịch sử" vv

Khi bạn định nghĩa một biến hoặc một chức năng của riêng bạn, bạn thực sự thêm một thuộc tính mới vào đối tượng cửa sổ. Và điều này sẽ làm việc (và một chút sống example):

var foo = "bar"; 
alert (window.foo); // says "bar" 

Bên cạnh đó nếu bạn thêm đoạn này ít để mã của bạn:

window.onerror = function (msg, url, num) { 
    alert ("Error: " + msg + "\nURL: " + url + "\nLine: " + num); 
    return true; 
}; 

bạn sẽ nhận được lỗi này, khi bấm nút:

Error: Uncaught RangeError: Maximum call stack size exceeded 

Điều này có nghĩa là đệ quy vô tận. Đó là một tác dụng phụ - bạn xác định một chức năng mở mới, và khi bạn gọi window.open(), bạn đệ quy gọi hàm của bạn.

+0

+1 giải thích tốt – prageeth

1

Chỉ cần mở rộng vì lý do bạn gặp sự cố ở đây, bạn có thể muốn đọc một chút về javascript Phạm vi (Very Helpful Blog). Về cơ bản, xem xét đoạn mã sau:

<script> 
var thisOne=true; 
function thatOne() { 
alert("whizbang"); 
} 
var theOther={foo:"bar"}; 

//More code here... 
</script> 

Khi bạn đạt đến bình luận, bạn biết bạn có thể truy cập các biến và chức năng trực tiếp, giống như if (thisOne) {...}, element.onclick=thatOne; hoặc console.log(theOther.foo). Tuy nhiên, bạn cũng có thể truy cập chúng dưới dạng con của đối tượng gốc, trong trình duyệt web, được gọi là window. Vì vậy, bạn có thể làm:

console.log(window["thisOne"]); 
window.thatOne.call(obj, params); 
console.log(window.foo.bar); 

vậy theo quy định open() là một hàm mà không phải là bên trong một phần tử (mà là để nói, là bên trong phần tử gốc), bạn ghi đè lên window.open() chức năng. Khi bạn cố gắng gọi hàm này sau, bạn gặp sự cố vì hàm mở gọi window.open, gọi window.open, gọi window.open ...

Có một số cách để giải quyết vấn đề này -

Xác định inline handler onclick

Để làm điều này, thoát khỏi toàn bộ <script>..</script> yếu tố sau đó, sử dụng bất cứ yếu tố bạn chọn (có hỗ trợ nó) thêm thuộc tính onclick:

onclick="window.open('hello.jsp','window','status=1,height=700, width=800');" 

Đây là một phương pháp tốt đẹp và nhanh chóng, và nó giữ tất cả các logic ngay lập tức với nó là yếu tố kích hoạt, nhưng nó không phải là dễ dàng mở rộng và bạn có thể thấy mình chế nhạo bởi một số.("Oh, bạn sử dụng inline javascript? Cách kỳ lạ")

thay đổi tên phương pháp

này sẽ có những nỗ lực nhất từ ​​bạn về việc trang web của bạn làm việc bây giờ so với những gì bạn có (nó cũng cơ bản là những gì mọi người khác đã gợi ý). Chỉ cần thay đổi tên của phương thức mở thành một cái gì đó như openANewWindow() hoặc gotoJSP() hoặc bất kỳ thứ gì chưa tồn tại trong đối tượng gốc, đảm bảo lấy cả hai nơi bạn định nghĩa nó (trong phần tử script) và nơi bạn sử dụng nó (trong các thuộc tính onclick).

Sử dụng một đóng cửa

này là gần như chắc chắn không phải những gì bạn muốn trong trường hợp này, phức tạp hơn của nó hơn bạn cần cho một chức năng duy nhất. Chỉ cần bao gồm điều này như là một ví dụ về làm thế nào để có được ra khỏi đối tượng gốc, nhìn thấy như được trong nó có vẻ là trung tâm của vấn đề của bạn. Bạn có thể đã thấy trong javascript cách xác định một đối tượng, nhưng bạn có thể không biết rằng bằng cách định nghĩa một đối tượng, tất cả những gì bạn đang thực sự làm là thêm một thuộc tính đối tượng vào đối tượng gốc. Bạn có thể sử dụng hành vi này cho lợi thế của bạn, để cung cấp một cấu trúc phân cấp cho các chức năng của bạn.

Ví dụ:

<script> 
var MyFunctions = (function() { 
    function open(){ 
    var x=window.open("hello.jsp","window","status=1,height=700, width=800"); 
    x.focus(); 
    } 
    return {open:open}; 
})(); 
</script> 

Điều này tạo ra một chức năng vô danh mà được ngay lập tức chạy. Bên trong phạm vi của hàm này, một hàm khác, hàm open() được định nghĩa, tuy nhiên nó được định nghĩa trong phạm vi của hàm ẩn danh đó, không phải là đối tượng gốc (cửa sổ). Sau khi mở() được định nghĩa, một tham chiếu đến nó được trả về dưới dạng giá trị của thuộc tính đối tượng: mở.

Kết quả của tất cả điều này là thuộc tính mở của đối tượng MyFunctions là hàm bạn cần. Sau đó bạn có thể gọi nó bằng MyFunctions.open() hoặc thậm chí window.MyFunctions.open().

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