2012-04-01 8 views
5

Odpowiadając my question Pumbaa80 found różnica między wywołaniem open() i window.open(), wypróbuj poniższe przykłady Firefox (testowane na 11,0):Jaka jest różnica między open() i window.open() w przeglądarce Firefox?

  1. http://jsfiddle.net/9kqp5/ (nazywa open; otwiera się w nowej karcie w FF, pod warunkiem, że "Otwórz nowe okna w nowej karcie zamiast" ustawienie jest włączone, które jest domyślnie)

  2. http://jsfiddle.net/HLbLu/ (połączenia window.open; otwiera się w nowym oknie) małej

Ale dlaczego na ziemi jest różnica? Gdybym spróbować following example:

<script> 
var a = 2; 
function hello() { alert(this.a); } 

hello(); 
window.hello(); 
</script> 

Oba warianty wywołanie funkcji hello działają dokładnie tak samo, w tym o tej samej this !!!

+1

działa tak samo dla mnie, wszystkie próbki otworzyć to samo. I rzeczywiście są to te same rzeczy, o ile nie zdefiniujesz innego fucntion call open –

+0

Zarówno JS Fiddles wykazują dla mnie to samo zachowanie (otwieranie nowego okna). –

+0

To samo, wypróbowane Opera i Firefox. – Imp

Odpowiedz

7

Jeden z twoich skrzypiec dzwoni window.open natomiast drugi dzwoni document.open, ponieważ łańcuch zakres obsługi zdarzeń w inline atrybutem jest dziwne. Więc kończysz na http://www.whatwg.org/specs/web-apps/current-work/multipage/elements.html#dom-document-open

To powiedziawszy, ponieważ przekazujesz 3 argumenty, powinno to być wywołanie window.open. Różnica w zachowaniu wydaje się być błędem w Firefoksie. Złożyłem na ten temat https://bugzilla.mozilla.org/show_bug.cgi?id=741266.

+0

interesujące, dzięki ... – TMS

+0

Nie Boris, nie powinieneś publikować tego raportu o błędach! Potrzebuję tej funkcji !!! [Muszę być w stanie otworzyć legendę w małych nowych oknach] (http://stackoverflow.com/q/9956827/684229)! – TMS

+0

Punktem raportu o błędzie jest to, że teraz 'document.open' i' window.open' mają inne zachowanie w twoim przypadku: pierwszy otwiera nową kartę, a drugi otwiera małe nowe okno. Powinny mieć to samo zachowanie, a zachowanie powinno polegać na otwarciu małego nowego okna. Tak robi łatka, którą napisałem; powinieneś rzucić okiem na łatkę, a szczególnie na test w niej. –

0

Są w rzeczywistości takie same. Wypróbuj window.open === open lub window["open"] === open. Jeśli to ci się podoba, musisz być w zamknięciu, a hasło zdefiniowane jako otwarte.

I oczywiście oznacza to wszystkie obiekty będące członkami obiektu globalnego (okna).

4

Twoje dwa skrzypce działają tak samo dla mnie w Chrome.

Jednak te dwa wiersze kodu

window.open(...);

i

open(...);

nie są równoważne. Jedynym czasem, w którym będą one równoważne, jest to, że bieżący zakres roboczy nie zawiera nowej definicji dla open, co powoduje, że interpreter przegląda wyższe zakresy, aż osiągnie zasięg globalny i znajdzie window.open.

Można to zobaczyć w akcji w this fiddle:

var test = function() { 
    var open = function() { 
     alert('uh oh'); 
    }; 

    window.open('www.google.com'); 
    open('www.google.com'); 
}; 

test(); 
+0

Tak, to jest oczywiste, ale jeśli spojrzysz na dwa skrzypce w moim pytaniu, oboje nazywają to "otwartym" w kontekście globalnym i wciąż istnieje różnica! – TMS

+0

@Tomas Myślę, że musisz podać wersję Firefoksa, której używasz. Do tej pory nikt nie odtworzył tego zjawiska. –

+0

@AndrewLeach, najnowszy oczywiście ... (domyślnie :-)). Wersja 11.0. – TMS

1

W przeglądarce kontekst domyślny jest window. Dlatego możesz na przykład zadzwonić pod numer open(), alert(), a nawet escape(). Wywołanie window.open() jest dokładnie równoważne z open().

