首頁 >web前端 >js教程 >在服務端(Page.Write)呼叫自訂的JS方法詳解_javascript技巧

在服務端(Page.Write)呼叫自訂的JS方法詳解_javascript技巧

WBOY
WBOY原創
2016-05-16 17:26:091332瀏覽

首先,我們應該可以先明確,為什麼我們用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. ;

呵呵,這樣我們只要判斷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 load var mImgdir = "";
var mCaption = "caption";
var mMsg = "Message";
var mOkClick= null;
var timerID;
function ShowMesscapage(imgdir,caption msg,OkClick)
{
if(loadComplete)
{
KMessageBox.ShowInfo(mImgdir,mCaption,mMsg,mOkClick);   . ,function(){LoadCompleted;});     //停止定時觸發
     window.clearInterval(timerID);
    }
}
Compg. .attachEvent("onload",LoadCompleted);
//設定定時偵測機制
timerID = window.setInterval(ShowMessage,1);


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


複製程式碼複製程式碼
複製程式碼



複製程式碼



複製程式碼

程式碼如下:
if(!document.attachEvent)//Not IE{document.attachEvent = function(){document.addEventListener(arguments[00 ].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,有興趣的朋友可以共同研究下。
陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn