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;
}