[JavaScript]如何在服務端(Page.Write)調用自訂的JS方法

來源:互聯網
上載者:User

如何在服務端(Page.Write)調用自訂的JS方法

-Written by 浪子@cnblogs.com  (06-08-28)

自從[JavaScript]自訂MessageBox一文發布以後,很多網友都來信詢問,如何在服務端調用ShowInfo方法,周末休息想了個折中的辦法來實現。

首先,我們應該可以先明確,為什麼我們用Page.Write把自訂的JS方法輸出到頁面上為什麼IE不能識別,會出現“XXX未定義”的錯誤。原因很簡單,因為我們用Page.Write輸出的指令碼是出現在頁面的最頂端。IE讀到是javascript函數的時候,就開始執行,但是此時我們link的js檔案並未被IE讀入,所以IE無法識別我們定義在js檔案裡面的方法。那write alert為什麼可以呢?因為alert是IE內嵌的指令碼功能函數,不管有沒有頁面,IE都認得它。

 

找到問題所在,自然就好解決了:

1、把我們自訂的方法內嵌到IE裡面。 ---> 看起來有點異想天開,呵呵

2、等頁面載入完成後再觸發事件。 --->觸發事件,沒錯。

 

如何知道頁面是否載入完成呢?

1、通過document的狀態

2、通過事件觸發(windows.onload)

 

第一種好像比較不保險,有時候明明已經全部載完了,它還是一直顯示在傳送資料(FF此情況最明顯),所以還是用事件比較保險一點。

 

定義一個簡單方法,掛載到windows.onload裡面,執行的時候做一個標識

 

var loadComplete = false;function LoadCompleted(){loadComplete= true;}window.attachEvent("onload",LoadCompleted);

呵呵,這樣我們只要通過判斷loadComplete來取得頁面是否載入完畢了。

 

var mImgdir = "";var mCaption = "caption";var mMsg = "Message";var mOkClick= null;function ShowMessage(imgdir,caption,msg,OkClick){if(loadComplete){KMessageBox.ShowInfo(mImgdir,mCaption,mMsg,mOkClick);}}

這樣子在loadComplete未false的情況下,我們就不會去執行KMessageBox.ShowInfo()方法,只然就不會出現JS錯誤提示了。

 

單單這樣子,還不行,因為輸出的這樣的指令碼,IE只在輸出頁面的時候執行了一次,但是此時loadComplete=false,所以,我們需要定時檢測頁面是否載入完畢。說到定時,只然是祭出setTimeout & setInterval. 我們這裡需要不停的檢測,故使用setInterval方法。最終代碼如下:

 

var loadComplete = false;var mImgdir = "";var mCaption = "caption";var mMsg = "Message";var mOkClick= null;var timerID;function ShowMessage(imgdir,caption,msg,OkClick){if(loadComplete){KMessageBox.ShowInfo(mImgdir,mCaption,mMsg,mOkClick);
     //卸載此事件
window.detachEvent("onload",function(){LoadCompleted;});
//停止定時觸發 window.clearInterval(timerID);

    }

}

function LoadCompleted() { loadComplete=true; }

window.attachEvent("onload",LoadCompleted);

//設定定時檢測機制
timerID = window.setInterval(ShowMessage,1);

 

當然以上代碼只相容IE,因為使用attachEvent 和 detachEvent,至於讓他相容其他瀏覽器可以參看[JavaScript]自訂Title的顯示方式一文中的處理方式:

 

if(!document.attachEvent)//Not IE{document.attachEvent = function(){document.addEventListener(arguments[0].substr(2),arguments[1],arguments[2])}}if(!window.attachEvent)//Not IE{window.attachEvent = function(){window.addEventListener(arguments[0].substr(2),arguments[1],arguments[2])}}

 

在服務端,只要StringBuilder出以上的指令碼,然後Write出來就可以了。上面也只是提供了一種思路,當然還會有其他的辦法,比如我不適用定時檢測,我直接掛載到windows.onload裡面,讓頁面自動監聽,自動執行,也未嘗不可:),正所謂條條大路通羅馬嘛~~~~~

 

以上思路來自yui,並且yui實現了一個更漂亮的自訂MessageBox,有興趣的朋友可以共同研究下。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.