首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > JavaScript >

JavaScript数组,加上AJAX之后,竟然变了,小弟我茫然了

2012-04-11 
JavaScript数组,加上AJAX之后,竟然变了,我茫然了一段简单的,JavaScript数组,记录一些东西,var arrError

JavaScript数组,加上AJAX之后,竟然变了,我茫然了
一段简单的,JavaScript数组,记录一些东西,
var arrError = [];
arrError["a"]=1;
arrError["x"]=0;
.......


之前没有用AJAX,用循环遍历之后用字符串传递给后台,读取
  for (var o in arrError) {
  str += o + "," + (arrError[o] ? 1 : 0) + "|";
  }
这样写,是没有问题的,
将得到"a,1|x,0|"这样的字符串,后台解析。


但是,当加入AJAX后

AjaxPro.Utility.RegisterTypeForAjax(typeof(Page1));
这种ajax的代码我用了好久了,调用方法是没有错的。

但JavaScript端的,遍历数组,就出问题了。

  for (var o in arrError) {
  str += o + "," + (arrError[o] ? 1 : 0) + "|";
  }
这段代码得出的结果是
clear,1|addRange,1|然后才我原来想要的数组里的内容,调试的时候我设断点看,之前的数组没有那两个方法,现在调试,就有这两个方法了,怎么办?

[解决办法]
http://www.pccode.net/info/2011/08/03/20110803-7165.html
AjaxPro客户端框架总结
由于微软构建asp.net 2.0时对ajax技术的不重视,在04、05年ajax风起云涌之时,在asp.net出现了AjaxPro这个Ajax框架,虽然随着asp.net ajax的发布,AjaxPro被强大的asp.net ajax的光芒覆盖,但AjaxPro的简单易用性方面还是非常不错的。

AjaxPro在客户端会输出三个Core.ashx、Converter.ashx和Prototype.ashx三个文件,其实就是javasript文件。其中Prototype.js对Object建立了extend,然后在extend上增加了Apply和Bin方法,之后的Ajax调用的核心文件Core.ashx就是基于extend上进行的。Prototype.js里对Array,String进行扩展并增加了2个事件方面的方法addEvent与removeEvent方法。

Array对象扩展:

view sourceprint?01 push: function(o) { 

02 this[this.length] = o; 

03 }, 

04 addRange: function(items) { 

05 if(items.length > 0) { 

06 for(var i=0; i<items.length; i++) { 

07 this.push(items); 

08 } 

09 } 

10 }, 

11 clear: function() { 

12 this.length = 0; 

13 return this; 

14 }, 

15 shift: function() { 

16 if(this.length == 0) { return null; } 

17 var o = this[0]; 

18 for(var i=0; i<this.length-1; i++) { 

19 this = this[i + 1]; 

20 } 

21 this.length--; 

22 return o; 

23 }

String对象的扩展:

view sourceprint?01 trimLeft: function() { 

02 return this.replace(/^\s*/,""); 

03 }, 

04 trimRight: function() { 

05 return this.replace(/\s*$/,""); 

06 }, 

07 trim: function() { 

08 return this.trimRight().trimLeft(); 

09 }, 

10 endsWith: function(s) { 

11 if(this.length == 0 || this.length < s.length) { return false; } 

12 return (this.substr(this.length - s.length) == s); 

13 }, 

14 startsWith: function(s) { 

15 if(this.length == 0 || this.length < s.length) { return false; } 

16 return (this.substr(0, s.length) == s); 

17 }, 

18 split: function(c) { 

19 var a = []; 

20 if(this.length == 0) return a; 

21 var p = 0; 

22 for(var i=0; i<this.length; i++) { 

23 if(this.charAt(i) == c) { 

24 a.push(this.substring(p, i)); 

25 p = ++i; 

26 } 

27 } 

28 a.push(s.substr(p)); 

29 return a; 

30 }

String对象还增加了2个静态方法:

