2012-02-20 40 views
7

Khi bạn tạo một cửa sổ trình duyệt mới, bạn vượt qua nó một cái tên như thế này:JavaScript - Cửa sổ trình duyệt tham chiếu theo tên?

myWindow = window.open('http://www.google.com', "googleWindow"); 

Sau đó bạn có thể truy cập vào cửa sổ từ biến bạn đã lưu nó như là:

myWindow.close(); 

Có thể truy cập và thao tác một cửa sổ bằng tên của nó (googleWindow) thay vì biến?

Nếu không thể, thì tên cho biết tên cửa sổ là gì?

Trả lời

17

Không. Không có tham chiếu đến cửa sổ, bạn không thể tìm thấy lại, theo tên hoặc cách khác. Không có bộ sưu tập các cửa sổ.

UPDATE: Đây là cách bạn có thể làm điều đó cho mình:

var windows = {}; 
function openWindow(url, name, features) { 
    windows[name] = window.open(url, name, features); 
    return windows[name]; 
} 

Bây giờ, openWindow sẽ luôn luôn mở cửa sổ, và nếu cửa sổ đã tồn tại, nó sẽ tải URL được đưa ra trong cửa sổ đó và trở lại một tham chiếu đến cửa sổ đó. Bây giờ bạn cũng có thể thực hiện findWindow:

function findWindow(name) { 
    return windows[name]; 
} 

nào sẽ trở lại cửa sổ nếu nó tồn tại, hoặc undefined.

Bạn cũng nên có closeWindow, do đó bạn không giữ tham chiếu đến các cửa sổ mà bạn đã mở cho mình:

function closeWindow(name) { 
    var window = windows[name]; 
    if(window) { 
     window.close(); 
     delete windows[name]; 
    } 
} 

Nếu nó không phải là có thể, là những gì điểm cho cửa sổ tên?

Tên được sử dụng nội bộ bởi trình duyệt để quản lý cửa sổ. Nếu bạn gọi window.open có cùng tên, nó sẽ không mở một cửa sổ mới mà thay vào đó tải URL đó vào cửa sổ đã mở trước đó. Có một vài điều khác, từ MDN window.open():

Nếu cửa sổ có tên strWindowName đã tồn tại, thì strUrl sẽ được tải vào cửa sổ hiện có. Trong trường hợp này, giá trị trả về của phương thức là cửa sổ hiện tại và strWindowFeatures bị bỏ qua. Cung cấp một chuỗi rỗng cho strUrl là một cách để có được một tham chiếu đến một cửa sổ mở theo tên của nó mà không thay đổi vị trí của cửa sổ. Để mở một cửa sổ mới trên mọi lệnh gọi window.open(), hãy sử dụng giá trị đặc biệt _blank cho strWindowName.

+0

Tốt giải thích và làm việc xung quanh. Cảm ơn! –

+0

Điều này có thể tốt cho các cửa sổ nhưng nó không hoạt động trên hệ thống Linux của tôi ... không chắc chắn nếu nó là một cửa sổ Microsoft tham khảo hay không, nhưng đôi khi những gì xảy ra trên máy Linux của tôi cũng xảy ra trên máy ... – CrandellWS

+0

Bắt đầu với Google Chrome 41, phương pháp này có một tác dụng phụ xấu: bất cứ khi nào bạn thực hiện window.open(), cửa sổ đã mở sẽ có tiêu điểm. Hiện tại không có cách giải quyết nào mà tôi có thể tìm thấy để ngăn chặn hành vi này, điều này khiến tôi đau đầu. Tôi chỉ muốn có tham chiếu đến cửa sổ đó, tôi không muốn nó được tập trung. gọi window.open() với url trống không hoạt động. – schlingel

14

Linus G Thiel nói rằng bạn không thể làm điều này trong javascript. Kỳ lạ thay, câu trả lời của anh liệt kê một đoạn trích từ MDN nghe có vẻ như nó nói cách thực hiện điều này. Dòng là:

