跨浏览器的设置innerHTML方法


Posted in Javascript onSeptember 18, 2006

Ajax是个好东西,但使用起来却不是那么方便。问题总结如下:

在各种浏览器上的创建方式和使用方法不一致 
各个浏览器对响应的缓存策略有所不同 
浏览器存在跨域获取限制 
前两个问题可以通过封装 XMLHTTPRequest 对象来解决,第三个问题的解决方法有很多中,兼容性和移植性比较好的就是在本域服务器上放置一个中转 proxy 。Modello.ajax 就是提供这套解决方案的工具集。

安装
下载 Modello 和 Mdello.ajax 
解压并将 modello.js, modello.ajax.js, jsproxy.php 这三个文件放到你的服务器任意文档目录中 
在 html 页面中包含 modello.js 和 modello.ajax.js 这两个脚本文件 
urlget 方法
Modello.ajax 使用起来非常的简单,请看下面例子:

// 设置跨域中转 proxy 路径Define('URLGET_PROXY', '/jsproxy.php'); // 强大的 urlget 方法var urlget = Class.get('modello.ajax.Urllib').urlget; var url = '...'; // 同步 GET 方法获取var response = urlget(url); // 同步 POST 方法获取var data = '...';var response = urlget(url, data); // 异步 POST 方法获取var callback = function (response) {    // ...}var ret = urlget(url, data, callback); // 设置请求头部var headers = ["User-Agent: Modello.ajax's urlget"];var ret = urlget(url, data, callback, headers); // 使用命名通道var chunnel = '...';var ret = urlget(url, data, callback, headers, chunnel); // 使用 Response 对象if (response.getStatus() == 200) {    alert(response.getText());}// 设置跨域中转 proxy 路径
Define('URLGET_PROXY', '/jsproxy.php');

// 强大的 urlget 方法
var urlget = Class.get('modello.ajax.Urllib').urlget;

var url = '...';

// 同步 GET 方法获取
var response = urlget(url);

// 同步 POST 方法获取
var data = '...';
var response = urlget(url, data);

// 异步 POST 方法获取
var callback = function (response) {
    // ...
}
var ret = urlget(url, data, callback);

// 设置请求头部
var headers = ["User-Agent: Modello.ajax's urlget"];
var ret = urlget(url, data, callback, headers);

// 使用命名通道
var chunnel = '...';
var ret = urlget(url, data, callback, headers, chunnel);

// 使用 Response 对象
if (response.getStatus() == 200) {
    alert(response.getText());
}

urlget 各个参数的解释如下:

url:目标资源的 URL 地址。 
data:POST 数据。如果 data 为空,则使用 GET 方法获取。 
callback:异步获取回调函数。如果 callback 为空,则使用同步获取。 
headers:附加请求头部。这是一个数组,每一项为字符串,设置一行头部,字符串末尾不可以带回车换行。 
chunnel:命名通道。用于重用某个连接通道。 
urlget 的返回值:

如果是同步获取,成功返回 Response 对象,失败返回 false。如果是异步获取,成功返回 true,并且在获取后调用回调函数,失败返回 false。如果指定了命名通道,但该通道正在被其它请求占用,同步、异步都统一返回 false。

回调函数的参数:

response:Response 对象。 
chunnel:调用时指定的命名通道。 
Response 对象
Response 对象用于访问响应的各个数据项。它提供接口如下:

response.getStatus();     // HTTP 响应码(整数)response.getStatusText(); // 响应码的字面解释response.getHeader(key);  // 由 key 指定的响应的头部数据response.getAllHeaders(); // 响应的所有头部数据(不包含状态行)response.getRawHeader();  // 响应的原样头部数据(包含状态行)response.getText();       // 响应的体部数据response.getXML();        // 响应的体部数据格式化为 Xml Document 对象response.getStatus();     // HTTP 响应码(整数)
response.getStatusText(); // 响应码的字面解释
response.getHeader(key);  // 由 key 指定的响应的头部数据
response.getAllHeaders(); // 响应的所有头部数据(不包含状态行)
response.getRawHeader();  // 响应的原样头部数据(包含状态行)
response.getText();       // 响应的体部数据
response.getXML();        // 响应的体部数据格式化为 Xml Document 对象

