Ajax一个变量冲突的问题
2011-08-09 00:00
399 查看
刚开始写AJAX代码的时候,直接参照的是AJAX基础教程一书中的代码(该书真的很不错,是AJAX入门的经典教材,是图灵出版社的。计算机方面的书籍,我最信任的就是O'R和图灵的)。
该书的创建XMLHttpRequest对象的代码如下:
在一般情况下,该代码的使用不会带来任何问题。
如:
在页面的不同地方调用test1,test2函数都能正常工作。即不同时刻调用的话,就不会产生问题。
但是假如你需要在同一时刻同时调用这两个函数,则会发现只有其中一个可以正常运行。
比如,我在加载页面的时候运行如下函数:
此时,则test1,test2只有一个函数会正常执行。
分析下原因,是由于javascript的语言特性导致。一般情况下,Javascript的变量,函数等等,都是公用的,其他对象都能访问(可读可写)。这就是问题的所在。在同一时刻,调用test1和test2就会出现“变量xmlHttp”的冲突。
解决方法:
最简单的方法,不要在同一时刻调用,如init函数可以改为:
但该方法属于投机,并未真正解决问题。
我们还可以修改“XMLHttpRequest创建函数”,改为一实例化函数。
实例化时相应的改为:
这样子处理的话,即使在同一时刻调用test1,test2函数,也不会产生问题了,实现了真正的“同步”。
通过该方法,可以引申出javascript中对象的“私有属性”的创建方法:
私有属性可以在构造函数中使用 var 关键字定义。
私有属性只能由特权函数公用访问。(特权函数就是在构造函数中使用this关键字定义的函数)。外部客户可以访问特权函数,而且特权函数可以访问对象的私有属性。
比如下面这个Vehicle类,则wheelCount和curbWeightInPounds就是私有属性,只能通过特权函数访问/ 设置了:
该书的创建XMLHttpRequest对象的代码如下:
var xmlHttp; function createXMLHttpRequest() { if (window.ActiveXObject) { xmlHttp = new ActiveXObject("Microsoft.XMLHTTP"); } else if (window.XMLHttpRequest) { xmlHttp = new XMLHttpRequest(); } }
在一般情况下,该代码的使用不会带来任何问题。
如:
function test1() { createXMLHttpRequest(); xmlHttp.onreadystatechange = handleStateChange1; url = "test.php?ts=" + new Date().getTime(); xmlHttp.open("GET", url, true); xmlHttp.send(null); } function test2() { createXMLHttpRequest(); xmlHttp.onreadystatechange = handleStateChange2; url = "test.php?ts=" + new Date().getTime(); xmlHttp.open("GET", url, true); xmlHttp.send(null); } function handleStateChange1() { ...... } function handleStateChange2() { ...... } ..........
在页面的不同地方调用test1,test2函数都能正常工作。即不同时刻调用的话,就不会产生问题。
但是假如你需要在同一时刻同时调用这两个函数,则会发现只有其中一个可以正常运行。
比如,我在加载页面的时候运行如下函数:
function init() { test1(); test2(); }
此时,则test1,test2只有一个函数会正常执行。
分析下原因,是由于javascript的语言特性导致。一般情况下,Javascript的变量,函数等等,都是公用的,其他对象都能访问(可读可写)。这就是问题的所在。在同一时刻,调用test1和test2就会出现“变量xmlHttp”的冲突。
解决方法:
最简单的方法,不要在同一时刻调用,如init函数可以改为:
function init() { test1(); setTimeout("test2()",500); }
但该方法属于投机,并未真正解决问题。
我们还可以修改“XMLHttpRequest创建函数”,改为一实例化函数。
function createXMLHttpRequest() { if (window.ActiveXObject) { var xmlHttpObj = new ActiveXObject("Microsoft.XMLHTTP"); } else if (window.XMLHttpRequest) { var xmlHttpObj = new XMLHttpRequest(); } return xmlHttpObj; }
实例化时相应的改为:
function test1() { xmlHttp_1 = createXMLHttpRequest(); xmlHttp_1.onreadystatechange = handleStateChange1; url_1 = "test.php?ts=" + new Date().getTime(); xmlHttp_1.open("GET", url, true); xmlHttp_1.send(null); } function test2() { xmlHttp_2 = createXMLHttpRequest(); xmlHttp_2.onreadystatechange = handleStateChange1; url_2 = "test.php?ts=" + new Date().getTime(); xmlHttp_2.open("GET", url, true); xmlHttp_2.send(null); }
这样子处理的话,即使在同一时刻调用test1,test2函数,也不会产生问题了,实现了真正的“同步”。
通过该方法,可以引申出javascript中对象的“私有属性”的创建方法:
私有属性可以在构造函数中使用 var 关键字定义。
私有属性只能由特权函数公用访问。(特权函数就是在构造函数中使用this关键字定义的函数)。外部客户可以访问特权函数,而且特权函数可以访问对象的私有属性。
比如下面这个Vehicle类,则wheelCount和curbWeightInPounds就是私有属性,只能通过特权函数访问/ 设置了:
function Vehicle() { var wheelCount = 4; var curbWeightInPounds = 4000; this.getWheelCount = function() { return wheelCount; } this.setWheelCount = function(count) { wheelCount = count; } this.getCurbWeightInPounds = function() { return curbWeightInPounds; } this.setCurbWeightInPounds = function(weight) { curbWeightInPounds = weight; } }
相关文章推荐
- Ajax一个变量冲突的问题
- ajax的重复提交问题,和bootstrapValidator校验冲突问题解决办法
- Ajax修改全局变量问题解决方法(Zepto版)
- Delphi中创建类的实例与定义一个变量引出的问题
- 注意访问器中的一个小细节,关于有访问器没有成员变量的问题
- 一个例子玩转linux多线程问题(创建 执行 条件变量 ......)
- 变量初始化问题--一个年轻工程师的见解
- C++ 的一个问题的理解(私有变量成员)
- Ajax的异步通信引发的一个随机性问题<2> 异步请求的问题来了
- 一个AJAX调用方面的问题
- 一个js函数中的变量赋值问题
- ajax给全局变量赋值问题
- 解决VC6和VC2008的for循环变量作用域不同问题的一个方法
- ajax给全局变量赋值问题解决
- 解决:eclipse中双击一个变量,文件中所有这个变量都会变成黄色,现在变不了了的问题。
- 一个问题提交的实例(js原生动画,原生ajax,js引用加参数)
- 关于AJAX.net的一个问题:回发或回调参数无效!
- 初始化python类的实例时,私有变量的值与上一个实例的相同,问题定位
- 遇到的问题-----------定义一个全局变量,在page_load里赋值,但在其他按钮中调用仍为空
- 解决一个js冲突问题