2014-01-16 101 views
37

Internet Explorer 11(Windows 7版本)中的localStorage對象包含某些函數的字符串表示形式,而不是您所期望的某些函數的本地調用。在Windows 7上的IE11中損壞的JavaScript localStorage對象

這隻與香草JavaScript和網站像JSFiddle沒有這個代碼沒有問題,但我懷疑這是因爲有localStorage填充到位,糾正它。

把這個HTML網頁代碼,例如:

<!DOCTYPE html> 
<script> 
    localStorage.setItem('test', '12345'); 
    alert(localStorage.getItem('test')); 
    localStorage.clear(); 
</script> 

這工作得很好,除了爲IE11我所有安裝的瀏覽器。第一行發生錯誤'SCRIPT5002:預計功能'。

看看setItem函數實際上在IE開發人員工具控制檯中是什麼類型,說明它是一個字符串......?

typeof localStorage.setItem === 'string' // true 

打印出來的字符串setItem顯示以下內容:

"function() { 
var result; 
callBeforeHooks(hookSite, this, arguments); 
try { 
result = func.apply(this, arguments); 
} catch (e) { 
callExceptHooks(hookSite, this, arguments, e); 
throw e; 
} finally { 
callAfterHooks(hookSite, this, arguments, result); 
} 
return result; 
}" 

奇怪的是,並非所有的功能都被替換字符串,例如,相應的getItem功能的確是一個功能和工作原理預期。

typeof localStorage.getItem === 'function' // true 

將文檔模式(仿真)更改爲10或9仍然不能解決問題,並且兩者都會導致相同的錯誤。將文檔模式更改爲8會導致以下錯誤'對象不支持此屬性或方法',這是因爲IE8不支持localStorage而預期的。

是否有其他人與Windows 7上的IE11相同的問題,localStorage對象似乎「破損/腐敗」?

+0

其實localStorage [由IE 8支持](https://msdn.microsoft.com/en-us/library/bg142799(v = vs.85)。ASPX)。 –

回答

23

原因是在Windows 7 SP1的IE11基本版本(11.0.9600.16428)中存在這個問題。

在之後更新到11.0.9600.16476(更新版本11.0.2-KB2898785),問題得到解決。鏈接到其他版本的Windows(32位等)可以在patch download page的底部找到。

+1

如果有人在安裝此修補程序後仍存在此錯誤,則可能需要嘗試以下操作:雖然我已清除了網站數據,但在11.0.9600.16476版本中已出現此問題。此問題可能與應用程序緩存(html清單)或舊的LocalStorage條目有關。 –

+1

我在Windows 8.1 x64上使用IE 11.0.9600.16661時出現同樣的問題。 但是下一個系統/瀏覽器能夠正常工作: + Windows 7 SP1 IE 10.0.9200.16866; + Windows 7 SP1 IE 11.0.9600.16428; + Windows 7 SP1 IE 11.0.9600.17239; + Windows 8.1 x64 IE 11.0.9600.17126; + Windows 8.1 x64 IE 11.0.9600.17239; – Slam

+1

我在Windows Mobile 10仿真器,Edge瀏覽器中看到了這個! Edge/12.0根據用戶代理。 –

2

這不僅僅是IE11的錯。可能WEINRE被注入頁面。它hooks into several system functions to provide Developer Tools functionality,但IE11解釋賦值爲localStoragesessionStorage屬性錯誤,並將鉤子函數轉換爲字符串,就好像它們是要存儲的數據一樣。

a comment in the apache/cordova-weinre repo它說:

 #In IE we should not override standard storage functions because IE does it incorrectly - all values that set as 
     # storage properties (e.g. localStorage.setItem = function()[...]) are cast to String. 
     # That leads to "Function expected" exception when any of overridden function is called. 
     object[property] = hookedFunction unless navigator.userAgent.match(/MSIE/i) and (object is localStorage or object is sessionStorage) 

看起來像它的要麼正在使用舊版本WEINRE的,或者這種變化還沒有被正式發佈(it's been there since 2013)。

+1

WEINRE鏈接已死:https://people.apache.org/~pmuellr/weinre-docs/latest/ – 2016-08-29 10:33:01

+0

@維也納WEINRE鏈接修正:http://people.apache.org/~pmuellr/weinre/ – sompylasar