1

这只是一个简单的问题,因为我无法弄清楚这里的实际问题是什么,也许有人在扩展 jquery-ui 小部件方面有更多经验。

我试图改变menu._close方法中的一些行为,像这样扩展小部件:

( function($, undefined ) {
    $.widget('ui.menu', $.ui.menu, {
        _close: function(startMenu) {
            this._super('_close', startMenu)
                    console.log('extension works!')
        } 
    } )
} (jQuery) );

据我发现的消息来源,这是正确的方法。但现在,问题在于_super方法。它应该调用原始menu._close方法,并且确实如此 - 将唯一的参数传递startMenu给它。但是父方法失败了。

这是原始jquery-uimenu._close方法的来源:

_close: function( startMenu ) {
    if ( !startMenu ) {
        startMenu = this.active ? this.active.parent() : this.element;
    }

    startMenu
        .find( ".ui-menu" )
        .hide()
        .attr( "aria-hidden", "true" )
        .attr( "aria-expanded", "false" )
        .end()
        .find( "a.ui-state-active" )
        .removeClass( "ui-state-active" );
}

现在,它告诉我TypeError: startMenu.find is not a function,是的,这不是因为this.element它不是一个实际的 jQuery 对象。但我的问题是,为什么?

我只扩展了方法,没有改变任何功能,只在调用原始方法后添加了一个调试消息,向它传递了唯一的参数。我在这里做错了什么?

提前致谢,周末愉快!

4

1 回答 1

1

_super()已经知道它应该调用哪个基方法,因此传递它的名称是多余的。

你只需要写:

_close: function(startMenu) {
    this._super(startMenu);
    console.log("extension works!");
}

在您当前的代码中,传递给基本方法的第一个参数将是方法名称而不是startMenu,这确实会导致基本方法失败。

于 2013-04-20T12:39:54.597 回答