<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    emu in blogjava

      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
      171 隨筆 :: 103 文章 :: 1052 評論 :: 2 Trackbacks
    這個問題長期以來一直一個隨機出現,又十分難以重現和定位。幾經努力之后定位到了,在一個帶有復雜的內嵌iframe的頁面,當內嵌的iframe正在渲染的過程中關閉IE 瀏覽器的時候,會比較容易發生這個問題。

    比較容易猜想的是IE在關閉iframe的時候出現了某些問題。猜測是幾個iframe相互有通過top的腳本調用有關系,或者幾個iframe和top都在各自不同的域名下有關系,但是頁面太復雜進一步定位具體是什么問題十分困難(當試圖簡化頁面的時候,問題往往就不能重現了)。而且問題出現在瀏覽器內部,就算具體定位到了不一定就能夠解決。所以更容易和更有意義的,可能是回避“連續彈出新窗口”這個問題。

    最開始的想法是,IE既然在出問題的時候是正在渲染iframe,那么此時可能cpu特別繁忙導致了問題,如果可以回避cpu的最高峰期,把渲染iframe的動作做一定的延遲,也許就可以解決問題。試驗后發現,只是減緩了頁面的展現速度,對問題的解決基本沒用幫助。

    換個想法,想想如果我們自己做瀏覽器,我們在處理這個問題的時候會怎么做呢,容易出什么問題呢?我們可以做這樣的猜測:IE關閉窗口的時候,是先關閉和回收了最外層的window對象,然后收集它引用的各種資源,一一進行關閉和回收。也就是說,相當于一個隊列式(先打開的window對象先銷毀回收,后打開(被引用)的window對象后銷毀和回收)或者遞歸式(父window對象先銷毀,子window對象后銷毀)的操作:。

    看看下面這個測試頁面的關閉順序,其實很耐人尋味(把代碼保存為一個html文件后刷新頁面):

    <iframe name="emu1" src="javascript:'<iframe name=emu2></iframe><iframe name=emu3></iframe>'"></iframe>
    <iframe name="emu4" src="javascript:'<iframe name=emu5></iframe><iframe name=emu6></iframe>'"></iframe>
    <SCRIPT LANGUAGE="JavaScript">
    setTimeout(
    function(){
        window.attachEvent('onbeforeunload',
    function(){alert('parent')})
        frames['emu1'].attachEvent('onbeforeunload',
    function(){alert('iframe1')})
        frames['emu1'].frames['emu2'].attachEvent('onbeforeunload',
    function(){alert('iframe2')})
        frames['emu1'].frames['emu3'].attachEvent('onbeforeunload',
    function(){alert('iframe3')})
        frames['emu4'].attachEvent('onbeforeunload',
    function(){alert('iframe4')})
        frames['emu4'].frames['emu5'].attachEvent('onbeforeunload',
    function(){alert('iframe5')})
        frames['emu4'].frames['emu6'].attachEvent('onbeforeunload',
    function(){alert('iframe6')})
    },
    0)
    </SCRIPT>


    這樣子很容易帶來的一個問題是,對象的銷毀和資源的回收工作,一般來說是作為低優先級的操作,要為高優先級的操作讓路的,那么在top窗口被銷毀回收的時候,各個iframe的渲染工作,作為優先級比較高的計算,仍在繼續進行。等到各個iframe渲染完成了以后,才發現他本來以為一直在哪里的parent(或者top)句柄,現在指向了一個隨機的位置,于是就發生了不可預測的后果。

    假如問題真的是這樣,那么解決方案可能是
    1 對關閉操作觸發的銷毀和回收操作,提高優先級別,或者
    2 一但觸發關閉操作,立刻主動停止所有的渲染操作,全部資源等待回收,或者
    3 對window的關閉操作采用棧式的順序,晚創建的先銷毀,或者或者冒泡式的時序,子窗口先銷毀再銷毀父窗口。
    現在我們的問題是瀏覽器自己是不會去調整自己的運算優先級和銷毀順序的,那么我們能否用腳本來幫助它調整一下window對象的銷毀次序呢:

    <div id="emu"><iframe src="javascript:'this is an iframe'"></iframe></div>
    <SCRIPT LANGUAGE="JavaScript">
    window.attachEvent('onbeforeunload',
    function(){document.getElementById("emu").innerHTML="iframe closed";alert('parent')})
    </SCRIPT>


    經過這樣的處理后,在可以穩定重現連續打開IE窗口的計算機上,此問題消失,應該說得到了初步解決。

    這個問題其實歷史非常悠久了,flashget論壇有人認為是flashget的問題:
    http://bbs.flashget.com/post.php?action=reply&fid=14&tid=2461&repquote=16576&extra=

    阿里巴巴也蒙受了不白之冤:
    http://club.china.alibaba.com/forum/thread/view/_22629427_.html

    同樣不幸的還有土豆網,土豆的官方聲明把箭頭指向了BHO,不知是否有根據,實際試驗至少有部分機器確實選中了“啟用第三方瀏覽器擴展”,并且禁止此選項后問題解決了,但是這個操作也很難作為一個解決方案。
    http://bbs.tudou.com/topic/20061231/5686

    但是網上搜不到其他相關的解決方案,不少人都以為是中了木馬、病毒或者打開的網頁帶有惡意腳本,msdn上一時也搜不到相關的資料。特此貼出來共享 。

    posted on 2007-07-06 20:41 emu 閱讀(4515) 評論(2)  編輯  收藏

    評論

    # re: 解決IE關閉頁面時連續彈出新窗口的bug 2007-07-09 13:41 風之石
    那以后在包含IFRAME的頁中都需要這樣處理一下咯? :)  回復  更多評論
      

    # re: 解決IE關閉頁面時連續彈出新窗口的bug 2007-11-14 16:39 emu
    stackhuang同學給出的權威解釋是:

    當Navigate一個網頁的時候,Navigate在設置了URL以后就返回了,但Navigate設置了一個Timer,當Timer到達的時候就去顯示一個頁面。或者是,當頁面在下載的時候,當下載完成,也會產生一個新的瀏覽,還有腳本也可以導致一個新的瀏覽。
    瀏覽一個網頁是需要一個容器的,也就是Browser。默認情況下,IE會去找這個Browser,如果找到,則在這個Browser中打開。如果找不到,就會新創建一個IE,在新的IE中打開,那么,問題就在這里,如果這個瀏覽操作是由一個Timer引起,新打開IE的方式是不會去停止這個Timer的,于是Timer繼續運行,導致不斷的打開IE窗口。
    那么這個容器(Browser)怎么會不在呢?是因為對IE的使用不當造成的,如果IE沒有完全釋放,但同時又關閉了IE的窗口,那么就會造成IE不停的彈出。
    那么這個問題為什么是隨機的呢?因為受網絡環境,機器CPU繁忙程度的影響,新打開一個頁面的時機是不確定的

    ------------------------------------------------
    stackhuang同學的補充解釋:

    大概就是,IE在瀏覽的時候會判斷一個標志,如果true,則在當前窗口中打開,為false則在新窗口中打開,當IE窗口已經關閉的時候,如果IE釋放不完全,那么可能Document對象還存在,但這個標志就為false了,于是新打開了一個IE,同時,這個操作不會返回一個成功的標志,導致開始的Timer以為沒有瀏覽成功于是繼續運行。  回復  更多評論
      


    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 最近免费中文字幕MV在线视频3 | 国产亚洲一区二区在线观看| 久久这里只精品99re免费| 亚洲人妖女同在线播放| 一本色道久久88综合亚洲精品高清| 丁香花在线视频观看免费| 亚洲日韩一中文字暮| 亚洲精品无码不卡在线播HE | 男男AV纯肉无码免费播放无码 | 亚洲AV成人影视在线观看| 亚洲性在线看高清h片| 国产精品1024永久免费视频| 一级毛片免费在线| 亚洲女人初试黑人巨高清| 亚洲女人被黑人巨大进入| 日本h在线精品免费观看| 一级毛片免费播放视频| 麻豆狠色伊人亚洲综合网站| 亚洲精品国产精品乱码不卡√| 成年女人毛片免费视频| 久久久久久国产精品免费免费男同 | 精品国产综合成人亚洲区| 成人免费视频小说| 91老湿机福利免费体验| 一级做a爰片久久毛片免费陪| 亚洲国产情侣一区二区三区| 亚洲AV永久青草无码精品| 夜色阁亚洲一区二区三区| 成人au免费视频影院| 1000部免费啪啪十八未年禁止观看 | 中文字幕影片免费在线观看| 青青青国产手机频在线免费观看 | 日韩精品福利片午夜免费观着| 免费福利电影在线观看| 全黄A免费一级毛片| 亚洲av无码成人影院一区| 亚洲国产成人精品无码一区二区| 亚洲VA成无码人在线观看天堂| 亚洲精品国产电影| 免费在线观看你懂的| 午夜私人影院免费体验区|