2016-11-10 63 views
6

我正在使用一個需要在大型瀏覽器(包括IE 11)上工作的Umbraco網站,並且我遇到了一個奇怪的問題,我只能在IE 11上覆制。我是如何失去JavaScript內置對象和所有全局變量的?

在某些時候,腳本TinyMCE的插件試圖響應執行該代碼(約四來電深)爲blur事件:

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

,它拋出一個「對象不支持此操作」試圖創建時異常RegExp對象。 cls被定義並且具有我期望的值。

對未處理的異常暫停(使用Visual Studio調試器)時,我做了一些檢查。原來RegExpundefined。我發現這極其奇怪。

多一點調查顯示,所有的內置對象都是未定義的。數字,數組,對象,數學......所有這些。另外,雖然我可以枚舉全局鍵,但所有值都是未定義的。

Weirder,我可以在有問題的範圍內使用控制檯或即時執行窗口,通過使用/pattern/語法來創建正則表達式對象。

但是這種情況只有在事件處理程序的範圍內纔是真實的。只要事件處理程序退出,所有內置對象和全局變量值都已恢復。

如何在不丟失對基本JavaScript解析器和引擎的訪問權限的情況下失去對內建JavaScript對象的訪問權限?

而且,一旦失去了,是否有可能恢復它們?

+0

花不了多長時間:因爲我們可能不關心那就是BEING從DOM移除一個iframe的blur事件中,我們可以通過修改問題行跳過它在這種情況下解決問題因爲一段錯誤的代碼迭代通過每個內置的和null ...出奇怪的tho'Array = undefined'似乎成功以及RegExp等。 – tmslnz

+0

我還沒有永遠使用過IE,但是是否有可能IE瀏覽器的窗口對象(所有這些內置對象都處於打開狀態)? – Jack

+0

@傑克這是一個很好的想法。事件處理程序入口處的'window'對象缺少這些全局對象。我開始懷疑這是因爲這是在處理一個「模糊」 - 也許IE並沒有完成綁定JavaScript全局對象?不確定,仍在尋找...... –

回答

1

我遇到過這個問題,以及,假設你也有與TinyMCE的CodeMirror插件的麻煩,問題是這一行codemirror.js觸發:

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

其中window指的iframe包含CodeMirror編輯器。

此iframe位於TinyMCE對話框的內部。我發現只有當iframe(或其中的元素)在關閉對話框的同時失去焦點,纔會從DOM中刪除iframe。您可以通過在關閉對話框之前首先在iframe之外單擊(例如,在頁面疊加層上)來測試。

IE11在開始破壞iframe的window對象後,似乎正在調用blur事件。我將這個分類爲IE11中的一個錯誤,它永遠不會被修復。

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