大部分情况下,使用 urlget 函数足可以应付,并且它是可以跨浏览器,跨域使用的。如果你想做一些更底层的操作,Modello.ajax 为你提供两个跨浏览器使用的基类:Connection 和 Request

Connection 类
这是一个静态类,提供跨浏览器的方法返回一个 XMLHTTPRequest 对象。使用方法如下:

/* * 成功返回一个跨浏览器版本的 XMLHTTPRequest 对象, * 失败返回 null。 */var conn = Class.get('modello.ajax.Connection').get();/*
 * 成功返回一个跨浏览器版本的 XMLHTTPRequest 对象,
 * 失败返回 null。
 */
var conn = Class.get('modello.ajax.Connection').get();

Request 类
这是对 XMLHTTPRequest 对象的封装,提供更加易用的接口并解决浏览器对响应缓存的问题,但不具备跨域获取功能。Request 提供的属性和方法如下:

/* * 类的路径 */var Request = Class.get('modello.ajax.Request'); /* * 创建实例 * url, method, data 均为可选参数 */var request = new Request([url[, method[, data]]]); /* * 设置 URL */request.setURL(url); /* * 设置获取方法。目前支持:GET, POST, HEAD */request.setMethod(method); /* * 设置获取方法。目前支持:GET, POST, HEAD */request.setData(data); /* * 设置回调函数 * 回调函数的原型为: * var callback = function (response) {}; */request.setHandler(handler); /* * 设置请求头部 */request.setHeader(key, value); /* * 增加请求头部 */request.addHeader(header); /* * 发送请求 * async 为 true,使用异步方式 * 默认使用同步方式 * 调用成功,同步方式返回 response 对象,异步方式返回 true * 调用失败,统一返回 false */request.open([async]); /* * 查询当前请求的状态 * 返回一个字符串描述,可能为: * Uninitialized:未初始化 * Loading:初始化 * Loaded:发送数据 * Interactive:数据传送中 * Complete:完成 */request.getState(); /* * 返回当前使用的 Connection 对象 */request.getConnection(); /* * 返回 Response 对象 * 如果当前的请求状态不为 Complete,返回 null */request.getResponse(); /* * 中止当前请求 */request.abort(); /* * 清理所有请求头部 */request.reset(); /* * 除了上面的方法,还可以对 Request 对象设置事件处理函数 * 总共有下面几种事件 */ request.onException = function() {};request.onLoading = function() {};request.onLoaded = function() {};request.onInteractive = function() {};request.onComplete = function() {};/*
 * 类的路径
 */
var Request = Class.get('modello.ajax.Request');

/*
 * 创建实例
 * url, method, data 均为可选参数
 */
var request = new Request([url[, method[, data]]]);

/*
 * 设置 URL
 */
request.setURL(url);

/*
 * 设置获取方法。目前支持:GET, POST, HEAD
 */
request.setMethod(method);

/*
 * 设置获取方法。目前支持:GET, POST, HEAD
 */
request.setData(data);

/*
 * 设置回调函数
 * 回调函数的原型为:
 * var callback = function (response) {};
 */
request.setHandler(handler);

/*
 * 设置请求头部
 */
request.setHeader(key, value);

/*
 * 增加请求头部
 */
request.addHeader(header);

/*
 * 发送请求
 * async 为 true,使用异步方式
 * 默认使用同步方式
 * 调用成功,同步方式返回 response 对象,异步方式返回 true
 * 调用失败,统一返回 false
 */
request.open([async]);

/*
 * 查询当前请求的状态
 * 返回一个字符串描述,可能为:
 * Uninitialized:未初始化
 * Loading:初始化
 * Loaded:发送数据
 * Interactive:数据传送中
 * Complete:完成
 */