view sourceprint?01 format: function(s) { 

02 for(var i=1; i<arguments.length; i++) { 

03 s = s.replace("{" + (i -1) + "}", arguments); 



04 } 

05 return s; 

06 }, 

07 isNullOrEmpty: function(s) { 

08 if(s == null || s.length == 0) { 

09 return true; 

10 } 

11 return false; 

12 }

可以看到扩展的方法都是C#风格的,使得在javasript中能如C#中一样进行字符串与数组操作。 更重要的是Converter.js中增加了DataTable、DataSet、Dictionary和NameValueCollection,使得我们可以在客户端组装以上对象并在需要的时候发往服务端。可以想象在服务端的ajax方法接受一个DataTable类型的参数,那是如何的愉快。

一、DataTable

客户端代码:

view sourceprint?01 function SendDataTable() { 

02 var dataTable = new Ajax.Web.DataTable(); 

03 dataTable.addColumn("id", "System.Int32"); 

04 dataTable.addColumn("name", "System.String"); 

05 var row = new Object(); 

06 row.id = "001"; 

07 row.name = "xiaopang"; 

08 dataTable.addRow(row); 

09 var ret = ZyYz_Default.HanderDataTable(dataTable); 

10 alert(ret.value); 

11 }

服务端代码:

view sourceprint?1 [AjaxPro.AjaxMethod] 

2 public int HanderDataTable(DataTable dataTable) 

3 { 

4 foreach (DataRow dataRow in dataTable.Rows) 

5 { 

6 //do somethig... 

7 } 

8 return 1; 

9 }

二、DataSet(基本同DataTable,只是类型为Ajax.Web.DataSet)

三、Dictionary:

客户端代码:

view sourceprint?1 function SendDictionary() { 

2 var dictionary = new Ajax.Web.Dictionary("Dictionary<STRING string="">", [["004", "xiaopang"], ["005", "xiaopang005"]]); 

3 dictionary.add("006", "xiaopang006"); 

4 alert("是否存在005元素:" + dictionary.containsKey("005") + "值为:" + dictionary.getValue("005")); 

5 var ret = ZyYz_Default.HandDictionary(dictionary).value; 

6 alert("Dictionary元素数目:" + ret); 

7 }</STRING>

服务端代码:

view sourceprint?1 [AjaxPro.AjaxMethod] 

2 public int HandDictionary(Dictionary<string, string> dictionary) 

3 { 

4 return dictionary.Count; 

5 }

四、关于直接传递Class

服务端代码:

view sourceprint?01 public class TestClass 

02 { 

03 public int Id{ get; set; } 

04 public string Name { get; set; } 

05 } 

06 

07 [AjaxPro.AjaxMethod] 

08 public TestClass GetTestClass() 

09 { 

10 return new TestClass{ Id =002,Name="oldXiaoPang"}; 

11 } 

12 

13 [AjaxPro.AjaxMethod] 

14 public TestClass PutTestClass(TestClass testClass) 

15 { 

16 testClass.Id = 003; 

17 return testClass; 

18 }

客户端代码:

view sourceprint?1 function GetTestClass() { 

2 var testClass = ZyYz_Default.GetTestClass().value; 

3 testClass.Name = "newName"; 

4 var newTestClass = ZyYz_Default.PutTestClass(testClass).value; 

5 alert("原Id为:" + testClass.Id + " 现Id为:" + newTestClass.Id); 

6 alert(" 现Name为:" + newTestClass.Name); 

7 }
[解决办法]
AjaxPro 扩展了 array

加了 clear,addRange 2个函数

可以 判断一下,是否function,来解决

也可以用json ,不用数组


{a:1,x:0}
[解决办法]
function isFunction(obj) {
return (typeof obj == 'function') && obj.constructor == Function;
}

探讨

引用:

AjaxPro 扩展了 array

加了 clear,addRange 2个函数

可以 判断一下,是否function,来解决

也可以用json ,不用数组
{a:1,x:0}

怎么判断是否是function呢?

热点排行