2016-11-10 43 views
6

Pracuję nad witryną Umbraco, która musi działać w dużych przeglądarkach, w tym w IE 11, i natknąłem się na dziwny problem, który mogę tylko powielić na IE 11.W jaki sposób utraciłem wbudowane obiekty JavaScript i wszystkie zmienne globalne?

W pewnym momencie skrypt dla TinyMCE plug-in próbuje wykonać ten kod (głęboki około cztery połączenia) w odpowiedzi na blur imprezy:

function classTest(cls) { return new RegExp("(^|\\s)" + cls + "(?:$|\\s)\\s*"); } 

i generuje „Obiekt nie obsługuje tej akcji” wyjątek podczas próby utworzenia obiekt RegExp. cls jest zdefiniowany i ma wartość, jakiej oczekuję.

Podczas pauzy (przy użyciu debugera Visual Studio) na nieobsługiwanym wyjątku, zrobiłem małe sprawdzanie.

Okazuje się, że RegExp to undefined. Znalazłem ten niesamowity .

Nieco więcej badań wykazało, że WSZYSTKIE wbudowane obiekty były niezdefiniowane. Numer, macierz, obiekt, matematyka ... wszystkie. Ponadto, chociaż mogłem wyliczyć klucze globalne, wszystkie wartości również były niezdefiniowane.

Jeszcze dziwniej, mogłem użyć okien konsoli lub natychmiastowego wykonania w ramach problematycznego zakresu, aby utworzyć obiekty wyrażenia regularnego, używając składni /pattern/.

Ale ten warunek jest prawdziwy tylko w zakresie obsługi zdarzeń. Zaraz po zakończeniu procedury obsługi zdarzeń wszystkie wbudowane obiekty i wartości zmiennych globalnych zostały przywrócone.

Jak można stracić dostęp do wbudowanych obiektów JavaScript, bez utraty dostępu do podstawowego parsera JavaScript i silnika?

A po zagubieniu można je przywrócić?

+0

nie zajmie długo za niepoprawny fragment kodu do iteracji poprzez każdy wbudowany i zerowanie go ... Dość dziwne, że "Array = undefined" wydaje się być skuteczne, jak również "RegExp", itp. – tmslnz

+0

Nie używałem IE na zawsze, ale czy to możliwe, że IE zacienia obiekt 'window' (na którym są wszystkie wbudowane obiekty)? – Jack

+0

@Jack To dobra myśl. Obiekt 'window' przy wejściu do procedury obsługi zdarzeń nie zawiera tych obiektów globalnych. Zaczynam podejrzewać, że dzieje się tak dlatego, że obsługuje on 'blur' - może IE nie zakończyło wiązania obiektów globalnych JavaScript? Nie jestem pewien, wciąż wyglądam ... –

Odpowiedz

1

doświadczyłem tego problemu, jak również i przy założeniu, że również kłopoty z plugin TinyMCE CodeMirror, problem jest wywołany przez tę linię w codemirror.js:

on(window, "blur", function() { return forEachCodeMirror(onBlur); }) 

gdzie window odnosi się do iframe zawierający edytor CodeMirror.

Ten element iframe znajduje się w oknie dialogowym TinyMCE. Odkryłem, że błąd występuje tylko wtedy, gdy element iframe (lub element wewnątrz niego) traci ostrość w tym samym czasie, gdy okno dialogowe jest zamknięte, usuwając element iframe z DOM. Możesz to sprawdzić, klikając najpierw poza ramką iframe (na przykład na nakładce strony) przed zamknięciem okna dialogowego.

Wydaje się, że IE11 wywołuje zdarzenie blur po rozpoczęciu niszczenia obiektu ifram o nazwie window. Zaklasyfikuję to jako błąd w IE11, który nigdy nie zostanie naprawiony. Ponieważ prawdopodobnie nie dbają o zdarzeniu w iframe, który jest usuwany z DOM blur możemy obejść ten problem modyfikując linię problemu pominąć go w tym przypadku:

on(window, "blur", function() { if (window.RegExp) return forEachCodeMirror(onBlur); })