存档

文章标签 ‘ajax’

ajax-cross-domain

2010年5月19日

现在是Web 2.0时代,AJAX使用得非常多。但是使用纯粹的AJAX,经常会遇到跨域的问题。

其实归结起来,解决跨域问题,也不外乎几种方式:

1、代理方式

2、on-Demand方式

3、iframe方式

4、用户本地转储方式 (local)

5、其实还是在服务端A用iframe解决了与服务器B通信的问题

6、PHP + HTML(含JS)

其实这几种方式,原理基本上都是一样的,绕开AJAX对于跨域的限制。下面就对这几种处理方式大概谈一下。

1、web代理方式

即用户访问A网站时所产生的对B网站的跨域访问请求均提交到A网站的指定页面,由该页面代替用户页面完成交互,从而返回合适的结果。此方案可以解决现阶段所能够想到的多数跨域访问问题,但要求A网站提供Web代理的支持,因此A网站与B网站之间必须是紧密协作的,且每次交互过程,A网站的服务器负担增加,且无法代用户保存session状态。

2、on-Demand 方式

MYMSN的门户就用的这种方式,不过 MYMSN中不涉及跨域访问问题。在页面内动态生成新的<script>,将其src属性指向别的网站的网址,这个网址返回的内容必须是合法的Javascript脚本,常用的是JSON消息。此方案存在的缺陷是, script的src属性完成该调用时采取的方式时get方式,如果请求时传递的字符串过大时,可能会无法正常运行。不过此方案非常适合聚合类门户使用。

<html>
<head>
<script language="javascript" type="text/javascript">
function loadContent()
{
var s=document.createElement(‘SCRIPT’);
s.src=’http://www.anotherdomain.com/TestCrossJS.aspx?f=setDivContent’;
document.body.appendChild(s);
}

function setDivContent(v)
{
var dv = document.getElementById("dv");
dv.innerHTML = v;
}
</script>
</head>
<body>
<div id="dv"></div>

<input type="button" value="Click Me" onclick="loadContent()">
</body>
</html>

其中的www.anotherdomain.com/TestCrossJS.aspx是这样的,

<script language="C#" runat="server">
void Page_Load(object sender, EventArgs e)
{
  string f = Request.QueryString["f"];
  Response.Clear();
  Response.ContentType = "application/x-javascript";
  Response.Write(String.Format(@"
                   {0}(‘{1}’);",
                   f,
                   DateTime.Now));
  Response.End();
}
</script>

点击“Click Me”按钮,生成一个新的script tag,下载对应的 Javascript 脚本,结束时回调其中的setDivContent(),从而更新网页上一个div的内容。 

3、iframe方式

查看过醒来在javaeye上的一篇关于跨域访问的帖子,他提到自己已经用iframe的方式解决了跨域访问问题。数据提交跟获取,采用 iframe这种方式的确可以了,但由于父窗口与子窗口之间不能交互(跨域访问的情况下,这种交互被拒绝),因此无法完成对父窗口效果的影响。

在页面内嵌或动态生成指向别的网站的IFRAME,然后这2个网页间可以通过改变对方的anchor hash fragment来传输消息。改变一个网页的anchor hash fragment并不会使浏览器重新装载网页,所以一个网页的状态得以保持,而网页本身则可以通过一个计时器(timer)来察觉自己anchor hash的变化,从而相应改变自己的状态。

1. http://domain1/TestCross.html:

<html>
<head>
<script language="javascript" type="text/javascript">
var url = "http://domain2/TestCross.html"
var oldHash = null;
var timer = null;

