none
JS語法 document.all 在 IE7 無法執行? RRS feed

  • 問題

  • 我在Vista上測試一簡單aspx網頁

    裡面有使用到 JS 語法 document.all

    但是會出現 "document.all 是 null 或不是一個物件"

    同樣aspx網頁在IE6都沒問題

    請問這是什麼原因?

    2007年5月9日 上午 01:49

解答

  • 我是覺得這也牽扯到目標網址的載入順序。

    當 location 改變會引發 window_onload

     

    若是你的目標本身是執行檔,應該使用 window.open 來開啟變成下載對話盒。

    2007年5月10日 上午 01:42
    版主
  • 恩,window.open的確可以避開這個bug (我認為是bug 因為IE6以及firefox 都不會出現此問題)

    我當初不使用window.open的原因是

    會多彈跳一個視窗,使用者觀看螢幕的感覺會比較差些

    且 IE6 會自動關閉此視窗

    IE7則不會

    IE7不知道是哪個選項要改才會自動關閉

    現在只好用setTimeout 來關閉

    2007年5月10日 上午 08:16

所有回覆

  • 我在 Win2003 + IE7 測下面是 OK ~


    HTML 原始碼

    <html>
     <head>
      <title>測試</title>
     </head>
    <script language=vbscript>
    <!--
     Sub window_onload()
      window_onclick
     End Sub

     Sub window_onclick()
      window.status = TypeName(document.all) & ":" & document.all.length
     End Sub
    -->
    </script>
     <body>
     </body>
    </html>

    2007年5月9日 上午 05:37
    版主
  • 經過我仔細測試

    我發現只有當以下三種情況同時發生時,才會出現我第一篇所說的錯誤

    1.html使用frameset

    2.使用window.setTimeout

    3.呼叫window.setTimeout之前,先執行了某個web上的winform執行檔,若一般執行檔則不會出現此錯誤 (必須先在 .net 安全性組態中設定允許此winform執行檔的執行權限)

     

    以下是index.htm

    <HTML>
     <HEAD>
      
     </HEAD>
     <frameset rows="35px,*" border="1" bordercolor="darkgray" frameSpacing="1"
      frameBorder="1">
      <frame name="topFrame" src="omit.htm">
      <frame name="bottom" src="test.htm">
      <noframes>
       <body>
        <p>此網頁使用框架,但是您的瀏覽器並不支援.</p>
       </body>
      </noframes>
     </frameset>
    </HTML>

     

    以下是test.htm (我是用vs.net2003製作一winform執行檔mytest.exe,放在web 的mytest目錄下)

    <html>
     <head>
      <title>測試</title>
     </head>
    <script>
    <!--
     function test()
     {
      alert(document.all['btn'].innerText)
     }
     
    -->
    </script>


     <body>
     <button id='btn' onclick="location='http://localhost/mytest/mytest.exe';window.setTimeout('test()',3000)">test</button>
     <button id='btn2' onclick="window.setTimeout('test()',3000)">test2</button>
     <button id='btn3' onclick="location='http://localhost/mytest/mytest.exe';test()">test3</button>
     <button id='btn4' onclick="location='http://us.dl1.yimg.com/download.yahoo.com/dl/msgr8/tw/msgr8tw.exe';window.setTimeout('test()',3000)">test4</button>
     <script>

     </body>
    </html>

     

    四個按鈕中,只有 test 會出現 "document.all 是 null 或不是一個物件" 之錯誤

    其餘test2,test3,test4 都不會

    這樣測試結果驗證了我上述所說的三點同時存在才會出錯

    已經測試過兩台XP安裝IE7以及一台vista 電腦都是同樣結果

     

    p.s. location=http://localhost...我實際在測試是用 遠端電腦的IP,我猜想用localhost結果應該也一樣

    2007年5月9日 上午 09:43
  • 先前看錯了。所以導致錯誤的結論。

     

    當你

    location='http://localhost/mytest/mytest.exe';

     

    網頁就會被釋放,這時候因為路徑的轉移,document 內容已經被清空了吧?這樣出現 document.all 為 null 也不奇怪。

     

    window.setTimeout('test()',3000)

     

     

    你先看看前面討論的這些是不是你要的:

    http://forums.microsoft.com/MSDN-CHT/Search/Search.aspx?words=%u4e0b%u8f09+%u81ea%u52d5%u95dc%u9589&localechoice=31748&SiteID=14&searchscope=allforums

    2007年5月9日 上午 10:19
    版主
  • 奇怪的是, 同樣的測試在 IE6 就完全沒問題

    而且,如果在IE7,上述測試,有三個按鈕都有執行 location=http://...../ .exe

    只有當下載的是.net 執行檔,且接著馬上執行 window.setTimeout 才會出錯

    另外兩個按鈕也都有location=..但都不會出錯,這才是最奇怪的地方

    我之前問過IEExec.exe的問題,後來發現只要灌了IE7就解決了

    (http://forums.microsoft.com/MSDN-CHT/ShowPost.aspx?PostID=1581185&SiteID=14&mode=1)

    沒想到換了IE7好像又有新的不相容情形出現

    快被打敗了.........

     

    補充一下

    錯誤是出現在執行到以下函式的document.all 時

    function test()
     {
      alert(document.all['btn'].innerText)
     }

     

    還有以vb.net 2003編譯的mytest.exe
      只是空白表單,沒有任何控制項

    也沒有任何自行撰寫的程式碼

     

    2007年5月10日 上午 01:15
  • 我是覺得這也牽扯到目標網址的載入順序。

    當 location 改變會引發 window_onload

     

    若是你的目標本身是執行檔,應該使用 window.open 來開啟變成下載對話盒。

    2007年5月10日 上午 01:42
    版主
  • 恩,window.open的確可以避開這個bug (我認為是bug 因為IE6以及firefox 都不會出現此問題)

    我當初不使用window.open的原因是

    會多彈跳一個視窗,使用者觀看螢幕的感覺會比較差些

    且 IE6 會自動關閉此視窗

    IE7則不會

    IE7不知道是哪個選項要改才會自動關閉

    現在只好用setTimeout 來關閉

    2007年5月10日 上午 08:16
  • 先前討論串有討論過 IE7 自動關閉的問題。

     

    部份人會自動關閉,比如說我的,但是好像有些人不會,具體原因還沒過濾出來。

    2007年5月10日 上午 08:31
    版主
  • 那我的視窗不會自動關閉

    會不會這兩個問題是相關的

    就是說 假如此情況下的視窗會自動關閉

    就不會發生這篇主題所說的 document.all 之問題?

    2007年5月11日 上午 02:52
  • 好像不太一樣。

     

    針對原先的問題:


    大部分人轉址後要存取原先視窗主要目的是為了關閉,所以前面討論關閉的方法。

     

    純就你這篇來說,轉址後要存取原先的視窗。基本上這種程式碼能跑本身我會認定為是 bug 。

     

    但是話又說回來,IE 在動作上是先去做 tcp connect ,等收到訊號後才會把本頁清除,若是執行檔會跳出下載視窗並返回前頁。

     

    你的問題我偏向發生在本頁清除後尚未返為原頁間,也就是 tcp connect 完成後,傳回 header + body 時。若是 header 有明確的類型資料,IE 應該會優先返回下載視窗,但有可能這三秒你還沒選好存檔位置,造成視窗內容被清除,但是尚未返回原頁。

     

    註:3 秒是以你原先 timeout 的 3000 為說明。


    針對後面的問題,就是那些網址討論的問題,不會自動關閉的狀況。我目前自己沒碰上,不能明確的推斷,我的猜想問題可能發生在:

    1. 傳回的 Header 本身並沒有明確類型訊息可讓 IE 自動判斷為下載檔案,這種簡單一點,手動去做 tcp connect 比對 header 有沒有少啥資訊。
    2. 因為某些安全性的因素防止自動關閉,有可能是 IE 、防毒軟體、廣告軟體、後門軟體、工具列軟體、頁籤軟體等,這是最難過濾的狀況。

    但是話說回來,用 Virtual PC 之類的軟體灌個乾淨的環境去測,若是乾淨的環境有問題,就是 1 或 IE 本身問題,其他就是軟體衝突,可以先測工具列軟體、頁籤軟體是否有衝突,再補入防毒軟體,至於廣告軟體、後門軟體就是安全管理問題,到防毒軟體還沒問題時,對於一般使用者重新安裝是比較保險的。

    不要信任防毒軟體可以幫你找到所有的病毒,前幾個月在 TechNet 論壇那邊的電腦安全討論區中,有家台灣的安全測試公司貼出防毒軟體測試報告及排行榜,偵測率最好的防毒軟體也才 95 % ,也就是每 20 隻病毒會漏一隻,目前電腦病毒破百萬,至少有 5 萬隻抓不到(那篇測試樣本僅採 2006及2007/01 就有數十萬隻),台灣常見的卡巴斯基、趨勢、諾頓偵測率都低於 90 % ,而廣告、後門程式甚至可能不被列入病毒,或是特定目的專門製作,並非針對大多數使用者的,永遠不會被防毒軟體列管。

    比如說,前陣子我在幫人維護時,碰上有台電腦卡巴斯基能掃出 Rootkits 的後門程式,卡巴斯基清掉後,啥事都不做晾在那邊看,半個鐘頭又中獎,可以推測那個後門是成對以上,主程式被防毒軟體宰了(僅限主系統),還會由其他部分自動復原後門系統組,但是 Rootkits 類的可能會隱身,一般像是工作管理員這類會看不到,就會很難清查,找一組後門系統估計可能要花費一天,不如直接重灌還比較快...

    2007年5月11日 上午 03:33
    版主
  • 我所說會出現document.all問題的執行檔是以 vb.net2003 編譯

    因此不會跳出檔案下載視窗,而是自動以smart client 模式來執行

    (要先加入信任網站,否則會變成檔案下載視窗)

    可能我描述的情況太多種  我自己都快搞混了

    不管啦 現在暫時正常就好了

    使用者的眼睛多看到畫面快閃過一個視窗是美中不足的地方

    唉~~~每次測試相容性問題都搞的灰頭土臉~~~狠累

    2007年5月11日 上午 04:11