2012-06-11 15 views
21

Mam okno, w którym przed zamknięciem odświeżam stronę główną.powracający typ "nieznany" w IE

if(opener && typeof(opener.Refresh) != 'undefined') 
{ 
    opener.Refresh(); 
} 

Gdybym odeszła od oryginalnej strony otwarcia, to kod będzie rzucać „Permission denied” błąd.

debugowanie kodu wykazały, że typeof(opener.Refresh) była równa „nieznany” zamiast oczekiwać „nieokreślonej”.

O ile jestem świadomy „nieznany” nie jest jedną z wartości zwracanych dla typeof, tak jak i dlaczego ta wartość jest zwracana?

Dalsze Informacje

unikałem błąd zmieniając czek:

if(opener && typeof(opener.Refresh) == 'function') 

Jednak przykłady jak to (detecting-an-undefined-object-property-in-javascript) nie wydają się Factor "nieznane" do równania .

+11

To jest IE, czego się spodziewałeś? – 0x499602D2

+0

W jaki sposób zadeklarowano 'opener'? –

+0

Nie jest zadeklarowane, jednak okno jest tworzone za pomocą standardowego window.open. –

Odpowiedz

16

Według duplicate question at Bytes wartość typeof unknown dodaje JScript wersja 8, wraz z date.

comment do blogu Robert Nyman może być również wyjaśniająca:

Internet Explorer wyświetla „nieznany”, gdy dany obiekt znajduje się na po drugiej stronie mostu COM +. Możesz tego nie wiedzieć lub zdać sobie z tego sprawę, ale obiekt XMLHTTP MS jest częścią innego obiektu COM +, który implementuje IUnknown; kiedy wywołasz metody na nim, robisz to ponad mostem COM i nie wywołuje natywnego JavaScript.

Zasadniczo jest to odpowiedź MS, jeśli spróbujesz przetestować lub uzyskać dostęp do czegoś, co nie jest częścią silnika JScript.

+0

Dzięki. Już widziałem ten komentarz, ale nie mogłem go powiązać z moim pozornie prostym przypadkiem ... –

+0

Najlepszym rozwiązaniem jest więc nigdy nie sprawdzać "! ==" niezdefiniowanego "i sprawdzić, czy jest to jedna ze znanych wartości ? Lub użyj operatora 'in' jako sugerowanego [TomaszDz] (http://stackoverflow.com/a/15152662/227299)? –

+0

Jeśli naprawdę musisz sprawdzić, czy nie ma niezdefiniowanej (i nie istnieje funkcja jako OP edytowany powyżej), to działa: (typeof myObj.myProp === 'undefined' || typeof myObj.myProp === 'unknown') – Bob

5

The ECMAScript specification stanów, że dla obiektów przyjmujące wartość powrotu operatora typeof jest:

Wykonanie zdefiniowane wyjątkiem może być "undefined", "boolean" "number" lub "string" .

Wierzę, że wartość unknown jest zwracana tylko w przeglądarce Internet Explorer. Co ciekawe, MSDN nie wspomina go:

Istnieje sześć możliwych wartości, które typeof zwraca. "Numer", "string" "logiczna", "obiekt", "funkcja" i "nieokreślone"

+0

Czy masz jakieś pomysły na podstawie jakich scenariuszy "nieznany" zostanie zwrócony? –

+4

Nie mam pojęcia, że ​​się boję. Nie mogę znaleźć żadnej prawdziwej dokumentacji na ten temat. To jest problem z obiektami hosta. Nie ma żadnych standardów, więc deweloperzy przeglądarek mogą zrobić praktycznie wszystko, czego chcą. –

+1

@BrettPostin Całe mnóstwo 'typeof == 'unknown'' w [' window.external'] (http://msdn.microsoft.com/en-us/library/ie/ms535246 (v = vs.85) .aspx) Na przykład 'typeof window.external.AutoScan' lub' window.external.CreateAuthorizationHeader' –

7

Wypróbuj operatora in. Miałem ten sam problem (z apletem) i rozwiązałem go, używając in:

if("Refresh" in opener) { 
    opener.Refresh(); 
} 
+0

Hej, dzięki! To świetna propozycja. –