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


Posted in Javascript onNovember 13, 2008

两个问题:
第一题:
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 下全部通过测试。写的代码太乱,就不往上贴了,省的丢人,但是思想,应该还是正确的。
更多的问题,以后再说。

Javascript 相关文章推荐
JQuery 表单中textarea字数限制实现代码
Dec 07 Javascript
js下获得客户端操作系统的函数代码(1:vista,2:windows7,3:2000,4:xp,5:2003,6:2008)
Oct 31 Javascript
JS操作图片(增,删,改) 例子
Apr 17 Javascript
jQuery获取CSS样式中的颜色值的问题,不同浏览器格式不同的解决办法
May 13 Javascript
JS中判断null、undefined与NaN的方法
Mar 24 Javascript
jQuery实现长按按钮触发事件的方法
Feb 02 Javascript
jQuery实现美观的多级动画效果菜单代码
Sep 06 Javascript
jQuery利用sort对DOM元素进行排序操作
Nov 07 Javascript
AJAX和jQuery动态加载数据的实现方法
Dec 05 Javascript
JavaScript:ES2019 的新特性(译)
Aug 08 Javascript
关于引入vue.js 文件的知识点总结
Jan 28 Javascript
jQuery实现html可联动的百分比进度条
Mar 26 jQuery
刷新页面实现方式总结(HTML,ASP,JS)
Nov 13 #Javascript
火狐浏览器(firefox)下获得Event对象以及keyCode
Nov 13 #Javascript
javascript vvorld 在线加密破解方法
Nov 13 #Javascript
javascript css float属性的特殊写法
Nov 13 #Javascript
javascript 命名空间以提高代码重用性
Nov 13 #Javascript
JavaScript面向对象之体会[总结]
Nov 13 #Javascript
js option删除代码集合
Nov 12 #Javascript
You might like
PHP中json_encode、json_decode与serialize、unserialize的性能测试分析
2010/06/09 PHP
php 广告调用类代码(支持Flash调用)
2011/08/11 PHP
详解如何在云服务器上部署Laravel
2017/06/30 PHP
PHP数组遍历的几种常见方式总结
2019/02/15 PHP
laravel利用中间件做防非法登录和权限控制示例
2019/10/21 PHP
破除一些网站复制、右键限制
2006/11/04 Javascript
随机显示经典句子或诗歌的javascript脚本
2007/08/04 Javascript
JS event使用方法详解
2008/04/28 Javascript
javascript垃圾收集机制与内存泄漏详细解析
2013/11/11 Javascript
浅谈jQuery中对象遍历.eq().first().last().slice()方法
2014/11/26 Javascript
DOM节点的替换或修改函数replaceChild()用法实例
2015/01/12 Javascript
js实现进度条的方法
2015/02/13 Javascript
jquery.guide.js新版上线操作向导镂空提示jQuery插件(推荐)
2017/05/20 jQuery
在vue-cli中组件通信的方法
2017/12/16 Javascript
JavaScript封装的常用工具类库bee.js用法详解【经典类库】
2018/09/03 Javascript
Vue.js 中的 v-show 指令及用法详解
2018/11/19 Javascript
详解Vue串联过滤器的使用场景
2020/04/30 Javascript
[42:20]2014 DOTA2华西杯精英邀请赛5 24 DK VS NewBee
2014/05/25 DOTA
[52:41]OG vs IG 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/20 DOTA
[49:17]DOTA2-DPC中国联赛 正赛 Phoenix vs Dynasty BO3 第三场 1月26日
2021/03/11 DOTA
PyQt5每天必学之事件与信号
2018/04/20 Python
python进行TCP端口扫描的实现
2018/12/21 Python
Python/Django后端使用PIL Image生成头像缩略图
2019/04/30 Python
python Matplotlib底图中鼠标滑过显示隐藏内容的实例代码
2019/07/31 Python
Python 判断时间是否在时间区间内的实例
2020/05/16 Python
完美解决keras 读取多个hdf5文件进行训练的问题
2020/07/01 Python
Python列表的深复制和浅复制示例详解
2021/02/12 Python
Keds官方网站:购买帆布运动鞋和经典皮鞋
2016/11/12 全球购物
美国一家著名的儿童鞋制造商:Stride Rite
2017/01/02 全球购物
Spartoo葡萄牙鞋类网站:线上销售鞋履与时尚配饰
2017/01/11 全球购物
RetroStage德国:复古服装
2019/02/03 全球购物
自我鉴定三原则
2014/01/13 职场文书
小学教师读书活动总结
2014/07/08 职场文书
小学生安全教育广播稿
2014/10/20 职场文书
幼儿园心得体会范文
2016/01/21 职场文书
详解Python 3.10 中的新功能和变化
2021/04/28 Python