Ajax,UTF-8還是GB2312 eval 還是execScript

來源:互聯網
上載者:User

兩個問題:
第一題:
xmlhttp 的 responseText 預設總是utf-8的編碼,前段時間為了以最小成本解決這個問題,索性整個項目用utf-8編碼。網上解決的方法不多,而且都是比較亂七八糟的,不喜歡。又不能以後所有都用utf-8。
第二題:
xmlhttp 載入頁的javascript指令碼,不能執行。事件的驅動卻仍然可用,前段時間為了迴避這東西,乾脆把指令碼全寫一起了。噁心,總這麼幹,每次都要載入幾百K的js檔案,噁心。

那麼,現在有時間了,最用正統的方式解決一下,
xmlhttp ,本來就是用來操作xml的,responseText 返回的東西,使用網上的二進位硬性編碼把UTF-8改成GB2312編碼的方法自然不可靠,而且如果處理其它的編碼則無能為力。使用的 responseXML 返回的 IXMLHTTPRequest 對像,依賴xml的編碼聲明,自然不可能亂碼。沒道理不用。
<?xml version="1.0" encoding="gb2312"?>
<body>
<![CDATA[
這裡將是我需要的html文本,
]]>
</body>
指令碼可以這麼寫一行;
returnValue = xmldom.documentElement.text;
returnValue 即是我所需要的html文本,相對硬性的以位元組流去改編碼,何樂而不為呢?
第一題基本解決,管你用什麼編碼,utf-8,gb2315.gbk,還是8859-1 改下文檔聲明即可。
第一個問題即然以經用了xml,那麼第二個問題也很容易解決,簡單的分析一下我們的需求,執行一個頁面的指令碼,由其是在載入的頁上,普遍是在兩個地方,載之HTML之前的聲明和載入完成時的調用。至於頁面中的使用,用DHTML的事件驅動即可,那麼變更一下XML的結構。
<?xml version="1.0" encoding="gb2312"?>
<content>
<!-- 需要在頁面載入前定義的指令碼 -->
<onStart>
<![CDATA[
// 這裡的指令碼相當於寫在head裡;
]]>
</onStart>
<!-- HTML 內容 -->
<body>
<![CDATA[
HtmlCode
]]>
</body>
<!-- 需要在頁面載入後定義的指令碼 -->
<onEnd>
<![CDATA[
// 這裡的指令碼相當於寫在 body 後的;
]]>
</onEnd>
</content>
處理指令碼,試著寫這幾行;
BeginScript = xmldom.documentElement.selectSingleNode("onStart").text;
htmlCode = xmldom.documentElement.selectSingleNode("body").text;
endScript = xmldom.documentElement.selectSingleNode("onEnd").text;
IE下似乎沒問題,但是firefox下報錯,可恨的firefox 下竟然是 textContent , selectSingleNode方法也不起作用, 瀏覽器識別的方法,隨處抄一個就好了。現在我只去管 IE 和 Firefox ,我機器上也只有這兩個,再改下代碼;
以下的前三行,是從網易部落格上抄下來的。有問題找網易好了。實在懶得自己再寫,更別提讓我上網找了。
var isIE=(document.all&&document.getElementById&&!window.opera)?true:false;
var isMozilla=(!document.all&&document.getElementById&&!window.opera)?true:false;
var isOpera=(window.opera)?true:false;

if(isIE){
BeginScript = xmldom.documentElement.getElementsByTagName("onStart").item(0).text;
htmlCode = xmldom.documentElement.getElementsByTagName("body").item(0).text;
endScript = xmldom.documentElement.getElementsByTagName("onEnd").item(0).text;
}else{
BeginScript = xmldom.documentElement.getElementsByTagName("onStart").item(0).textContent;
htmlCode = xmldom.documentElement.getElementsByTagName("body").item(0).textContent;
endScript = xmldom.documentElement.getElementsByTagName("onEnd").item(0).textContent;
}
完成。剩下的,就是怎麼去執行。
需要動態執行一段指令碼,能常會到三種方法。
a) JavaScript 中 Global 對像的 eval() 方法;
b) DHTML window 中的 execScript() 方法;
c) JavaScript 中的 new Function(); 對像;
三種方法,各有優劣,
第一種,指令碼的上下文關係使用調用時的上下文,明顯的存在範圍問題,執行後的範圍僅在調用的函數或方法體內。噁心的問題;
第二種,本身在DHTML的頂層對像window 上執行,不存在範圍問題,但是execScript() 方法,卻存在瀏覽器安全色問題。只是IE的專有方法。在Firefox 上即無法使用;
第三種,除了使用不便以外,必竟是用來聲明一個方法的,如只需要聲明一個變數的話,也是個很煩人的問題。
如果不存在瀏覽器安全色問題的考慮,那麼使用第二種是最好的選擇。
第三種,不作考慮。
第一種,若可以解決範圍問題,則是最好的。
我想到的方法如下;
我們在網頁裡聲明一個變數,
即 var author = "戲得散人";
或聲明一個函數。
即:
function getBlogUrl(){
return author + "的部落格地址: http://shizhong8841.blog.163.com";
}
在這個時候,我們相當於
window.author = "戲得散人";
window.getMyBlogUrl = function(){
return this.author + "的部落格地址:http://shizhong8841.blog.163.com";
}
那麼,我們只要稍微擴充一下window對像即可。
window.runScript = function(str){
eval(str);
}
神奇的 this 接下來,只要以 this.a=0; 或 this.funName = function(arg0){}; 這種方式編寫指令碼,並調用 runScript(str); 方法,則相當於在頁面中定義全域的屬性和方法,即可以辟開範圍問題,達到我們的目的。
現在,全部問題解決,並且在 InternetElpxerer 6.0 和 Firefax 2.0 下全部通過測試。寫的代碼太亂,就不往上貼了,省的丟人,但是思想,應該還是正確的。
更多的問題,以後再說。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.