扩展jquery-ui菜单小部件失败,但它不应该

时间:2013-04-20 11:50:28

标签: jquery jquery-ui extending jquery-widgets

这只是一个简单的问题,因为我无法弄清楚这里的实际问题是什么,也许有人在扩展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-ui menu._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对象。但我的问题是,为什么?

我只扩展了方法,不改变任何功能,只在调用原始方法后添加调试mesasge ,向其提供唯一参数。我在这里做错了什么?

提前致谢,祝周末愉快!

1 个答案:

答案 0 :(得分:1)

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

你只需写:

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

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