2012-02-07 11 views
28

Jaki jest sens document.defaultView?Jaki jest sens document.defaultView?

MDN says:

W przeglądarkach zwraca obiekt związany z okna dokumentu lub null, jeśli brak dostępnych.

Kod jak następuje (od PPK's site) wykorzystuje document.defaultView:

function getStyle(el,styleProp) 
{ 
    var x = document.getElementById(el); 
    if (x.currentStyle) 
     var y = x.currentStyle[styleProp]; 
    else if (window.getComputedStyle) 
     var y = document.defaultView.getComputedStyle(x,null).getPropertyValue(styleProp); 
    return y; 
} 

Kod taki można znaleźć w innych miejscach, takich jak David Mark Moja biblioteka. Nie jestem pewien, czy ludzie po prostu kopiują z PPK lub z innego źródła lub wymyślają to niezależnie, ale nie rozumiem tego.

Moje pytanie brzmi, jaki jest sens używania document.defaultView w takich przypadkach? Czy nie byłoby łatwiej napisać to w następujący sposób:

function getStyle(element, styleProp) { 
    if (element === ''+element) element = document.getElementById(element); 
    return element.currentStyle ? element.currentStyle[styleProp] : 
      getComputedStyle(x,null).getPropertyValue(styleProp); 
} 

Co document.defaultView.getComputedStyle zrobić window.getComputedStyle lub po prostu getComputedStyle nie?


Odpowiedź cwolves pozwoliła mi myśleć w dobrym kierunku. Oryginalna funkcja jest niemądra, brakuje punktu defaultView. Powyższa propozycja jest mniej głupia, ale brakuje też punktu defaultView. Oto moja nowa propozycja:

function getStyle(element, styleProp) { 
    var view = element.ownerDocument && element.ownerDocument.defaultView ? 
       element.ownerDocument.defaultView : window; 

    return view.getComputedStyle ? 
       view.getComputedStyle(element,null).getPropertyValue(styleProp) : 
      element.currentStyle ? 
       element.currentStyle[styleProp] : null; 
} 

Sam element musi zostać przekazany, a nie identyfikator. Myślę, że to prawdopodobnie i tak będzie preferowane. Otrzyma dokument zawierający węzeł i skojarzone z nim okno. Ma on awarię do bieżącego okna getComputedStyle, jeśli są uszkodzone (słabo pamiętam, że getComputedStyle jest w pobliżu przed defaultView). Prawdopodobnie jest to bliżej zamierzonego użycia defaultView.

Odpowiedz

6

Nie jestem w tym przekonany, ale wyobrażam sobie, że jest to wynikiem naprawienia błędu, który spowodował próbę uruchomienia kodu na oddzielnym dokumencie (np. Coś, co istnieje w pamięci, ale nie jest na stronie) lub próbuje uruchom na dokumencie w innym oknie (np. element iframe lub popup).

Zgodnie z Twoją ofertą, kiedy document.defaultView jest uruchamiany na dokumencie, który NIE jest bieżącym dokumentem, otrzymasz powiązany obiekt okna, czyli document.documentView.getComputedStyle !== getComputedStyle, ponieważ znajdują się one w różnych kontekstach.

Podsumowując, uważam, że jest ona zbliżona do document.window, która nie istnieje.

+0

więc inny sposób frazowania, że być użyteczne tylko wtedy, gdy nie masz jeszcze dojścia do okna/globalnego powiązanego z dokumentem? –

+1

niekoniecznie - Jak już powiedziałem, możesz mieć kilka różnych dokumentów (iframe), więc jest to link do tego konkretnego okna (np. 'Iframe.contentWindow' kontra' window' kontra 'iframe2.contentWindow'). Dokument można również przenosić, więc nawet jeśli przechowujesz ten oryginalny link, może on zostać zmieniony. To jest, jak sądzę, bezpieczny sposób odniesienia się do 'bieżącego okna' z' dokumentu' –

+0

Masz rację. Aktualizowanie pytania za pomocą nowej propozycji, jak powinna wyglądać funkcja. –

3

Jest to po prostu abstrakcja, o ile mogę to stwierdzić, na wypadek, gdyby dowolny agent użytkownika pojawił się z implementacją DOM, ale nie zapewnia widoku w postaci okna. Zobacz Views w DOM Level 2.

+0

Nie wierzę, że takie UA istnieją? –

+1

Widoki DOM 2 są przestarzałe. Właściwość 'defaultView' jest teraz zdefiniowana w standardzie HTML. –

+0

@ Šime Vidas: Interesujące. Wygląda na to, że przenieśli go całkowicie z DOM 3 i do HTML. Mam teraz trudności z nawigacją na stronie whatwg.org, czy mógłbyś podać link? : | – BoltClock

2

Według MDN getComputedStyle article,

W wielu próbki kodu online getComputedStyle stosowany jest od obiektu document.defaultView.

W prawie wszystkich przypadkach jest to niepotrzebne, ponieważ getComputedStyle istnieje również na obiekcie window.

Jest wielce prawdopodobne, wzór defaultview była jakaś kombinacja

  1. ludzie nie chcąc napisać spec okna i
  2. podejmowania API, który był również użyteczny w Javie.

Jednak istnieje a single case gdzie należy użyć defaultView „s metoda : podczas korzystania z Firefox 3.6, aby uzyskać dostęp style ramką.

+3

'defaultView' jest przydatny, ponieważ można zrobić" someElement.ownerDocument.defaultView " i nadal będzie działać, jeśli element pochodzi z innego dokumentu/okna, jak ramka lub 'window.open' lub cokolwiek innego. Zwyczajne przykłady, które widzisz pływające po okolicy, przeoczyły to. Próbowałem wrócić i wyjaśnić to pytanie po tym, jak to rozgryzłem. –

+0

@DaggNabbit Jak mówi artykuł MDN, było to tylko dla Firefoksa 3.6. Teraz możesz po prostu użyć 'window' i działa również: [** Demo **] (http: // jsfiddle.net/WQYbL /) – Oriol

+0

Co tak naprawdę rzuciło mi się w oczy o przykładach PPK i DM, to że użyli 'defaultView' w sposób, który był równoważny użyciu' window', ponieważ po prostu użyli globalnej własności 'document' zamiast dokumentu związanego z element, więc i tak nic nie działało AFAICT. –

3

OP zadaje pytanie: „Jaki jest sens document.defaultView”, a odpowiedź naprawdę nie ma nic wspólnego z getComputedStyle. Właściwość document.defaultView jest po prostu sposobem uzyskania obiektu window, jeśli ma się odniesienie do obiektu document zawartego w tym window. Istnieją przypadki, w których obiekt window, do którego chcesz się odwołać (lub defaultView), nie znajduje się w tym samym zasięgu okna, co używany kod.

Jednym z przykładów jest odniesienie do obiektu document w elemencie iframe i wygodne uzyskanie odwołania do obiektu iframe o wartości window.

Innym przypadkiem może być sytuacja, w której działa się w uprzywilejowanym kontekście w zakresie przeglądarki (np. Kod chrome w Firefoksie), a użytkownik ma odniesienie do obiektu o nazwie tabbrowser lub innego okna.

Albo, jak Dagg Nabbit zwraca uwagę, jeśli w każdym z tych przypadków masz odniesienie do elementu w oknie, można uzyskać dostęp do rodzica window tego elementu przez element.ownerDocument.defaultView