Javascript 如何使jQuery插件同时在多个元素上工作?
我制作了一个组合框插件。要使用它,你只需要打电话Javascript 如何使jQuery插件同时在多个元素上工作?,javascript,jquery,jquery-plugins,Javascript,Jquery,Jquery Plugins,我制作了一个组合框插件。要使用它,你只需要打电话 $(elem).combobox(compensateElement); 编辑: 问题是如果你这样做了 $('#1').combobox('form'); $('#2').combobox('form'); 插件将中断 元素是要转换为组合框的select,compensateElement是一个元素,在该元素之后插件可以插入一个div,其长度为suggestionsDiv-20px high。(我的页面上有一个页脚,它不会被绝对位置的元素压下
$(elem).combobox(compensateElement);
编辑:
问题是如果你这样做了
$('#1').combobox('form');
$('#2').combobox('form');
插件将中断
元素是要转换为组合框的select,compensateElement是一个元素,在该元素之后插件可以插入一个div,其长度为suggestionsDiv-20px high。(我的页面上有一个页脚,它不会被绝对位置的元素压下…)
现在,问题是这个插件只能在一个元素上使用!如何更改它,使其能够同时在多个元素上工作?它有超过一百行的JS代码,所以我不期望“转换”的代码
我曾想过将所有特定于元素的变量放入this.data“object”中,但它根本不是一个好的解决方案。在它上运行了一些RegEx find&replace并配置了几个小时之后,我根本没有让它工作
我可以使用什么技巧
非常感谢您抽出时间 您可以使用jQuery的each函数对每个元素调用插件方法。记住,在方法中,关键字
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);
}
});
};
问题是您有一个,每次调用
m.init()
时,他的内容都会被替换
我建议您看看,这就解释了编写JQuery插件的好方法。如果您看到“轻量级启动”,例如:
$.fn[pluginName] = function ( options ) {
return this.each(function () {
if (!$.data(this, 'plugin_' + pluginName)) {
$.data(this, 'plugin_' + pluginName,
new Plugin( this, options ));
}
});
}
这将为每个元素创建一个插件对象的新实例,这样您就可以一致地维护状态。没有完全阅读整个问题,但是如何<代码>$('#state,#另一个id,.a-class')。组合框('form')代码>(不确定最后的
'form'
是否正确。我不知道'form'
是如何定位的)。你说的“使用多个元素”是什么意思?例如,您希望执行$('select').combobox()
并将其应用于所有元素?我的意思是能够将多个选择转换为组合框。@Jonas是的,这很好,但问题是,如果您尝试将此插件应用于多个元素,它将不再工作。@SérgioMichels是的,某种程度上。那太好了!但是,如果它应用于多个元素,插件将不再工作。只需使用我提供的代码就可以了。嗯,这段代码可以执行$('select')。combobox('form')代码>对吗?是的。。。它将在每个节点上迭代并调用插件方法:)是的,但不幸的是这不是我的问题。也许我会更新这个问题。如果您执行$('#1')。组合框('form')$('#2')。组合框('form')代码>,插件会坏的。你,我的朋友,是个容易上当受骗的人!非常感谢你!我现在觉得自己非常愚蠢!我知道问题是什么,但从来没有想到解决办法会这么简单!再次感谢!