jQuery将参数发送到事件

时间:2014-06-30 11:58:35

标签: javascript jquery events event-handling

我从插件中抛出一个事件有点问题。我的插件正在举办一个名为“initNewHeight'这工作正常。现在我想将插件中更改的值发送到称为此插件的函数whitch ...

像这样:

    (function($) {
        $.fn.meAutoSize = function (options, callback){
            var $this = $(this);
            var $options = options || {};

            /* Optionen welche übergeben wurden in eine Variable speichern und mit den Standardwerten verbinden */
            $options = $.extend($.fn.meAutoSize.defaults, options);

            /* Event an den EventHandler binden */
            $this.bind("initEvent", function() { options.init.call(); });

            /* Initialize Event auslösen, neu Inhalte laden */
            $this.trigger("initEvent", $this);

            /* Initialize Event auslösen, neu Inhalte laden */
            $this.bind("initEventNewHeight", function() { options.initNewHeight.call() });

            var newHeight = 12
            $this.trigger("initEventNewHeight", $this, newHeight);
        };

        // Standard-Optionen für das Plugin
        $.fn.meAutoSize.defaults = {
            init: function() {},
            initNewHeight: function(el, newHeight) {}
        }
    })(jQuery);


    $('.autoheight').meAutoSize({
        init: function() {
            $('#Init').html('init function')
        },

        initNewHeight: function(el, newHeight) {
            $('#NewHeight').html('NewHeight:  ' + el +', ' + newHeight)
        }
});

但这种方式不起作用。

所以你可以在这里看到它:http://jsfiddle.net/Tabes/qRPfm/

2 个答案:

答案 0 :(得分:1)

尝试改变,这:

$this.bind("initEventNewHeight", function() { options.initNewHeight.call() });

为:

$this.bind("initEventNewHeight", function() { options.initNewHeight.call($this, $this, 120) });

答案 1 :(得分:0)

您的插件存在很多问题,我强烈建议您至少阅读this tutorial

Updated Fiddle 请注意,我没有修复下面提到的分数,我只是让它按预期工作

  1. 如果将多个参数传递给trigger,则需要将它们包装在一个数组中。

    $this.trigger("initEventNewHeight", [$this, newHeight]);
    
  2. 在jQuery对象原型函数(您的插件函数)中,this指向jQuery对象,而不是DOM节点。因此,var $this = $(this);没有按照您的想法执行。此外,如果调用插件的jQuery集合封装了多个DOM元素,那么代码的结构化方式将导致问题。

    您的插件功能应如下所示:

    return this.each(function { 
       /*apply plugin to 'this', which now is a DOM node*/ 
    });
    
  3. bind已弃用,请使用on

  4. 争吵不会落在天空中,因为你没有通过,所以我看不出你期望得到什么价值。

     $this.bind("initEventNewHeight", function(e, el, newHeight) {
         //passing el is not necessary since the context will already be $this
         options.initNewHeight.call($this, el, newHeight);
     });
    
  5. 您应该考虑将DOM元素本身用作事件发射器,并利用jQuery事件架构来发布事件,而不是像您一样依赖回调函数。

        //E.g. 
        var someEvent = $.Event('myCustomEvent');
        someEvent.someParam = 'some value';
    
        $(domElOfYourPlugin).trigger(someEvent);
    

    现在,客户可以注册$(domElOfYourPlugin).on('myCustomEvent', ...)

  6. 等处理程序