Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何使jQuery插件同时在多个元素上工作?_Javascript_Jquery_Jquery Plugins - Fatal编程技术网

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'),插件会坏的。你,我的朋友,是个容易上当受骗的人!非常感谢你!我现在觉得自己非常愚蠢!我知道问题是什么,但从来没有想到解决办法会这么简单!再次感谢!