2012-11-30 52 views
6

我制作了一个combobox插件。要使用它,你只需要调用如何让jQuery插件同时在多个元素上工作?

$(elem).combobox(compensateElement); 

编辑: 问题是,如果你做

$('#1').combobox('form'); 
$('#2').combobox('form'); 

的插件将破除......

的ELEM是选择要变成一个组合框,而且这个补偿元素是一个元素,在这个元素之后,插件可以插入一个div,这个长度就是suggestionsDiv-20px的高度。 (我的页面上有一个页脚,它没有被绝对位置的元素压下......)

现在,问题是这个插件只能用于一个元素!它如何改变,以便它可以一次处理多个元素?这是超过一百行的JS代码,所以我不希望“转换”的代码!

我想过把所有元素特定的变量放入this.data“对象”中,但它根本不像一个好的解决方案。运行一些RegEx后发现&替换它并配置它几个小时,我没有得到它的所有工作...

我可以使用什么技术?

非常感谢您的时间!

+0

没有看完整个问题,但怎么样? '$('#state,#another-id,.a-class')。combobox('form');'(不知道最后的'form'是否可以。知道这个“form”是如何定位的)。 – Joonas

+0

“与多种元素合作”是什么意思?你想要例如做'$('select')。combobox()'并将它应用于所有这些? –

+0

我的意思是能够将多个选择转换为组合框。 –

回答

10

的问题是,你有一个literal object,将有他的内容替换每次调用m.init()时间。

我建议你看看this post,它解释了编写JQuery插件的好方法。如果你看到“轻型开始”,例如:

$.fn[pluginName] = function (options) { 
     return this.each(function() { 
      if (!$.data(this, 'plugin_' + pluginName)) { 
       $.data(this, 'plugin_' + pluginName, 
       new Plugin(this, options)); 
      } 
     }); 
    } 

这将创建每个元素的插件对象的新实例,所以你可以始终保持状态。

+0

你,我的朋友,是一个轻信的人!非常感谢你!我现在感觉非常愚蠢!我知道问题是什么,但从来没有解决方案可以这么简单!再次感谢! –

0

你可以用jQuery的每个函数在每个元素上调用你的插件方法。请记住,在您的方法中,关键字this将指向当前元素而不是jQuery对象。

$.fn.combobox = function(form) { 
     var $this = this; 

     return $this.each(function() { 
      if (!m.initialized) { 
       m.init.apply(this, [form]); 
       $this.data('initialized', true); 
      } else { 
       m.updateList.apply(this); 
      } 
     }); 
    }; 
+0

嗯,这段代码可以做'$('选'')。combobox('form');'对吗? –

+0

是啊...它会迭代每个节点并调用插件方法:) – Ehtesham

+0

是的,但不幸的是,这不是我的问题。也许我会更新这个问题。这是,如果你做'$('#1')。combobox('form'); $('#2')。combobox('form');',插件将会中断。 –

相关问题