request.getState();

/*
 * 返回当前使用的 Connection 对象
 */
request.getConnection();

/*
 * 返回 Response 对象
 * 如果当前的请求状态不为 Complete,返回 null
 */
request.getResponse();

/*
 * 中止当前请求
 */
request.abort();

/*
 * 清理所有请求头部
 */
request.reset();

/*
 * 除了上面的方法,还可以对 Request 对象设置事件处理函数
 * 总共有下面几种事件
 */

request.onException = function() {};
request.onLoading = function() {};
request.onLoaded = function() {};
request.onInteractive = function() {};
request.onComplete = function() {};

jsproxy
对于跨域调用,Modello.ajax 采用在本域服务器设置一个中转 proxy 的方式。使用 proxy 方式可以不用对个别浏览器进行特殊设置,不用依赖具体的服务器,并且具备扩展能力等优点。随 Modello.ajax 工具集提供的 proxy 用 php 写成,可运行 php 的服务器都可以安装。proxy 也可以用其它语言编写,Modello.ajax 有计划在后续版本中提供 python 版的 jsproxy。下面来描述 jsproxy 的设计,有需要的朋友可以参考来实现其它语言版本的 jsproxy。

jsproxy 接收三个 POST 参数:url, data, headers。url 为目标资源的URL地址;data 为POST数据,如果为空则使用 GET 方法获取资源;headers 附加的请求头部数据。jsproxy 根据这些参数去获取目标资源,然后将收到的响应头部和响应体部全部转发给请求者。jsproxy 收到的参数是由 Modello.ajax 发出的,字符集为 UTF-8,处理的时候要注意这点。jsproxy 获取到的响应的字符集有很多种可能的,在转发响应之前 jsproxy 应该自动检测出当前响应的字符集,并在转发的响应头部指明。如果忽律这个步骤,请求者收到的响应有可能是乱码。

urlparse, urljoin 函数
urlparse, urljoin 这样的 URL 处理函数在其它脚本语言中很常见,但在 JavaScript 中却没有。Modello.ajax 提供了这两个函数,前面提到的 urlget 函数内部就使用了这两个函数。下面来解释他们的用法:

/* * urlparse:URL 分析函数 */var url = 'http://user:pass@host:port/path?query#flagment';var ret = Class.get('modello.ajax.Urllib').urlparse(url);// 这时候// ret.user == 'user'// ret.pass == 'pass'// ret.host == 'host'// ret.post == 'post',默认为 80// ret.path == 'path',以 '/' 开头// ret.query == 'query'// ret.flagment == 'flagment' /* * urljoin:合并两个 URL */var url1 = 'http://www.example.com/about/about.html';var url2 = '/index.html';var url = Class.get('modello.ajax.Urllib').urljoin(url1, url2);// 这时候// url == 'http://www.example.com/index.html'/*
 * urlparse:URL 分析函数
 */
var url = 'http://user:pass@host:port/path?query#flagment';
var ret = Class.get('modello.ajax.Urllib').urlparse(url);
// 这时候
// ret.user == 'user'
// ret.pass == 'pass'
// ret.host == 'host'
// ret.post == 'post',默认为 80
// ret.path == 'path',以 '/' 开头
// ret.query == 'query'
// ret.flagment == 'flagment'

/*
 * urljoin:合并两个 URL
 */
var url1 = 'http://www.example.com/about/about.html';
var url2 = '/index.html';
var url = Class.get('modello.ajax.Urllib').urljoin(url1, url2);
// 这时候
// url == 'http://www.example.com/index.html'

总结
Modello.ajax 提供的所有东西已经描述完毕,希望它能帮助你加速 Ajax 应用的开发;)

