今天维护了下个自定义jquery组件 遇到一个问题 不知道怎么回事 问题如下:
demo 部分代码
自定义组件中 有这样 initValue : []的一个数组变量 有个方法 value(s) 用于赋值 //s也是数组类型 this.options.initValue是取当前组件的initValue属性(这样获得值 会和组件绑定)
方式一:jQuery.merge(this.options.initValue,s);
方式二:this.options.initValue=this.options.initValue.concat(s);
创建两个组件时 方式一创建的第一个组件的initValue会影响到方式一创建的第二个组件
方式二 则不会影响;
可能我的问题 问的有点问题,您没理解对。
我的意思是这两个方式都好使 只不过有这样一个问题 有个类有initValue属性 initValue=[]; 当传入s时 s=["11","12"] 用concat后 initValue=["11","12"],用Jquery。merge后initValue=["11","12"]
当创建第二个对象时 操作与第一个一样 initValue=[]; 当传入s时 s=["11","12"] 用concat后 initValue=["11","12"],用Jquery。merge后initValue=["11","12","11","12"] 这是我的问题原意??
concat :如果要进行 concat() 操作的参数是数组,那么添加的是数组中的元素,而不是数组。
this.options.initValue=this.options.initValue.concat(s);
楼主错应该是将一个数组传进去了、
jQuery.merge(first,second)
合并两个数组
返回的结果会修改第一个数组的内容——第一个数组的元素后面跟着第二个数组的元素。
这个接受的是两个数组、
可能我的问题 问的有点问题,您没理解对。
我的意思是这两个方式都好使 只不过有这样一个问题 有个类有initValue属性 initValue=[]; 当传入s时 s=["11","12"] 用concat后 initValue=["11","12"],用Jquery。merge后initValue=["11","12"]
当创建第二个对象时 操作与第一个一样 initValue=[]; 当传入s时 s=["11","12"] 用concat后 initValue=["11","12"],用Jquery。merge后initValue=["11","12","11","12"] 这是我的问题原意??
@cattsoft: 昂, 你的意思,第一个没问题。当创建第二个的时候出问题了?变成:initValue=["11","12","11","12"] 了?
你的数组是不是全局变量?能否贴上你的代码?
@Beyond-bit: 大体格式如下:
(function($,undefined){
$.widget("XXX.checkcombobox"{
options:{
XXXXXXX,
initValue : '', //初始值
XXXXXXX,
change:null //回调函数
},
_create:function(){
XXXXXXXX;
},
_destroy:function(){
XXXXXXX;
},
value:function(s){
var self=this;//this 是当前对象
self.options.initValue=self.options.initValue.concat(s);
}
});
})(jQuery);
我觉得应该和这个全局的没关系 因为两种方式都是把数组组合后赋值到initValue中 全局的话应该都有问题才是 。
找到问题的答案了 我的理解是 是merge的本身的机制 它会开辟一块小小内存 再次merge时 会在前一次的值上追加值赋给新的数组 这就是为什么 出现第二个对象多了值得原因
@cattsoft: 对对,就是,我刚刚特地测试了一下发现merge缺陷、按照这样的逻辑下去,merge过的数组都会存在内存之中,即使闭包了,还是不回收,好可怕、算是jquery的一个设计缺陷嘛?
@Beyond-bit: 我还是对merge有很大疑问 看了下Jquery源码 发现不可能是merge的问题 因为他的代码太简单了 只做个小小连接数组,我原来把initValue格式初始化initValue=[];因为需求要更改要求支持字符串,
我改成initValue=' '; 再次测试merge似乎那个倒霉的问题又没了 正在求证中。。。。。。
@cattsoft: 我改成initValue=' '; ?你改这个相当于把你的参数default 了,而merge 下次执行了,再次执行的时候还是会叠加,后来我想了想,是不是jquery本来定义merge的函数的时候就是叠加用的、而并不是像我们理想的下次叠加又会重新、
像你这种特殊的需求,应该自己定义一个javascript函数来实现,并非jquery内置函数就能解决你的问题、你说呢?
@Beyond-bit: 我改成initValue=' ';主要是initValue既支持字符串类型 也支持数组类型而已
原来initValue=[];只支持 数组类型 就改个[]变成 '' merge就好使了 很令人费解。
不管如何解决了就好 下次在遇到注意一下就好了 个人认为不是merge的问题 您可以看下jquery源码
@cattsoft: 刚刚,我通过new了两个对象来测试,发现依旧会叠加。两个对象,第一个没问题。当第二个对象传两个数组的时候,alert出来的值,竟然里面包含第一个对象的数组值、
@Beyond-bit: 代码能贴出来下不,我看看 是不是merge的问题。
@cattsoft:
<script> //第一次通过变量测试 $(document).ready(function(){ var a = ["a","b"]; var b = ["c","d"]; var d = ["d","e"]; var temp =test(a,b); alert(temp); alert(test(a,d)); }) function test(a,b){ return $.merge(a,b); } //第二次通过实例化对象测试 var testM ={ fu:function(a,b){ return $.merge(a,b); } } var a = ["a","b"]; var b = ["c","d"]; var d = ["d","e"]; //Obj1 var test1= new testM(); //alert(test1.fu(a,b)); alert("test1----------"+test1.fu(a,d)); //Obj2 var test2= new testM(); alert("test2----------"+test2.fu(a,d)); </script> jquery需要的库你引用一下、如假包换测试、
@Beyond-bit: 确实 用merge有问题 用concat没有问题
merge(a,b) 实际是把b挂到a之后 即a变成a=a+b b没变
a。concat(b) 创建一个新的数组c 存a+b c=a+b 这也是他们的区别
估计创建新对象时 没有还原数组a造成merge的问题 而concat的数组a没变 所以不存在这种问题
谢谢你这么认真地回答 真心想交个朋友 互相交流互相帮助 qq:1435648802
@cattsoft: 翻看jquery 源码我可以肯定告诉你、jQuery.merge每次调用的时候传入了一个jquery的原型对象、
// Build a new jQuery matched element set var ret = jQuery.merge( this.constructor(), elems ); return jQuery.merge( [], parsed.childNodes );
导致我们多次调用的时候结果叠加了、
@cattsoft:
// results is for internal usage only makeArray: function( arr, results ) { var ret = results || []; if ( arr != null ) { if ( isArraylike( Object(arr) ) ) { jQuery.merge( ret, typeof arr === "string" ? [ arr ] : arr ); } else { core_push.call( ret, arr ); } } return ret; },
这个函数每次取得ret里面的value。
@Beyond-bit:
merge: function( first, second ) {
var l = second.length,
i = first.length,
j = 0;
if ( typeof l === "number" ) {
for ( ; j < l; j++ ) {
first[ i++ ] = second[ j ];
}
} else {
while ( second[j] !== undefined ) {
first[ i++ ] = second[ j++ ];
}
}
first.length = i;
return first;
},
@Beyond-bit:
merge: function( first, second ) {
var l = second.length,
i = first.length,
j = 0;
if ( typeof l === "number" ) {
for ( ; j < l; j++ ) {
first[ i++ ] = second[ j ];
}
} else {
while ( second[j] !== undefined ) {
first[ i++ ] = second[ j++ ];
}
}
first.length = i;
return first;
}
上面那个 没有格式 改下格式发上来
@cattsoft: 建议你可以使用$.merge($.merge([], this.options.initValue), s);
这样就避免了那个问题。其实$.merge的设计就是那样的,这也就是作者为什么不用contact的原因。
找个jquery API吧 没有我可以给你