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

 更新时间:2008年11月13日 10:40:20   作者:  
讨厌的东西。 关于Ajax获取HTML内容编码,与JavaScript载入脚本的动态执行问题。
两个问题:
第一题:
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 下全部通过测试。写的代码太乱,就不往上贴了,省的丢人,但是思想,应该还是正确的。
更多的问题,以后再说。

相关文章

  • 推荐10 款 SVG 动画的 JavaScript 库

    推荐10 款 SVG 动画的 JavaScript 库

    这篇文章主要推荐了10 款 SVG 动画的 JavaScript 库,非常的实用,效果也非常棒,有需要的朋友可以参考下。
    2015-03-03
  • js中有关IE版本检测

    js中有关IE版本检测

    javascript中经常用到IE版本的判定,实现特定需求的代码。检测浏览器虽然不是一个什么好的做法,但是有时候还是很必要的
    2012-01-01
  • Javascript字符串拼接小技巧(推荐)

    Javascript字符串拼接小技巧(推荐)

    下面小编就为大家带来一篇Javascript字符串拼接小技巧(推荐)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-06-06
  • 基于JavaScript打造一款桌面级便签系统

    基于JavaScript打造一款桌面级便签系统

    本文将用html,css和JavaScript实现一个简单的便签系统。除非手动清空便签,否则便签会一直保留,非常方便。感兴趣的小伙伴可以跟随小编一起动手试一试
    2022-02-02
  • 手把手教你用js插入HTML元素

    手把手教你用js插入HTML元素

    JavaScript提供了丰富的属性操作方法,用于操作各种HTML元素,下面这篇文章主要给大家介绍了关于用js插入HTML元素的相关资料,文章通过代码介绍的非常详细,需要的朋友可以参考下
    2024-06-06
  • bootstrap多层模态框滚动条消失的问题

    bootstrap多层模态框滚动条消失的问题

    本篇文章主要介绍了bootstrap多层模态框滚动条消失的问题,具有一定的参考价值,有兴趣的可以了解一下
    2017-07-07
  • js/ajax跨越访问-jsonp的原理和实例(javascript和jquery实现代码)

    js/ajax跨越访问-jsonp的原理和实例(javascript和jquery实现代码)

    最近做了一个项目,需要用子域名调用主域名下的一个现有的功能,于是想到了用jsonp来解决,在我们平常的项目中不乏有这种需求的朋友,于是记录下来以便以后查阅同时也希望能帮到大家,需要了解的朋友可以参考下
    2012-12-12
  • JavaScript中的执行环境和作用域链

    JavaScript中的执行环境和作用域链

    这篇文章主要介绍了JavaScript中的执行环境和作用域链,帮助大家更好的理解和学习JavaScript,感兴趣的朋友可以了解下
    2020-09-09
  • js实现无限层级树形数据结构(创新算法)

    js实现无限层级树形数据结构(创新算法)

    这篇文章主要介绍了js实现无限层级树形数据结构,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-02-02
  • javascript全局变量封装模块实现代码

    javascript全局变量封装模块实现代码

    javascript全局变量封装模块的应用,本文将详细介绍,需要了解更多的朋友可以参考下
    2012-11-11

最新评论