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 相关文章推荐
学习YUI.Ext第五日--做拖放Darg&amp;Drop
Mar 10 Javascript
多选列表框动态添加,移动,删除,全选等操作的简单实例
Jan 13 Javascript
jquery操作对象数组元素方法详解
Nov 26 Javascript
JS+CSS实现Li列表隔行换色效果的方法
Feb 16 Javascript
js实现文本框宽度自适应文本宽度的方法
Aug 13 Javascript
需灵活掌握的Bootstrap预定义排版类 你精通吗?
Jun 20 Javascript
video.js使用改变ui过程
Mar 05 Javascript
基于zepto.js实现登录界面
Oct 09 Javascript
浅谈React和Redux的连接react-redux
Dec 04 Javascript
Koa2微信公众号开发之本地开发调试环境搭建
May 16 Javascript
element-ui如何防止重复提交的方法步骤
Dec 09 Javascript
js实现批量删除功能
Aug 27 Javascript
刷新页面实现方式总结(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 面向对象 PHP5 中的常量
2010/05/05 PHP
php中用socket模拟http中post或者get提交数据的示例代码
2013/08/08 PHP
php-perl哈希算法实现(times33哈希算法)
2013/12/30 PHP
Linux系统递归生成目录中文件的md5的方法
2015/06/29 PHP
PHP 设计模式系列之 specification规格模式
2016/01/10 PHP
PHP单文件上传原理及上传函数的封装操作示例
2019/09/02 PHP
js禁止document element对象选中文本实现代码
2013/03/21 Javascript
js动态设置div的值下例子
2013/10/29 Javascript
js获取电脑分辨率的思路及操作
2013/11/22 Javascript
JS中如何设置readOnly的值
2013/12/25 Javascript
JQuery复制DOM节点的方法
2015/06/11 Javascript
浅谈Javascript实现继承的方法
2015/07/06 Javascript
jQuery ajax提交Form表单实例(附demo源码)
2016/04/06 Javascript
通过扫描二维码打开app的实现代码
2016/11/10 Javascript
浅析JS中常用类型转换及运算符表达式
2017/07/23 Javascript
三分钟学会用ES7中的Async/Await进行异步编程
2018/06/14 Javascript
解决vue 表格table列求和的问题
2019/11/06 Javascript
nodejs实现的http、https 请求封装操作示例
2020/02/06 NodeJs
[01:02:20]Mineski vs TNC 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/16 DOTA
[36:41]完美世界DOTA2联赛循环赛FTD vs Magma第一场 10月30日
2020/10/31 DOTA
Python GUI Tkinter简单实现个性签名设计
2018/06/19 Python
对python中的 os.mkdir和os.mkdirs详解
2018/10/16 Python
最新2019Pycharm安装教程 亲测
2020/02/28 Python
Web页面中八种创建多列等高(等高列布局)的实现技术
2012/12/24 HTML / CSS
浅谈HTML5 Web Worker的使用
2018/01/05 HTML / CSS
JoJo Maman Bébé爱尔兰官网:英国最受欢迎的精品母婴品牌
2020/12/20 全球购物
简述进程的启动、终止的方式以及如何进行进程的查看
2014/02/20 面试题
幼师专业求职推荐信
2013/11/08 职场文书
学生生病请假条范文
2014/02/16 职场文书
房产继承公证书
2014/04/09 职场文书
园林系毕业生求职信
2014/06/23 职场文书
2015年医院保卫科工作总结
2015/07/23 职场文书
2016小学教师读书心得体会
2016/01/13 职场文书
python基础之匿名函数详解
2021/04/21 Python
MySQL 使用自定义变量进行查询优化
2021/05/14 MySQL
css3 选择器
2022/05/11 HTML / CSS