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

时间: 2024-11-01 12:30:34

Ajax,UTF-8还是GB2312 eval 还是execScript_javascript技巧的相关文章

php eval函数用法 PHP中eval()函数小技巧_php技巧

eval 将值代入字符串之中. 语法: void eval(string code_str); 传回值: 无 函式种类: 数据处理 内容说明 本函式可将字符串之中的变量值代入,通常用在处理数据库的数据上.参数 code_str 为欲处理的字符串.值得注意的是待处理的字符串要符合 PHP 的字符串格式,同时在结尾处要有分号.使用本函式处理后的字符串会沿续到 PHP 程序结束. 使用范例 复制代码 代码如下: <?php $string = '杯子'; $name = '咖啡'; $str = '这

用原生JS对AJAX做简单封装的实例代码_javascript技巧

首先,我们需要xhr对象.这对我们来说不难,封装成一个函数. var createAjax = function() { var xhr = null; try { //IE系列浏览器 xhr = new ActiveXObject("microsoft.xmlhttp"); } catch (e1) { try { //非IE浏览器 xhr = new XMLHttpRequest(); } catch (e2) { window.alert("您的浏览器不支持ajax,请

ASP+ajax注册即时提示程序代码_应用技巧

1.注册时验证数据库用户名是否存在. 2.输入密码时提示密码强度和验证2次密码输入是否一样. 3.注册时验证数据库联系邮箱是否存在. 4.注册时验证用户输入的验证码和系统产生的验证码是否一致. 5.对输入中文验证 6.QQ号码验证 7.身份证号码验证 复制代码 代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtm

php基于jquery的ajax技术传递json数据简单实例_php技巧

本文实例讲述了php基于jquery的ajax技术传递json数据简单实现方法.分享给大家供大家参考,具体如下: html页面: <html> <head> <meta http-equiv="content-type" content="text/html;charset=utf-8" /> <script type="text/javascript" src="jquery-1.8.2.mi

ajax级联菜单实现方法实例分析_javascript技巧

本文实例讲述了ajax级联菜单实现方法.分享给大家供大家参考,具体如下: 效果如下: 选择第一项,第二项.第三项的内容跟着改变. 选择第二项,第三项的内容跟着改变. 第三项则不影响第一项和第二项. 有几点值得提: 1.html到底是前台拼接还是后台拼接. 我选择的是前台拼接,这样可以节省流量,和后台的资源.这也比较符合程序处理,一般后台只负责提供数据. 通过json传递给前台,完了前台获取进行处理. ajax函数 function ajaxgetbigclass(val){ $.ajax({ t

PHP Ajax实现页面无刷新发表评论_php技巧

大家都有在网站发表评论的经历,传统的发表过程无非是:发表->提交页面表单->等待刷新页面,这样在网络比较拥挤的时候,往往需要漫长的等待,今天介绍用PHP+Ajax实现页面无刷新发表评论,希望对初学ajax的PHPer有所帮助.    那么首先,我们需要一个基本的ajax开发框架,文件ajax.js就包含了这个框架,代码如下: var http_request=false;  function send_request(url){//初始化,指定处理函数,发送请求的函数    http_requ

php的ajax框架xajax入门与试用介绍_php技巧

一.xajax与其它ajax框架的比较 xajax功能很简单,但很灵活!~它不象其它一些大的框架,功能确实强大,但执行速度不敢恭维..功能虽多,但不够灵活.api多,学起来简直如同学习一门新的语言. 二.xajax功能介绍 xajax的功能比较简单,但就因为简单,所以灵活.同时,这也要求使用者要对javascrīpt / vbs 客户端脚本有一定的了解.因为它的功能是比较活的.可以说单纯使用xajax,什么也做不出,但配合js / vbs 又什么都做的出. xajax主要是使用xajaxResp

深入认识javascript中的eval函数_javascript技巧

1)介绍javascript中的eval函数的用法 (2)如何在函数内执行全局代码 ►先来说eval的用法,内容比较简单,熟悉的可以跳过. eval函数接收一个参数s,如果s不是字符串,则直接返回s.否则执行s语句.如果s语句执行结果是一个值,则返回此值,否则返回undefined. 需要特别注意的是对象声明语法"{}"并不能返回一个值,需要用括号括起来才会返回值,简单示例如下: 复制代码 代码如下: var code1='"a" + 2'; //表达式 var c

JS基于Ajax实现的网页Loading效果代码_javascript技巧

本文实例讲述了JS基于Ajax实现的网页Loading效果代码.分享给大家供大家参考,具体如下: 这是一款很不错的网页Loading效果,常用于Ajax交互式网页设计中,点击按钮即可弹出Loading框,若Loading框未加载完成时关闭网页,会弹出确认提示框,用于一些对安全性能要求高的网页交互处理中,比如付款操作. 运行效果截图如下: 在线演示地址如下: http://demo.jb51.net/js/2015/js-ajax-web-loading-style-codes/ 具体代码如下: