2009-08-27 30 views
44

Tôi có thể lấy window.document nhưng làm thế nào tôi có thể lấy document.window? Tôi cần phải biết làm thế nào để làm điều đó trong tất cả các trình duyệt.Làm cách nào để lấy đối tượng Window từ đối tượng Tài liệu?

+2

tôi có dám hỏi tại sao không? cửa sổ là một đối tượng luôn có sẵn và luôn có không quá 1 tài liệu trong cửa sổ, một mối quan hệ 1-1 để nói ... – Colin

+4

Vì tôi đang sử dụng mẫu thử nghiệm trên nhiều iframe và các phương thức Element khác nhau phá vỡ trong IE hoặc Safari nếu phần tử bằng cách nào đó được mở rộng trong phạm vi sai. Tôi đã sửa đổi một số điều để khắc phục sự cố này trong nguyên mẫu, nhưng một phần của bản sửa lỗi yêu cầu tôi phải tìm cửa sổ nào có phần tử. – Joren

+0

@Joren, hãy cân nhắc thay đổi thành câu trả lời được chấp nhận. – kay

Trả lời

-1

The Window object is the top level object in the JavaScript hierarchy, vì vậy chỉ cần đề cập đến nó như là cửa sổ

Edit: Original câu trả lời trước khi Promote JS nỗ lực. JavaScript technologies overview trên Mạng dành cho nhà phát triển Mozilla cho biết:

Trong môi trường trình duyệt, đối tượng toàn cục này là đối tượng cửa sổ.

Chỉnh sửa 2: Sau khi đọc bình luận của tác giả cho câu hỏi của mình (và nhận được downvotes), điều này dường như có liên quan đến cửa sổ tài liệu của iframe. Hãy xem window.parentwindow.top và có thể so sánh chúng để suy ra cửa sổ tài liệu của bạn.

if (window.parent != window.top) { 
    // we're deeper than one down 
} 
+7

Sau 'mở()' cửa sổ mới của 'cửa sổ' là một' cửa sổ' hơn 'mở'.Nếu bạn nhận được một 'tài liệu' (hoặc bất kỳ' Node') nào từ một số hàm, bạn có thể cần cửa sổ gốc. (Wow cái này rất cũ.) – Rudie

77

Bạn có thể đi với document.defaultView nếu bạn chắc chắn nó một cửa sổ và ổn của nó để bỏ qua các trình duyệt của Microsoft trước khi IE 9.

+6

Có. Chỉ cần nhớ rằng theo thông số kỹ thuật, 'document.defaultView' không phải là cùng một đối tượng như' window' (và, thực tế là khác trong một số ứng dụng cũ hơn, ví dụ: Safari 2.x) – kangax

+0

Hoạt động tốt cho các tài liệu XUL trong Firefox nữa! cảm ơn :) – macguru2000

+1

doc.parentWindow || doc.defaultView, và nó hoạt động trong IE cũ và Safari –

3

Vâng, đây là giải pháp tôi đã đi với. Nó hoạt động, nhưng tôi ghét nó.

getScope : function(element) { 
    var iframes = top.$$('iframe'); 
    var iframe = iframes.find(function(element, i) { 
     return top[i.id] ? top[i.id].document == element.ownerDocument : false; 
    }.bind(this, element)); 
    return iframe ? top[iframe.id] : top; 
} 
+0

IE chỉ tôi thấy ... –

+0

IE là gì chỉ về nó? Dường như làm việc tốt trong FF \ Saf \ IE \ Chrome. Nó không cần thiết trong bất cứ điều gì nhưng IE tuy nhiên, vì các trình duyệt khác tất cả mở rộng các phần tử tự động trong phạm vi bên phải. – Joren

17

Một giải pháp trình duyệt chéo rất phức tạp, dưới đây là cách thực hiện võ đường nó (từ window.js :: get()):

// In some IE versions (at least 6.0), document.parentWindow does not return a 
// reference to the real window object (maybe a copy), so we must fix it as well 
// We use IE specific execScript to attach the real window reference to 
// document._parentWindow for later use 
if(has("ie") && window !== document.parentWindow){ 
    /* 
    In IE 6, only the variable "window" can be used to connect events (others 
    may be only copies). 
    */ 
    doc.parentWindow.execScript("document._parentWindow = window;", "Javascript"); 
    //to prevent memory leak, unset it after use 
    //another possibility is to add an onUnload handler which seems overkill to me (liucougar) 
    var win = doc._parentWindow; 
    doc._parentWindow = null; 
    return win; // Window 
} 

return doc.parentWindow || doc.defaultView; // Window 

có ("ie") trả về true cho IE (và nếu không thì)

0

trước hết hãy rõ ràng. loại điều này thường cần thiết khi bạn làm việc với khung, iframe và nhiều cửa sổ, và vì vậy "cửa sổ chỉ là đối tượng chung" là câu trả lời không hài lòng nếu tất cả bạn có tay cầm là tài liệu từ một cửa sổ khác so với số bạn đang sử dụng.

giây, không may là không có trực tiếp cách nhận được đối tượng cửa sổ. có những cách gián tiếp.

cơ chế chính để sử dụng là window.name. khi tạo cửa sổ hoặc khung từ cửa sổ cha mẹ, bạn thường có thể cung cấp cho nó một tên duy nhất. bất kỳ tập lệnh nào bên trong cửa sổ đó đều có thể nhận được tại window.name. bất kỳ tập lệnh nào bên ngoài cửa sổ đều có thể nhận được tại cửa sổ.name của tất cả các cửa sổ con của nó.

để cụ thể hơn yêu cầu thêm thông tin về tình huống cụ thể. tuy nhiên trong mọi tình huống mà các kịch bản con có thể giao tiếp với các tập lệnh gốc hoặc ngược lại, chúng luôn có thể xác định lẫn nhau theo tên, và điều này thường là đủ.

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