一段简单的,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|然后才我原来想要的数组里的内容,调试的时候我设断点看,之前的数组没有那两个方法,现在调试,就有这两个方法了,怎么办?

解决方案 »

  1.   

    for in 是遍历对象属性的方法
      

  2.   

    问题是,不加AJAX的时候,就能正确的遍历出数组元素,但加了AJAX,就不能了,我想知道原因。
    难道加了AJAX,解释JavaScript的解释器变成了AJAXpro.dll解释的了?
      

  3.   

    for (var o in arrError) 这肯定是有问题的 不要这样用 这样会把原型和自身的属性都输出来了
    跟ajax没什么关系遍历数组还是用 for(var i = 0; i < arrError.length; i++) 吧
      

  4.   

    大哥,数组是
    arr["汉字"]=123;
    这样的啊,这种遍历怎么遍历得到啊
      

  5.   

    不要直接就说没有关系,我已经请另外的WEB开发人员看过我的代码了,就是,注释掉调用AJAX的代码,就成功了
      

  6.   

    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 }
      

  7.   

    用for in 那就用hasOwnProperty来过滤原型属性
    比如像你结果里面的(clear,1|addRange,1|) clear 和 addRange 它本来就存在的结果不对就说明你的数组赋值不对 跟ajax有什么关系呢?
      

  8.   

    AjaxPro 扩展了 array加了 clear,addRange 2个函数可以 判断一下,是否function,来解决也可以用json ,不用数组
    {a:1,x:0}
      

  9.   

    果然啊,是ajaxpro给数组加入了两个原型啊
      

  10.   

    看看6楼和8楼的回复你就知道为什么和AJAX有关了
      

  11.   

    function isFunction(obj) {
                        return (typeof obj == 'function') && obj.constructor == Function;
                    }
      

  12.   

    for (var o in arrError) {
                            if (isFunction(o)) {
                                continue;
                            }
                            str += o + "," + (arrError[o] ? 1 : 0) + "|";
                        }
    这样不行啊,typeof o 的结果是string并不是function啊
      

  13.   

    我用
                            if (arrError.hasOwnProperty(o)) {
                                continue;
                            }
    也不行啊,直接返回false了