跨浏览器的设置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 相关文章推荐
关于Aptana Studio生成自动备份文件的解决办法
Dec 23 Javascript
javascript parseInt与Number函数的区别
Jan 21 Javascript
caller和callee的区别介绍及演示结果
Mar 10 Javascript
在js中判断checkboxlist(.net控件客户端id)是否有选中
Apr 11 Javascript
JS中FRAME的操作问题实例分析
Oct 21 Javascript
JavaScript类型检测之typeof 和 instanceof 的缺陷与优化
Jan 13 Javascript
jQuery图片切换动画特效
Nov 02 Javascript
Angular2使用jQuery的方法教程
May 28 jQuery
10个最优秀的Node.js MVC框架
Aug 24 Javascript
微信小程序实现点击文字页面跳转功能【附源码下载】
Dec 12 Javascript
js登录滑动验证的实现(不滑动无法登陆)
Jan 03 Javascript
node微信开发之获取access_token+自定义菜单
Mar 17 Javascript
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/04/22 PHP
fleaphp常用方法分页之Pager使用方法
2011/04/23 PHP
PHP mb_convert_encoding文字编码的转换函数介绍
2011/11/10 PHP
php利用curl抓取新浪微博内容示例
2014/04/27 PHP
在WordPress中使用wp-cron插件来设置定时任务
2015/12/10 PHP
Laravel 不同生产环境服务器的判断实践
2019/10/15 PHP
高亮显示web页表格行的javascript代码
2010/11/19 Javascript
jquery.Ajax()方法调用Asp.Net后台的方法解析
2014/02/13 Javascript
JS实现倒计时和文字滚动的效果实例
2014/10/29 Javascript
jQuery实现在下拉列表选择时获取json数据的方法
2015/04/16 Javascript
浅谈JS正则表达式的RegExp对象和括号的使用
2016/07/28 Javascript
Javascript中的prototype与继承
2017/02/06 Javascript
vue select选择框数据变化监听方法
2018/08/24 Javascript
JS造成内存泄漏的几种情况实例分析
2020/03/02 Javascript
[02:32]DOTA2英雄基础教程 美杜莎
2014/01/07 DOTA
[01:24:16]2018DOTA2亚洲邀请赛 4.6 全明星赛
2018/04/10 DOTA
简述Python中的进程、线程、协程
2016/03/18 Python
pandas 数据结构之Series的使用方法
2019/06/21 Python
django基于cors解决跨域请求问题详解
2019/08/06 Python
python读取word 中指定位置的表格及表格数据
2019/10/23 Python
Python实现Word表格转成Excel表格的示例代码
2020/04/16 Python
MxNet预训练模型到Pytorch模型的转换方式
2020/05/25 Python
python装饰器代码深入讲解
2021/03/01 Python
使用CSS3来代替JS实现交互
2017/08/10 HTML / CSS
美国休闲服装品牌:J.Crew Factory
2017/03/04 全球购物
联想印度官方网上商店:Lenovo India
2019/08/24 全球购物
纬创Java面试题笔试题
2014/10/02 面试题
毕业生自我鉴定实例
2014/01/21 职场文书
《伯牙绝弦》教学反思
2014/03/02 职场文书
中秋节国旗下演讲稿
2014/09/05 职场文书
领导班子个人对照检查材料(群众路线)
2014/09/26 职场文书
大学生学习新党章思想汇报
2014/10/25 职场文书
2015年行政执法工作总结
2015/05/23 职场文书
小学副班长竞选稿
2015/11/21 职场文书
详解JVM系列之内存模型
2021/06/10 Javascript
《吸血鬼幸存者》新内容发布 追加多个全新模式
2022/04/07 其他游戏