function getHash()
{
var hash = window.location.hash;
if ((hash.length >= 1) && (hash.charAt(0) == ‘#’))
{
hash = hash.substring(1);
}

return hash;
}
function sendRequest()
{
var d = document;
var t = d.getElementById(‘request’);
var f = d.getElementById(‘alienFrame’);
f.src = url + "#" + t.value + "<br/>" + new Date();
}

function setDivHtml(v)
{
var d = document;
var dv = d.getElementById(‘response’);
dv.innerHTML = v;
}

function idle()
{
var newHash = getHash();

if (newHash != oldHash)
{
setDivHtml(newHash);
oldHash = newHash;
}

timer = window.setTimeout(idle, 100);
}

function window.onload()
{
timer = window.setTimeout(idle, 100);
}
</script>
</head>
<body>

请求:<input type="text" id="request"> <input type="button" value="发送" onclick="sendRequest()" /><br/>
回复:<div id="response"></div>

<iframe id="alienFrame" src="http://domain2/TestCross.html"></iframe>

</body>
</html>

2. http://domain2/TestCross.html:

<html>
<head>
<script language="javascript" type="text/javascript">
var url = "http://domain1/TestCross.html"
var oldHash = null;
var timer = null;

function getHash()
{
var hash = window.location.hash;
if ((hash.length >= 1) && (hash.charAt(0) == ‘#’))
{
hash = hash.substring(1);
}

return hash;
}
function sendRequest()
{
var d = document;
var t = d.getElementById(‘request’);
var f = parent;
//alert(f.document); //试着去掉这个注释,你会得到“Access is denied”
f.location.href = url + "#" + t.value + "<br/>" + new Date();
}

function setDivHtml(v)
{
var d = document;
var dv = d.getElementById(‘response’);
dv.innerHTML = v;
}

function idle()
{
var newHash = getHash();

if (newHash != oldHash)
{
setDivHtml(newHash);
oldHash = newHash;
}

timer = window.setTimeout(idle, 100);
}

function window.onload()
{
timer = window.setTimeout(idle, 100);
}
</script>
</head>
<body>

请求:<input type="text" id="request"> <input type="button" value="发送" onclick="sendRequest()" /><br/>
回复:<div id="response"></div>

</body>
</html>

两个网页基本相同,第一个网页内嵌一个IFRAME,在点击“发送”按钮后,会将文本框里的内容通过hash fragment传给IFRAME。点击IFRAME里的“发送”按钮后,它会将文本框里的内容通过hash fragment传给父窗口。因为是只改动了hash fragment,浏览器不会重新load网页内容,这里使用了一个计时器来检测URL变化,如果变化了,就更新其中一个div的内容 。

4、用户本地转储方式 (local)

IE本身依附于windows平台的特性为我们提供了一种基于iframe,利用内存来“绕行”的方案,即两个window之间可以在客户端通过 windows剪贴板的方式进行数据传输,只需要在接受数据的一方设置Interval进行轮询,获得结果后清除Interval即可。FF的平台独立性决定了它不支持剪贴板这种方式,而以往版本的FF中存在的插件漏洞又被fixed了,所以FF无法通过内存来完成暗渡陈仓。而由于文件操作FF 也没有提供支持(无法通过Cookie跨域完成数据传递),致使这种技巧性的方式只能在IE中使用。

5、其实还是在服务端A用iframe解决了与服务器B通信的问题

要解决的问题:发生在用户提交网页 URL (还包括 Tag, Notes 等)给 Bookmark 服务器时。

关于 URL 的提交至少可以有三种方式:

1.       登陆 Bookmark 服务器的提交页面,将要收藏的 URL 通过该页面提交给服务器。

2.       安装浏览器插件,通过插件将 URL 提交给服务器。

3.       从 Bookmark 服务器动态加载 javascript 小工具到当前页面,通过它来完成提交工作。

    第一种方式开发起来最简单,但对用户来讲比较麻烦,每次都需要先登陆 Bookmark 服务器才能完成提交;第二种方式我并不熟悉插件开发,而且用户也不喜欢太多的插件堆满自己的浏览器;第三种方式开发难度小,又避免了每次登陆服务器的麻烦,所以最终采用它。第三种方式中动态加载的 javascript 小工具除了需要生成 UI 供用户填写信息( URL , tag , notes 等),当用户点击提交的时候,还要完成与服务器通信的功能。

     跨域访问,简单来说就是 A 网站的 javascript 代码试图访问 B 网站,包括提交内容和获取内容。由于安全原因,跨域访问是被各大浏览器所默认禁止的。写过跨域访问 ajax 的朋友相信都遇到过被告知“没有权限”的情况。通过 XMLHttp 来发送数据给 Bookmark 服务器的尝试失败了。于是,看到网上的一些资料,我又开始尝试用 javascript 小工具在用户网页动态创建一个隐藏的 iframe, iframe 的 src 指向服务器的一个 servlet ,试图通过调用 iframe 中提供的 javascript 来完成与服务器的通信。但不幸的是,用户网页中的 javascript 代码访问 iframe 也被浏览器归为跨域访问(特指 iframe 的 src 指向其它网站的情形),尝试再次失败。

最终,在一篇文章中看到,与 iframe 不同,如果 A 网站从 B 网站加载 javascript , A 网站可以自由的访问该 javascript 的内容,并不会被浏览器认为是跨域访问。模仿刚才 iframe 的思路,当用户点击提交时,可以动态创建一个 javascript 对象,该对象的 src 指向 Bookmark 服务器的一个 servlet ,注意: URL 、 Tag 、 Notes 、 User 、Password 等信息被作为 src URL 参数传给服务器。请看下面的代码:

var url = "http://localhost:8080/Deeryard/BookmarkServlet?" +

           "url=" + url_source + "&" + "title=" + title + "&" +

"tag=" + tag + "&" + "notes=" + notes + "&" + "user=" + user + "&" + "password=" + password;

url = encodeURI(url);

//Submit to server with a trick

var js_obj = document.createElement( "script" );

js_obj.type = "text/javascript" ;

js_obj.setAttribute( "src" , url);

//Get response from server by appending it to document

document.body.appendChild(js_obj);

上面例子中, js_obj.setArrribute() 将信息作为 src 的 URL 参数提交给了 Bookmark servlet 。那么用户又如何取得服务器的响应信息呢?答案就是最末一行代码, servlet 的输出必须是 javascript 代码,它可以调用用户网页上的其他 javascript 函数,以及操作 dom 对象。下面的 servlet 代码生成了一个 javascript 函数调用:

out.write("onServerResponse(INADEQUATE_INFORMATION);");

document.body.appendChild(js_obj) 执行后 onServerResponse( INADEQUATE_INFORMATION) 就会得到执行,使客户网页响应服务器结果。这样一个完整的通信过程就完成了。

6、PHP + HTML(含JS)

服务器A上已经装好了Tomcat, 我们写一个test.html(含JS),再写一个PHP文件(由其来完成跨域通信要求)。

更多地,请参考:https://www6.software.ibm.com/developerworks/cn/education/xml/x-ajaxtrans/index.html

http://www.xyhhxx.com/news/net/20061013121041.htm

 

以上几种方式,其实方式都差不多,只是实现方式不同而已。诸君可根据具体情况选择其一做为具体的解决办法。

 

怎么样?简单吧?简单就回复一下。。。。

HTML, Javascript, PHP从入门到精通

关于web开发中的POST与GET表单提交方式

2009年9月14日

近日在给前期所作博客添加一个功能模块时,无意中发现一个BUG,就是在博客的模块配置时,总是可能会在某个位置出错。但也总找不到出错的具体位置,很是纳闷!

后经过测试前辈的努力,终于把这小虫子给抓了出来。只要在IE7及以下版本的浏览器上完全选中所有模块,这时就会出现意料不到的错误。而IE8、FF3却一点问题都没有,难怪我在开发时没有测出任何问题,因为我的电脑上就是IE8和FF3。

问题是找出来了,但是原因是什么呢?

这又是一费心事,于是慢慢追寻,却发现是在博客配置时采用的AJAX的问题。当时所采用的AJAX所使用的提交方式为GET方式。GET方式与POST方式的区别,这里自不必讲,有兴趣的朋友可参见本博另一文。由于GET方式是将所有的参数以值对的方式转入,并也就只支持大约2M的数据,当时采用GET方式完全满足要求。但是现在刚添加一个模块,在完全选中时,整个数据量就刚好超过了2M,难怪IE7及以下版本的浏览器会出问题。

找到了问题所在了,就很容易了,只需要将所使用的AJAX改为POST方式提交即可。

虽然这个BUG是解决掉了,但是为何同一种提交方式,在不同浏览器却有不同的表现呢?这个不得其解,有知道这问题的朋友可留言解答,也可一起探讨该问题。

为谢!

HTML , , ,

执行innerHTML中的Javascript

2009年2月10日

在使用AJAX时,往往只是将reponse的内容直接innerHTML到指定的容器里面,这种应用都非常简单。但是对于reponse的内容包含javascript内容时将如何处理呢?能否执行其返回的JS呢?

实际上,对于返回的内容,页面不会直接执行该JS代码,google一下,才发现关于这个问题的解决方法大概有三种:

1、首先在head标签内容设定一个指定ID的script标签,待响应时修改其src 属性。

2、创建一个iframe,然后将JS写入到该IFRAME中,对于要操作原页面的HTML标签,需要在里面的JS中添加parent。

3、应用较多的set_innerHTML,该函数是由andot所开发的。

以下为set_innerHTML函数内容。

var global_html_pool = [];
var global_script_pool = [];
var global_script_src_pool = [];
var global_lock_pool = [];
var innerhtml_lock = null;
var document_buffer = "";

function set_innerHTML(obj_id, html, time) {
if (innerhtml_lock == null) {
innerhtml_lock = obj_id;
}
else if (typeof(time) == "undefined") {
global_lock_pool[obj_id + "_html"] = html;
window.setTimeout("set_innerHTML('" + obj_id + "', global_lock_pool['" + obj_id + "_html']);", 10);
return;
}
else if (innerhtml_lock != obj_id) {
global_lock_pool[obj_id + "_html"] = html;
window.setTimeout("set_innerHTML('" + obj_id + "', global_lock_pool['" + obj_id + "_html'], " + time + ");", 10);
return;
}

function get_script_id() {
return "script_" + (new Date()).getTime().toString(36)
+ Math.floor(Math.random() * 100000000).toString(36);
}

document_buffer = "";

document.write = function (str) {
document_buffer += str;
}
document.writeln = function (str) {
document_buffer += str + "\n";
}

global_html_pool = [];

var scripts = [];
html = html.split(/<\/script>/i);
for (var i = 0; i < html.length; i++) {
global_html_pool[i] = html[i].replace(/<script[\s\S]*$/ig, "");
scripts[i] = {text: '', src: '' };
scripts[i].text = html[i].substr(global_html_pool[i].length);
scripts[i].src = scripts[i].text.substr(0, scripts[i].text.indexOf('>') + 1);
scripts[i].src = scripts[i].src.match(/src\s*=\s*(\"([^\"]*)\"|\'([^\']*)\'|([^\s]*)[\s>])/i);
if (scripts[i].src) {
if (scripts[i].src[2]) {
scripts[i].src = scripts[i].src[2];
}
else if (scripts[i].src[3]) {
scripts[i].src = scripts[i].src[3];
}
else if (scripts[i].src[4]) {
scripts[i].src = scripts[i].src[4];
}
else {
scripts[i].src = "";
}
scripts[i].text = "";
}
else {
scripts[i].src = "";
scripts[i].text = scripts[i].text.substr(scripts[i].text.indexOf('>') + 1);
scripts[i].text = scripts[i].text.replace(/^\s*<\!--\s*/g, "");
}
}

var s;
if (typeof(time) == "undefined") {
s = 0;
}
else {
s = time;
}

var script, add_script, remove_script;

for (var i = 0; i < scripts.length; i++) {
var add_html = "document_buffer += global_html_pool[" + i + "];\n";
add_html += "document.getElementById('" + obj_id + "').innerHTML = document_buffer;\n";
script = document.createElement("script");
if (scripts[i].src) {
script.src = scripts[i].src;
if (typeof(global_script_src_pool[script.src]) == "undefined") {
global_script_src_pool[script.src] = true;
s += 2000;
}
else {
s += 10;
}
}
else {
script.text = scripts[i].text;
s += 10;
}
script.defer = true;
script.type =  "text/javascript";
script.id = get_script_id();
global_script_pool[script.id] = script;
add_script = add_html;
add_script += "document.getElementsByTagName('head').item(0)";
add_script += ".appendChild(global_script_pool['" + script.id + "']);\n";
window.setTimeout(add_script, s);
remove_script = "document.getElementsByTagName('head').item(0)";
remove_script += ".removeChild(document.getElementById('" + script.id + "'));\n";
remove_script += "delete global_script_pool['" + script.id + "'];\n";
window.setTimeout(remove_script, s + 10000);
}

var end_script = "if (document_buffer.match(/<\\/script>/i)) {\n";
end_script += "set_innerHTML('" + obj_id + "', document_buffer, " + s + ");\n";
end_script += "}\n";
end_script += "else {\n";
end_script += "document.getElementById('" + obj_id + "').innerHTML = document_buffer;\n";
end_script += "innerhtml_lock = null;\n";
end_script += "}";
window.setTimeout(end_script, s);
}

在实际的应用中稍有修改。例如,对于第一次使用ajax所返回的HTML中的JS来修改所返回的HTML中的某个DIV,这样往往会看不到实际修改的结果。经研究发现,曾执行了两次写入操作。于此,只需要将修改操作的timeout的时间改长一点即可(即add_script的执行时间)。

HTML, Javascript , , , , , , ,

js+xml省市联动

2008年5月23日

city.html

<script language=”JavaScript”>
<!–
var xmldom = new ActiveXObject(“Microsoft.XMLDOM”);
var province = [];
var cities = [];
function init()
{
xmldom.async = true;
xmldom.onreadystatechange = statInit;
window.setTimeout(function()
{
xmldom.load(“city.xml”);
}
, 10);
}

function statInit()
{

if (xmldom.readyState == 4)
{
if (xmldom == null || xmldom.documentElement == null)
{
alert(“XML文件不存在或没有菜单项”);
return ;
}
createProvince();
}
}

function createProvince()
{
var provinces = xmldom.getElementsByTagName(“province”);
delitem(document.all.province);
delitem(document.all.city);
for (var i = 0; i < provinces.length; i++)
{
province[i] = provinces[i].getAttribute(“name”);
cities[i] = provinces[i].getAttribute(“cities”);
document.all.province.add(window.Option(province[i], province[i]));
}
provinceChange(0);
}

function provinceChange(index)
{
var city = cities[index].split(” “);
delitem(document.all.city);
for (var i = 0; i < city.length; i++)
{
document.all.city.add(window.Option(city[i], city[i]));
}
}

function delitem(options)
{
optioncount = options.length;
for (i = optioncount – 1; i >= 0; i–)
{
options.options[i] = null
}
}
//–>
</script>
<body onload=”init()”>
<select name=”province” onchange=”provinceChange(this.selectedIndex)”></select>
<select name=”city”></select>
</body>

city.xml

<?xml version=”1.0″ encoding=”gb2312″?>
<china>
<province name=”全选” cities=”全选”/>
<province name=”安徽” cities=”全选 安庆 蚌埠 巢湖 池州 滁州 阜阳 合肥 淮北 淮南 黄山 六安 马鞍山 宿州 铜陵 芜湖 宣城 亳州”/>

<province name=”北京” cities=”全选 北京”/>

<province name=”福建” cities=”全选 福州 龙岩 南平 宁德 莆田 泉州 三明 厦门 漳州”/>

<province name=”甘肃” cities=”全选 白银 定西 甘南藏族自治州 嘉峪关 金昌 酒泉 兰州 临夏回族自治州 陇南 平凉 庆阳 天水 武威 张掖”/>

<province name=”广东” cities=”全选 潮州 东莞 佛山 广州 河源 惠州 江门 揭阳 茂名 梅州 清远 汕头 汕尾 韶关 深圳 阳江 云浮 湛江 肇庆 中山 珠海”/>

<province name=”广西” cities=”全选 百色 北海 崇左 防城港 桂林 贵港 河池 贺州 来宾 柳州 南宁 钦州 梧州 玉林”/>

<province name=”贵州” cities=”全选 安顺 毕节 贵阳 六盘水 黔东南苗族侗族自治州 黔南布依族苗族自治州 黔西南布依族苗族自治州 铜仁 遵义”/>

<province name=”海南” cities=”全选 白沙黎族自治县 保亭黎族苗族自治县 昌江黎族自治县 澄迈县 定安县 东方 海口 乐东黎族自治县 临高县 陵水黎族自治县 琼海 琼中黎族苗族自治县 三亚 屯昌县 万宁 文昌 五指山 儋州”/>

<province name=”河北” cities=”全选 保定 沧州 承德 邯郸 衡水 廊坊 秦皇岛 石家庄 唐山 邢台 张家口”/>

<province name=”河南” cities=”全选 安阳 鹤壁 济源 焦作 开封 洛阳 南阳 平顶山 三门峡 商丘 新乡 信阳 许昌 郑州 周口 驻马店 漯河 濮阳”/>

<province name=”黑龙江” cities=”全选 大庆 大兴安岭 哈尔滨 鹤岗 黑河 鸡西 佳木斯 牡丹江 七台河 齐齐哈尔 双鸭山 绥化 伊春”/>

<province name=”湖北” cities=”全选 鄂州 恩施土家族苗族自治州 黄冈 黄石 荆门 荆州 潜江 神农架林区 十堰 随州 天门 武汉 仙桃 咸宁 襄樊 孝感 宜昌”/>

<province name=”湖南” cities=”全选 常德 长沙 郴州 衡阳 怀化 娄底 邵阳 湘潭 湘西土家族苗族自治州 益阳 永州 岳阳 张家界 株洲”/>

<province name=”吉林” cities=”全选 白城 白山 长春 吉林 辽源 四平 松原 通化 延边朝鲜族自治州”/>

<province name=”江苏” cities=”全选 常州 淮安 连云港 南京 南通 苏州 宿迁 泰州 无锡 徐州 盐城 扬州 镇江”/>

<province name=”江西” cities=”全选 抚州 赣州 吉安 景德镇 九江 南昌 萍乡 上饶 新余 宜春 鹰潭”/>

<province name=”辽宁” cities=”全选 鞍山 本溪 朝阳 大连 丹东 抚顺 阜新 葫芦岛 锦州 辽阳 盘锦 沈阳 铁岭 营口”/>

<province name=”内蒙古” cities=”全选 阿拉善盟 巴彦淖尔盟 包头 赤峰 鄂尔多斯 呼和浩特 呼伦贝尔 通辽 乌海 乌兰察布盟 锡林郭勒盟 兴安盟”/>

<province name=”宁夏” cities=”全选 固原 石嘴山 吴忠 银川”/>

<province name=”青海” cities=”全选 果洛藏族自治州 海北藏族自治州 海东 海南藏族自治州 海西蒙古族藏族自治州 黄南藏族自治州 西宁 玉树藏族自治州”/>

<province name=”山东” cities=”全选 滨州 德州 东营 菏泽 济南 济宁 莱芜 聊城 临沂 青岛 日照 泰安 威海 潍坊 烟台 枣庄 淄博”/>

<province name=”山西” cities=”全选 长治 大同 晋城 晋中 临汾 吕梁 朔州 太原 忻州 阳泉 运城”/>

<province name=”陕西” cities=”全选 安康 宝鸡 汉中 商洛 铜川 渭南 西安 咸阳 延安 榆林”/>

<province name=”上海” cities=”全选 上海”/>

<province name=”四川” cities=”全选 阿坝藏族羌族自治州 巴中 成都 达州 德阳 甘孜藏族自治州 广安 广元 乐山 凉山彝族自治州 眉山 绵阳 南充 内江 攀枝花 遂宁 雅安 宜宾 资阳 自贡 泸州”/>

<province name=”天津” cities=”全选 天津”/>

<province name=”西藏” cities=”全选 阿里 昌都 拉萨 林芝 那曲 日喀则 山南”/>

<province name=”新疆” cities=”全选 阿克苏 阿拉尔 巴音郭楞蒙古自治州 博尔塔拉蒙古自治州 昌吉回族自治州 哈密 和田 喀什 克拉玛依 克孜勒苏柯尔克孜自治州 石河子 图木舒克 吐鲁番 乌鲁木齐 五家渠 伊犁哈萨克自治州”/>

<province name=”云南” cities=”全选 保山 楚雄彝族自治州 大理白族自治州 德宏傣族景颇族自治州 迪庆藏族自治州 红河哈尼族彝族自治州 昆明 丽江 临沧 怒江傈傈族自治州 曲靖 思茅 文山壮族苗族自治州 西双版纳傣族自治州 玉溪 昭通”/>

<province name=”浙江” cities=”全选 杭州 湖州 嘉兴 金华 丽水 宁波 绍兴 台州 温州 舟山 衢州”/>

<province name=”重庆” cities=”全选 重庆”/>
</china>

HTML, Javascript , , ,

纯JS省市联动

2008年5月23日

<script language=”JavaScript”>
<!–
var g_selProvince;
var g_selCity;
var Provinces=new Array(
new Array(“110000″,”北京市”),
new Array(“120000″,”天津市”),
new Array(“130000″,”河北省”),
new Array(“140000″,”山西省”),
new Array(“150000″,”内蒙古自治区”),
new Array(“210000″,”辽宁省”),
new Array(“220000″,”吉林省”),
new Array(“230000″,”黑龙江省”),
new Array(“310000″,”上海市”),
new Array(“320000″,”江苏省”),
new Array(“330000″,”浙江省”),
new Array(“340000″,”安徽省”),
new Array(“350000″,”福建省”),
new Array(“360000″,”江西省”),
new Array(“370000″,”山东省”),
new Array(“410000″,”河南省”),
new Array(“420000″,”湖北省”),
new Array(“430000″,”湖南省”),
new Array(“440000″,”广东省”),
new Array(“450000″,”广西壮族自治区”),
new Array(“460000″,”海南省”),
new Array(“500000″,”重庆市”),
new Array(“510000″,”四川省”),
new Array(“520000″,”贵州省”),
new Array(“530000″,”云南省”),
new Array(“540000″,”西藏自治区”),
new Array(“610000″,”陕西省”),
new Array(“620000″,”甘肃省”),
new Array(“630000″,”青海省”),
new Array(“640000″,”宁夏回族自治区”),
new Array(“650000″,”新疆维吾尔自治区”),
new Array(“710000″,”台湾省”),
new Array(“810000″,”香港特别行政区”),
new Array(“820000″,”澳门特别行政区”)
);

var Citys=new Array(
new Array(“110100″,”北京”),
new Array(“120100″,”天津”),
new Array(“130101″,”石家庄”),
new Array(“130201″,”唐山”),
new Array(“130301″,”秦皇岛”),
new Array(“130701″,”张家口”),
new Array(“130801″,”承德”),
new Array(“131001″,”廊坊”),
new Array(“130401″,”邯郸”),
new Array(“130501″,”邢台”),
new Array(“130601″,”保定”),
new Array(“130901″,”沧州”),
new Array(“133001″,”衡水”),
new Array(“140101″,”太原”),
new Array(“140201″,”大同”),
new Array(“140301″,”阳泉”),
new Array(“140501″,”晋城”),
new Array(“140601″,”朔州”),
new Array(“142201″,”忻州”),
new Array(“142331″,”离石”),
new Array(“142401″,”榆次”),
new Array(“142601″,”临汾”),
new Array(“142701″,”运城”),
new Array(“140401″,”长治”),
new Array(“150101″,”呼和浩特”),
new Array(“150201″,”包头”),
new Array(“150301″,”乌海”),
new Array(“152601″,”集宁”),
new Array(“152701″,”东胜”),
new Array(“152801″,”临河”),
new Array(“152921″,”阿拉善左旗”),
new Array(“150401″,”赤峰”),
new Array(“152301″,”通辽”),
new Array(“152502″,”锡林浩特”),
new Array(“152101″,”海拉尔”),
new Array(“152201″,”乌兰浩特”),
new Array(“210101″,”沈阳”),
new Array(“210201″,”大连”),
new Array(“210301″,”鞍山”),
new Array(“210401″,”抚顺”),
new Array(“210501″,”本溪”),
new Array(“210701″,”锦州”),
new Array(“210801″,”营口”),
new Array(“210901″,”阜新”),
new Array(“211101″,”盘锦”),
new Array(“211201″,”铁岭”),
new Array(“211301″,”朝阳”),
new Array(“211401″,”锦西”),
new Array(“210601″,”丹东”),
new Array(“220101″,”长春”),
new Array(“220201″,”吉林”),
new Array(“220301″,”四平”),
new Array(“220401″,”辽源”),
new Array(“220601″,”浑江”),
new Array(“222301″,”白城”),
new Array(“222401″,”延吉”),
new Array(“220501″,”通化”),
new Array(“230101″,”哈尔滨”),
new Array(“230301″,”鸡西”),
new Array(“230401″,”鹤岗”),
new Array(“230501″,”双鸭山”),
new Array(“230701″,”伊春”),
new Array(“230801″,”佳木斯”),
new Array(“230901″,”七台河”),
new Array(“231001″,”牡丹江”),
new Array(“232301″,”绥化”),
new Array(“230201″,”齐齐哈尔”),
new Array(“230601″,”大庆”),
new Array(“232601″,”黑河”),
new Array(“232700″,”加格达奇”),
new Array(“310100″,”上海”),
new Array(“320101″,”南京”),
new Array(“320201″,”无锡”),
new Array(“320301″,”徐州”),
new Array(“320401″,”常州”),
new Array(“320501″,”苏州”),
new Array(“320600″,”南通”),
new Array(“320701″,”连云港”),
new Array(“320801″,”淮阴”),
new Array(“320901″,”盐城”),
new Array(“321001″,”扬州”),
new Array(“321101″,”镇江”),
new Array(“330101″,”杭州”),
new Array(“330201″,”宁波”),
new Array(“330301″,”温州”),
new Array(“330401″,”嘉兴”),
new Array(“330501″,”湖州”),
new Array(“330601″,”绍兴”),
new Array(“330701″,”金华”),
new Array(“330801″,”衢州”),
new Array(“330901″,”舟山”),
new Array(“332501″,”丽水”),
new Array(“332602″,”临海”),
new Array(“340101″,”合肥”),
new Array(“340201″,”芜湖”),
new Array(“340301″,”蚌埠”),
new Array(“340401″,”淮南”),
new Array(“340501″,”马鞍山”),
new Array(“340601″,”淮北”),
new Array(“340701″,”铜陵”),
new Array(“340801″,”安庆”),
new Array(“341001″,”黄山”),
new Array(“342101″,”阜阳”),
new Array(“342201″,”宿州”),
new Array(“342301″,”滁州”),
new Array(“342401″,”六安”),
new Array(“342501″,”宣州”),
new Array(“342601″,”巢湖”),
new Array(“342901″,”贵池”),
new Array(“350101″,”福州”),
new Array(“350201″,”厦门”),
new Array(“350301″,”莆田”),
new Array(“350401″,”三明”),
new Array(“350501″,”泉州”),
new Array(“350601″,”漳州”),
new Array(“352101″,”南平”),
new Array(“352201″,”宁德”),
new Array(“352601″,”龙岩”),
new Array(“360101″,”南昌”),
new Array(“360201″,”景德镇”),
new Array(“362101″,”赣州”),
new Array(“360301″,”萍乡”),
new Array(“360401″,”九江”),
new Array(“360501″,”新余”),
new Array(“360601″,”鹰潭”),
new Array(“362201″,”宜春”),
new Array(“362301″,”上饶”),
new Array(“362401″,”吉安”),
new Array(“362502″,”临川”),
new Array(“370101″,”济南”),
new Array(“370201″,”青岛”),
new Array(“370301″,”淄博”),
new Array(“370401″,”枣庄”),
new Array(“370501″,”东营”),
new Array(“370601″,”烟台”),
new Array(“370701″,”潍坊”),
new Array(“370801″,”济宁”),
new Array(“370901″,”泰安”),
new Array(“371001″,”威海”),
new Array(“371100″,”日照”),
new Array(“372301″,”滨州”),
new Array(“372401″,”德州”),
new Array(“372501″,”聊城”),
new Array(“372801″,”临沂”),
new Array(“372901″,”菏泽”),
new Array(“410101″,”郑州”),
new Array(“410201″,”开封”),
new Array(“410301″,”洛阳”),
new Array(“410401″,”平顶山”),
new Array(“410501″,”安阳”),
new Array(“410601″,”鹤壁”),
new Array(“410701″,”新乡”),
new Array(“410801″,”焦作”),
new Array(“410901″,”濮阳”),
new Array(“411001″,”许昌”),
new Array(“411101″,”漯河”),
new Array(“411201″,”三门峡”),
new Array(“412301″,”商丘”),
new Array(“412701″,”周口”),
new Array(“412801″,”驻马店”),
new Array(“412901″,”南阳”),
new Array(“413001″,”信阳”),
new Array(“420101″,”武汉”),
new Array(“420201″,”黄石”),
new Array(“420301″,”十堰”),
new Array(“420400″,”沙市”),
new Array(“420501″,”宜昌”),
new Array(“420601″,”襄樊”),
new Array(“420701″,”鄂州”),
new Array(“420801″,”荆门”),
new Array(“422103″,”黄州”),
new Array(“422201″,”孝感”),
new Array(“422301″,”咸宁”),
new Array(“422421″,”江陵”),
new Array(“422801″,”恩施”),
new Array(“430101″,”长沙”),
new Array(“430401″,”衡阳”),
new Array(“430501″,”邵阳”),
new Array(“432801″,”郴州”),
new Array(“432901″,”永州”),
new Array(“430801″,”大庸”),
new Array(“433001″,”怀化”),
new Array(“433101″,”吉首”),
new Array(“430201″,”株洲”),
new Array(“430301″,”湘潭”),
new Array(“430601″,”岳阳”),
new Array(“430701″,”常德”),
new Array(“432301″,”益阳”),
new Array(“432501″,”娄底”),
new Array(“440101″,”广州”),
new Array(“440301″,”深圳”),
new Array(“441501″,”汕尾”),
new Array(“441301″,”惠州”),
new Array(“441601″,”河源”),
new Array(“440601″,”佛山”),
new Array(“441801″,”清远”),
new Array(“441901″,”东莞”),
new Array(“440401″,”珠海”),
new Array(“440701″,”江门”),
new Array(“441201″,”肇庆”),
new Array(“442001″,”中山”),
new Array(“440801″,”湛江”),
new Array(“440901″,”茂名”),
new Array(“440201″,”韶关”),
new Array(“440501″,”汕头”),
new Array(“441401″,”梅州”),
new Array(“441701″,”阳江”),
new Array(“450101″,”南宁”),
new Array(“450401″,”梧州”),
new Array(“452501″,”玉林”),
new Array(“450301″,”桂林”),
new Array(“452601″,”百色”),
new Array(“452701″,”河池”),
new Array(“452802″,”钦州”),
new Array(“450201″,”柳州”),
new Array(“450501″,”北海”),
new Array(“460100″,”海口”),
new Array(“460200″,”三亚”),
new Array(“510101″,”成都”),
new Array(“513321″,”康定”),
new Array(“513101″,”雅安”),
new Array(“513229″,”马尔康”),
new Array(“510301″,”自贡”),
new Array(“500100″,”重庆”),
new Array(“512901″,”南充”),
new Array(“510501″,”泸州”),
new Array(“510601″,”德阳”),
new Array(“510701″,”绵阳”),
new Array(“510901″,”遂宁”),
new Array(“511001″,”内江”),
new Array(“511101″,”乐山”),
new Array(“512501″,”宜宾”),
new Array(“510801″,”广元”),
new Array(“513021″,”达县”),
new Array(“513401″,”西昌”),
new Array(“510401″,”攀枝花”),
new Array(“500239″,”黔江土家族苗族自治县”),
new Array(“520101″,”贵阳”),
new Array(“520200″,”六盘水”),
new Array(“522201″,”铜仁”),
new Array(“522501″,”安顺”),
new Array(“522601″,”凯里”),
new Array(“522701″,”都匀”),
new Array(“522301″,”兴义”),
new Array(“522421″,”毕节”),
new Array(“522101″,”遵义”),
new Array(“530101″,”昆明”),
new Array(“530201″,”东川”),
new Array(“532201″,”曲靖”),
new Array(“532301″,”楚雄”),
new Array(“532401″,”玉溪”),
new Array(“532501″,”个旧”),
new Array(“532621″,”文山”),
new Array(“532721″,”思茅”),
new Array(“532101″,”昭通”),
new Array(“532821″,”景洪”),
new Array(“532901″,”大理”),
new Array(“533001″,”保山”),
new Array(“533121″,”潞西”),
new Array(“533221″,”丽江纳西族自治县”),
new Array(“533321″,”泸水”),
new Array(“533421″,”中甸”),
new Array(“533521″,”临沧”),
new Array(“540101″,”拉萨”),
new Array(“542121″,”昌都”),
new Array(“542221″,”乃东”),
new Array(“542301″,”日喀则”),
new Array(“542421″,”那曲”),
new Array(“542523″,”噶尔”),
new Array(“542621″,”林芝”),
new Array(“610101″,”西安”),
new Array(“610201″,”铜川”),
new Array(“610301″,”宝鸡”),
new Array(“610401″,”咸阳”),
new Array(“612101″,”渭南”),
new Array(“612301″,”汉中”),
new Array(“612401″,”安康”),
new Array(“612501″,”商州”),
new Array(“612601″,”延安”),
new Array(“612701″,”榆林”),
new Array(“620101″,”兰州”),
new Array(“620401″,”白银”),
new Array(“620301″,”金昌”),
new Array(“620501″,”天水”),
new Array(“622201″,”张掖”),
new Array(“622301″,”武威”),
new Array(“622421″,”定西”),
new Array(“622624″,”成县”),
new Array(“622701″,”平凉”),
new Array(“622801″,”西峰”),
new Array(“622901″,”临夏”),
new Array(“623027″,”夏河”),
new Array(“620201″,”嘉峪关”),
new Array(“622102″,”酒泉”),
new Array(“630100″,”西宁”),
new Array(“632121″,”平安”),
new Array(“632221″,”门源回族自治县”),
new Array(“632321″,”同仁”),
new Array(“632521″,”共和”),
new Array(“632621″,”玛沁”),
new Array(“632721″,”玉树”),
new Array(“632802″,”德令哈”),
new Array(“640101″,”银川”),
new Array(“640201″,”石嘴山”),
new Array(“642101″,”吴忠”),
new Array(“642221″,”固原”),
new Array(“650101″,”乌鲁木齐”),
new Array(“650201″,”克拉玛依”),
new Array(“652101″,”吐鲁番”),
new Array(“652201″,”哈密”),
new Array(“652301″,”昌吉”),
new Array(“652701″,”博乐”),
new Array(“652801″,”库尔勒”),
new Array(“652901″,”阿克苏”),
new Array(“653001″,”阿图什”),
new Array(“653101″,”喀什”),
new Array(“654101″,”伊宁”),
new Array(“710001″,”台北”),
new Array(“710002″,”基隆”),
new Array(“710020″,”台南”),
new Array(“710019″,”高雄”),
new Array(“710008″,”台中”),
new Array(“211001″,”辽阳”),
new Array(“653201″,”和田”),
new Array(“542200″,”泽当镇”),
new Array(“542600″,”八一镇”),
new Array(“820000″,”澳门”),
new Array(“810000″,”香港”)
);

function FillProvinces(selProvince)
{
selProvince.options[0]=new Option(“请选择”,”000000″);
for(i=0;i<Provinces.length;i++)
{
selProvince.options[i+1]=new Option(Provinces[i][1],Provinces[i][0]);
}
selProvince.options[0].selected=true;
selProvince.length=i+1;
}

function FillCitys(selCity,ProvinceCode)
{
//if the province is a direct-managed city, like Beijing, shanghai, tianjin, chongqin,hongkong, macro
//need not “请选择选项”
if(ProvinceCode==”110000″||ProvinceCode==”120000″||ProvinceCode==”310000″
||ProvinceCode==”810000″||ProvinceCode==”820000″||ProvinceCode==”500000″)
count=0;
else
{selCity.options[0]=new Option(“请选择”,ProvinceCode);
count=1;}
for(i=0;i<Citys.length;i++)
{
if(Citys[i][0].toString().substring(0,2)==ProvinceCode.substring(0,2))
{
selCity.options[count]=new Option(Citys[i][1],Citys[i][0]);
count=count+1;
}
}
selCity.options[0].selected=true;
selCity.length=count;
}

function Province_onchange()
{
FillCitys(g_selCity,g_selProvince.value);
}

function InitCitySelect(selProvince,selCity)
{
//alert(“begin”);
g_selProvince=selProvince;
g_selCity=selCity;
selProvince.onchange=Function(“Province_onchange();”);
FillProvinces(selProvince);
Province_onchange();
}
function InitCitySelect2(selProvince,selCity,CityCode)
{
InitCitySelect(selProvince,selCity)
for(i=0;i<selProvince.length;i++)
{
if(selProvince.options[i].value.substring(0,2)==CityCode.substring(0,2))
{
selProvince.options[i].selected=true;
}
}
Province_onchange();
for(i=0;i<selCity.length;i++)
{
if(selCity.options[i].value==CityCode)
{
selCity.options[i].selected=true;
}
}
}
//–>
</script>
<form name=”profile” method=”post”>
<select id=”province” size=”1″ name=”province”>
<option selected></option>
</select>
<select id=”city” size=”1″ name=”city”>
<option selected></option>
</select>
<script language=”javascript”>
InitCitySelect(document.profile.province,document.profile.city);
</script>
<input type=”submit”>
</form>

HTML, Javascript , ,

开发端到端的 Ajax 应用程序<转>

2007年10月12日

第 1 部分: 用一个场景设置 Ajax 环境
http://www.ibm.com/developerworks/cn/web/wa-aj-end2end1/index.html

HTML, Javascript , ,