2

這裏是版本:在IE8崩潰重裝只有當網站上的本地主機,啓動Javascript只有當,只有在IE8模式

  • IE 8.0.6001.18702
  • Visual Studio的Web開發2010 10.0.40219.1。 SP1Rel
  • 淨4.0.30319 SP1Rel
  • 的jQuery 1.6.2

當我通過Visual Studio運行在本地主機上的網站,用IE設置爲IE8模式和JavaScript啓用,瀏覽器將在頁面重新加載時崩潰。它在URL更改或標籤頁/窗口關閉時不會崩潰。我得到的消息是:

VS JIT消息:發生於IEXPLORE.EXE

未處理的win32異常[一些PID]。與VS調試時

錯誤:IEXPLORE.EXE在0x3fa078d8

未處理的異常:0000005:訪問衝突讀取位置0x00000008。

調用堆棧的位置:MSHTML.DLL 3fa078d8()

3FA078D8 MOV EAX,DWORD PTR [EBX + 8]

當我抵消調試頁面的加載通常在標籤中很好。我時不時會看到「我們無法讓您回到您正在查看的頁面。」信息。

爲了使它更有趣,這隻發生在網站的主頁上,並且不能在DEV服務器上重現。切換到IE7模式不會發生崩潰。或者註釋掉頁面底部加載的一些javascript文件。

我試着運行禁用了插件的IE8,並且崩潰仍然發生。我嘗試使用Fiddler啓用,它仍然崩潰。

+0

尼斯之一。這僅在_your_工作站上發生?我的意思是,你說它不會在DEV服務器上覆制,但在另一個Windows XP/Vista/7工作站上?重啓後?我認爲它看起來像有缺陷的內存或類似的東西... – Johnny5

+0

哦,每個在項目上工作的開發人員都能夠重現它。 :-) – travis

回答

5

我認爲崩潰可能與使用window.setTimeout()window.setInterval()有關,因爲它們似乎是在不同的JS文件中使用的唯一通用功能,這些功能導致項目在註釋掉時停止崩潰。在我們的global.js我已經添加了這個代碼,改爲使用方法:

(function (w) { 

    w.windowBind = function (eventName, handler) { 
     if (w.attachEvent) { 
      w.attachEvent("on" + eventName, handler); 
     } else if (w.addEventListener) { 
      w.addEventListener(eventName, handler, false); 
     } 
    }; 

    var timeoutsToExpire = [], 
     expireTimeouts = function() { 
      for (var i = 0, l = timeoutsToExpire.length; i < l; i++) { 
       w.clearTimeout(timeoutsToExpire[i]); 
      } 
      timeoutsToExpire = []; 
     }, 
     intervalsToExpire = [], 
     expireIntervals = function() { 
      for (var i = 0, l = intervalsToExpire.length; i < l; i++) { 
       w.clearInterval(intervalsToExpire[i]); 
      } 
      intervalsToExpire = []; 
     }; 

    w.setExpiringTimeout = function (func, time) { 
     var id = w.setTimeout(func, time); 
     timeoutsToExpire.push(id); 
     return id; 
    }; 

    w.setExpiringInterval = function (func, time) { 
     var id = w.setInterval(func, time); 
     intervalsToExpire.push(id); 
     return id; 
    }; 

    w.windowBind("unload", function() { 
     // expire timers 
     expireTimeouts(); 
     expireIntervals(); 
    }); 
    w.windowBind("beforeunload", function() { 
     // expire timers 
     expireTimeouts(); 
     expireIntervals(); 
    }); 

})(window); 

然後我更新了以前window.setTimeout()window.setInterval()引用爲了使用它們來代替。這似乎現在解決了它。

更新:也許我發佈得太快了,它只是再次爲我墜毀。但現在他們似乎非常間歇。

更新2: OK,它似乎可靠發生時,我轉移 + 刷新現在,唉。

更新3:嘗試了最新的jQuery RC,和崩潰就走了,發行說明中提到2級IE8崩潰的bug:http://blog.jquery.com/2011/08/29/jquery-1-6-3-rc1-released/

+1

我在JS沉重的應用程序中遇到了同樣的錯誤。在我閱讀關於jQuery 1.6.3的更新之前,我一直試圖隔離這個bug 1-2個小時。這解決了它。謝謝。 –

+0

很酷,很高興我能幫上忙。 – travis