Sposób otwierania nowego okna przez wywołanie funkcji open() zależy wyłącznie od przeglądarki.

+0

Ale jak wytłumaczyć różnicę dwóch skrzypiec? – TMS

+0

Nie ma różnicy. Po otwarciu nowych okien jako kart w przeglądarce otwierają się one jako karty. Po rozbrojeniu otwierają się one jako okna. Będziesz musiał określić, w jakiej przeglądarce i wersji widzisz różnicę i jakie są twoje nowe zasady dotyczące okna. Upewnij się, że nie masz uruchomionych specjalnych wtyczek, które mogą mieć wpływ na przeglądanie nowych okien/kart. –

+0

Pumba [zauważyłem tę samą różnicę tutaj] (http://stackoverflow.com/a/9962756/684229) ... Nie mam żadnych specjalnych wtyczek z zakładkami, tylko FF 11.0 z Firebug, pasek narzędzi dla programistów WWW i przeglądarka RealPlayer nagrywaj dodatki. Zobacz notatkę dotyczącą ustawień, które zaktualizowałem w moim pytaniu. – TMS

1

To naprawdę bardzo dziwne.Wygląda na to onclick obsługi po dodaniu jako atrybut ma jakiś kontekst z opakowanym open funkcji, która różni się od window.open:

http://jsfiddle.net/aFujb/

Dzieje się tak w najnowszym Firefox, Safari i Chrome. Nie mogę znaleźć żadnego wyjaśnienia ani raportu o błędzie dla żadnej z przeglądarek.

Próbowałem dowiedzieć się, co się dzieje w kodzie źródłowym Firefoksa, ale całkiem szczerze to za dużo dla mnie atm. Wygląda na to, że jest two different window.open implementations o nazwie nsGlobalWindow::Open i nsGlobalWindow::OpenJS, ale nie jestem pewien, czy ma to coś wspólnego z pytaniem.

+0

Wreszcie ktoś! Dzięki za twoje dochodzenie, Pumba. – TMS

+1

To nie jest błąd. W twoim skrzypcach wyszukiwanie gołosłówków "otwartych" dzieje się w 'onclick' _atrybut_, więc sprawdza się w elemencie, w którym znajduje się atrybut, a następnie w dokumencie, a następnie w oknie. I tak oczywiście znajduje 'document.open' zanim dotrze do okna ... –

+0

@BorisZbarsky ma rację; zobacz [moja odpowiedź] (http://stackoverflow.com/a/9970045/249624) dla wyjaśnienia, dlaczego. –

5

Wewnątrz procedury obsługi zdarzeń open samo rozwiąże się pod numerem document.open. Jak wspomniał Boris Zbarsky w komentarzu i his answer, jest to oczekiwane zachowanie określone przez HTML5. W the section on event handlers, etap 6, określa:

6. Stosując warunki wykonywania skryptu utworzony powyżej utworzenia obiektu funkcyjny (jak zdefiniowano w wydaniu ECMAScript 5 rozdział 13.2 tworzenia obiektów Function), z:

(...) Zakres
leksykalna Środowisko

  1. Niech Zakres być wynikiem NewObjectEnvironment (dokument elementu, g środowisko lobalne).
  2. Jeśli element ma właściciela formularza, niech zakres będzie wynikiem NewObjectEnvironment (właściciel formularza elementu, zakres).
  3. Niech zakres będzie wynikiem NewObjectEnvironment (obiekt elementu, zakres).
    (...)

Innymi słowy, zmienna odniesienia w ramach obsługi zdarzeń zostaną rozwiązane w kolejności:

  1. zakres lokalny
  2. właściwości elementu
  3. formularza właściciel właściwości (jeśli dotyczy)
  4. document właściwości
  5. zakres globalny
+0

Aha, dobra robota! Bardzo dziwne zachowanie. To tak, jakby program obsługi był zawijany w zagnieżdżone bloki 'with'. Nigdy bym się tego nie spodziewał. – user123444555621

+0

Dzięki, wielkie wyjaśnienie! – TMS

+0

@ Pumbaa80 Zagnieżdżone z bloków jest dokładnie to, co zachowanie jest podobne. Tak, jest to zwariowane, ale tak było zawsze w przeglądarkach, a mnóstwo serwisów na tym polega. –

Powiązane problemy