Ajax,UTF-8还是GB2312 eval 还是execScript
                        
                            时间:2021-07-01 10:21:17
                            帮助过:10人阅读
							                        
                     
                    
                    
            两个问题: 
第一题: 
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 下全部通过测试。写的代码太乱,就不往上贴了,省的丢人,但是思想,应该还是正确的。 
更多的问题,以后再说。