JQuery插件 - 通过回调触发内部函数

时间:2014-09-25 17:21:22

标签: javascript jquery jquery-plugins closures jquery-events

跳到底部查询问题

JQuery插件:

$.fn.myPlugin = function( options ) {
    var options = $.extend({
        myOption: true,
        edit: function() {},
        done: function() {}
    }, options);

    options.edit.call(this);
    options.done.call(this);

    //plugin guts removed to prevent over complication

    return {
        edit: function(obj) {
            $(obj).closest('#myParent').find('#myInput').autosizeInput(); //plugin to autosize an input
        },
        done: function(obj) {
            $(this).closest('tr').find('td').not('.not').each(function(i) {
                //do some things
            });
        }
    }
});

请记住,这是我的插件的缩减版本。

从页面调用:

$(document).ready(function() {
    var myPlugin = $('.editable').myPlugin({
        edit: $(this).on('click', '.edit-td', function(e) {
            e.preventDefault();
            //do some page specific stuff
            myPlugin.edit( $(this) ); //call the edit returned function
        }),
        done: $(this).on('click', '.done-td', function(e) {
            e.preventDefault();
            //do some page specific stuff
            myPlugin.done( $(this) ); //call the done returned function
        });
    });
});

这在大多数情况下效果很好,但是,我真正想要的是每次触发特定回调时都会在我的插件中调用函数 - 无需从插件外部调用。

我尝试在我的插件中包含委托事件:

$(this).on('click', '.edit-td', function(e) {
    e.preventDefault();
    $(this).closest('#myParent').find('#myInput').autosizeInput();
});

$(this).on('click', '.done-td', function(e) {
    e.preventDefault();
    $(this).closest('tr').find('td').not('.not').each(function(i) {
        //do some things
    });
});

但是当.edit-td被触发时,它会传播并触发.done-td事件,如果我将e.stopPropagation()放入edit-td函数(因为它已被委派){{ 1}}完全停止射击。

非委托方法:

edit-td

但是在内部函数完成之前,我无法将返回的对象($(this).find('.done-td').click(function(e, this) {}); )解析为内部函数。 (只是未定义或this)。

*跳到这里

避免问题变为本地化 -

  

我需要从我的内部调用函数   每次触发特定回调时插件。   不使用闭包调用它

类似的东西:

missing formal parameter

1 个答案:

答案 0 :(得分:0)

我需要像这样返回一个函数:

return {
    enable: function(arg) {
        //do something
    },
    disable: function(arg) {
        //do something
    }
}

这样我可以通过引用自己从插件中调用它:

    this.myPlugin().disable();