"Providing an empty string for strUrl is a way to get a reference to 
    an open window by its name without changing the window's location." 

Tôi đã thử cách này và nó phù hợp với tôi.

winref = window.open('', 'thatname', '', true); 
winref.close(); 

Tuy nhiên, điều này chỉ có thể hoạt động nếu bạn mở cửa sổ từ trang của mình. Và nếu đó là sự thật, sau đó nó là loại vô nghĩa để làm một window.open chỉ để có được tài liệu tham khảo. Bạn có thể đã có tài liệu tham khảo, trong trường hợp đó.

+2

Nó thực sự không dựa trên người đã mở nó, nó dựa trên nguồn gốc hoặc tên miền mà các trang chia sẻ. – aredridel

+0

Bạn có thể xóa nội dung bằng 'winref.document.close();' và thêm nội dung mới với 'winref.document.write ('Nội dung mới'); ' – CrandellWS

3

giải pháp Đánh dấu Goldfain của không còn hoạt động như viết như của 9/8/2015

Theo this w3 specification,

Nếu đối số đầu tiên là chuỗi rỗng, sau đó lập luận url phải được giải thích là "about: blank".

Tôi tin rằng đây là sự khác biệt giữa HTML4 và HTML5.

IE và Chrome đã cập nhật hành vi này để phù hợp với đặc điểm kỹ thuật này, trong khi giải pháp của Mark vẫn hoạt động trên FF (mặc dù tôi cho rằng họ sẽ sửa lỗi này sớm). Một vài tuần trước, điều này đã hoạt động trên tất cả các trình duyệt chính.

Vấn đề cụ thể của tôi liên quan đến kiểm soát cửa sổ trong khi điều hướng, nơi mở cửa sổ trò chuyện được đóng hộp đen cũng như hầu hết mã trên trang - xác định lại window.open đã đúng. Giải pháp của tôi liên quan đến việc gọi cửa sổ trống với tham chiếu trước khi gọi hàm mà được gọi là cửa sổ trò chuyện. Khi người dùng điều hướng khỏi trang, tôi có thể dựa vào thực tế là các cửa sổ không phải là cha mẹ ban đầu không được phép sửa đổi cửa sổ con và vì vậy tôi đã có thể sử dụng giải pháp của Mark Goldfain không thay đổi.

3

Giải pháp được cung cấp bởi Mark Goldfain có thể được chỉnh sửa để làm việc với các trình duyệt mới, ít nhất là để mở cửa sổ và giữ tham chiếu đến nó giữa làm mới trang.

var winref = window.open('', 'MyWindowName', '', true); 
if(winref.location.href === 'about:blank'){ 
    winref.location.href = 'http://example.com'; 
} 

hoặc ở định dạng chức năng

function openOnce(url, target){ 
    // open a blank "target" window 
    // or get the reference to the existing "target" window 
    var winref = window.open('', target, '', true); 

    // if the "target" window was just opened, change its url 
    if(winref.location.href === 'about:blank'){ 
     winref.location.href = url; 
    } 
    return winref; 
} 
openOnce('http://example.com', 'MyWindowName'); 
0

tôi đã kết thúc bằng cách sử dụng sau đây:

var newwindows = {}; 
function popitup(url, nm) { 
    if ((newwindows[nm] == null) || (newwindows[nm].closed)) { 
    newwindows[nm] = window.open(url, nm, 'width=1200,height=650,scrollbars=yes,resizable=yes'); 
    } 
    newwindows[nm].focus(); 
} 

sau đó tham chiếu sử dụng:

 <button type="button" onclick="popitup('url/link.aspx?a=bc',this.value)" value="uniqueName">New</button> 
+0

Tại sao không đơn giản hóa logic và đặt' newwindows [nm]. tập trung(); 'bên ngoài logic nếu hoàn toàn? Dường như dự phòng để thực hiện cùng một hành động trong hai đường dẫn logic khác nhau, khi kết quả là cùng một hành động theo một trong hai cách. – GoldBishop

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