Javascript 相关文章推荐
强制设为首页代码
Jun 19 Javascript
类似GMAIL的Ajax信息反馈显示
Feb 16 Javascript
JavaScript具有类似Lambda表达式编程能力的代码(改进版)
Sep 14 Javascript
Javascript 异步加载详解(浏览器在javascript的加载方式)
May 20 Javascript
javascript的原生方法获取数组中的最大(最小)值
Dec 19 Javascript
Javascript浮点数乘积运算出现多位小数的解决方法
Feb 17 Javascript
jquery的ajax提交form表单的两种方法小结(推荐)
May 25 Javascript
js获取所有checkbox的值的简单实例
May 30 Javascript
ajax实现动态下拉框示例
Jan 10 Javascript
谈谈Vue.js——vue-resource全攻略
Jan 16 Javascript
JavaScript十大取整方法实例教程
Dec 03 Javascript
Vue中foreach数组与js中遍历数组的写法说明
Jun 05 Vue.js
JavaScript Base64编码和解码,实现URL参数传递。
Sep 18 #Javascript
JavaScript静态的动态
Sep 18 #Javascript
基于Web标准的UI组件 — 树状菜单(2)
Sep 18 #Javascript
JavaScript中的私有成员
Sep 18 #Javascript
javascript的事件描述
Sep 08 #Javascript
由浅到深了解JavaScript类
Sep 08 #Javascript
js常用函数 不错
Sep 08 #Javascript
You might like
一道关于php变量引用的面试题
2010/08/08 PHP
php生成shtml类用法实例
2014/12/09 PHP
js中的string.format函数代码
2020/08/11 Javascript
JS获取几种URL地址的方法小结
2014/02/26 Javascript
jQuery中的read和JavaScript中的onload函数的区别
2014/08/27 Javascript
node.js中的buffer.Buffer.isBuffer方法使用说明
2014/12/14 Javascript
jquery实现标签支持图文排列带上下箭头按钮的选项卡
2015/03/14 Javascript
javascript中的previousSibling和nextSibling的正确用法
2015/09/16 Javascript
浅谈vue自定义全局组件并通过全局方法 Vue.use() 使用该组件
2017/12/07 Javascript
VUE2 前端实现 静态二级省市联动选择select的示例
2018/02/09 Javascript
javascript function(函数类型)使用与注意事项小结
2019/06/10 Javascript
通过js给网页加上水印背景实例
2019/06/17 Javascript
Vue.js实现tab切换效果
2019/07/24 Javascript
使用vue-cli3+typescript的项目模板创建工程的教程
2020/02/28 Javascript
vue实现的多页面项目如何优化打包的步骤详解
2020/07/19 Javascript
Vue3 响应式侦听与计算的实现
2020/11/11 Javascript
vue组件是如何解析及渲染的?
2021/01/13 Vue.js
python实现NB-IoT模块远程控制
2018/06/20 Python
python flask实现分页的示例代码
2018/08/02 Python
python小项目之五子棋游戏
2019/12/26 Python
PPP协议组成及简述协议协商的基本过程
2015/05/28 面试题
幼儿园教师培训制度
2014/01/16 职场文书
运动会入场词200字
2014/02/15 职场文书
竞选班干部演讲稿100字
2014/08/20 职场文书
个人委托书如何写
2014/09/25 职场文书
终止劳动合同协议书
2014/10/05 职场文书
党的群众路线教育实践活动个人剖析材料
2014/10/07 职场文书
建议书格式
2015/02/04 职场文书
超市员工辞职信范文
2015/05/12 职场文书
2015年档案室工作总结
2015/05/23 职场文书
指导老师鉴定意见
2015/06/05 职场文书
货款欠条范本
2015/07/03 职场文书
原生Javascript+HTML5一步步实现拖拽排序
2021/06/12 Javascript
十大最强奥特曼武器:怪兽战斗仪在榜,第五奥特之父只使用过一次
2022/03/18 日漫
Windows server 2012搭建FTP服务器
2022/04/29 Servers
微信小程序纯CSS实现无限弹幕滚动效果
2022/09/23 HTML / CSS