0

我有一个问题,有人可能会觉得这比我简单得多,但是唉,我对自定义 jQuery 插件没有太多经验。

我工作地点的前任开发人员给我留下了许多似乎不太好用的剩余插件,其中大部分我已经能够修复,但这一直困扰着我一段时间。

它是一个用jQuery编写的自定义Multiple Suggestion 插件(称为 multisuggest),它有一组内部使用的函数(*例如 setValue 设置框的值,或查找更新搜索 *

似乎他试图从外部脚本调用这些插件函数(这个外部脚本专门通过用户输入将新创建的建议导入到 multisuggest 中并设置值),如下所示:

this.$input.multisuggest('setValue', data.address.id, address);

这似乎调用了函数,除了第二个和第三个参数似乎没有传递给函数(setValue 什么都没有收到),而且我不明白如何让它传递这些。当我在控制台中登录时,它说它是未定义的。这些函数是这样设置的(我只包括我正在使用的函数和一个来自 multisuggest 的名为 select 的内部函数,它实际上可以工作):

    MultiSuggest.prototype = $.extend(MultiSuggest, _superproto, {

    constructor : MultiSuggest, 
    select: function () { // When selecting an address from the suggestions
        var active, display, val;

        active  = this.$menu.find('.active');
        display = active.attr('data-display');
        val = active.attr('data-value');
        this.setValue(display, val, false); // This works, however when I do it as shown in the above example from an external script, it doesn't. This is because it doesn't receive the arguments.

    },
    setValue : function(display, value, newAddress) { // Setting the textbox value
        console.log(display); // This returns undefined
        console.log(value); // This returns undefined
        if (display && display !== "" &&
            value && value !== "") {
            this.$element.val(this.updater(display)).change();
            this.$hiddenInput.val(value);
            this.$element.addClass("msuggest-selected");
        }
        if(newAddress === false){
            return this.hide();
        }
    },
});

为什么它监听函数,而不监听传递给它的值?我是否需要在某处包含额外的代码行来定义这些参数?

任何有 jQuery 经验的人都会有很大的帮助!这是当前项目进展的瓶颈。谢谢你的时间!

编辑: 我错过了如何将参数从外部脚本传递到插件内部函数的代码。这是关于如何处理外部调用的插件定义,任何人都可以看到这个问题吗?

$.fn.multisuggest = function(option) {
    return this.each(function() {
        var $this = $(this), data = $this.data('multisuggest'), options = typeof option === 'object' && option;
        if (!data) {
            $this.data('multisuggest', ( data = new MultiSuggest(this, options)));
        } else if (typeof(option) === 'string') {
            var method = data[option];
            var parameters = Array.prototype.slice.call(arguments, 1);

            method.apply(this, parameters);
        }
    });
};
4

2 回答 2

1

“通常”的插件主管如下所示:

// *****************************
// ***** Start: Supervisor *****
$.fn.multisuggest = function( method ) {
    if ( methods[method] ) {
        return methods[method].apply( this, Array.prototype.slice.call( arguments, 1 ));
    } else if ( typeof method === 'object' || !method ) {
        return methods.init.apply( this, arguments );
    } else {
        $.error( 'Method ' + method + ' does not exist in jQuery.' + pluginName );
    }
};
// ***** Fin: Supervisor *****
// ***************************

所有的循环this都应该在方法函数中,而不是在主管中。

我有点担心new MultiSuggest(...)出现在现任主管身上。这种事情是完全不合常规的。原作者显然心里有数。

于 2013-06-18T10:06:28.183 回答
0

您需要扩展附加到的 jQuery 插件函数$.fn['multisuggest'],该函数可能只接受和传递一个参数。

于 2013-06-17T19:48:09.130 回答