0

我有一个具有 2 个文本输入的 Superfish 菜单项,如果这些字段之一具有用户的焦点,我想确保菜单不会关闭(隐藏)。

除了我不知道如何停止 Superfish Hide 事件执行之外,我拥有一切。

    jQuery(function () {
        jQuery('ul.sf-menu').superfish({
            onBeforeHide: function () {
                $('ul.sf-menu').find('input[type=text], input[type=password]').each(function () {
                    if ($(this).is(':focus')) {
                        //need code to stop Superfish Hide execution here
                    }
                });
            },
            delay: 500
        });
    });

如何停止隐藏事件执行?

4

3 回答 3

1

你需要类似的东西event.PreventDefault()吗?http://api.jquery.com/event.preventDefault/

或者,如果这不足以胜任这项工作,则return false;应该停止一切。

[编辑] 您可以尝试.stop()对元素的动画进行

jQuery(function () {
    jQuery('ul.sf-menu').superfish({
        onBeforeHide: function (liElement) {
            $('ul.sf-menu').find('input[type=text], input[type=password]').each(function () {
                if ($(this).is(':focus')) {
                    $(liElement).stop();
                }
            });
        },
        delay: 500
    });
});

或者,如果这没有帮助,您可能必须取消菜单为其li元素注册的 mouseleave 事件。原谅伪代码在if

$("ul.sf-menu").on("mouseleave", "li:having(ul)", function(){
        $(this).find('input[type=text], input[type=password]').each(function () {
            if ($(this).is(':focus')) {
                event.preventDefault();
            }
        });
});
于 2013-05-29T19:16:09.557 回答
0

嗯,这是固定的。我不得不更改插件代码本身:

if ($ul.find('input[type=text]:focus, input[type=password]:focus ').length  == 0){

     $ul.stop(true, true).animate(o.animationOut, speed, function () {
     var $this = $(this);                        
     o.onHide.call($this);                        
             });
     }
 else{
      $(this).addClass(o.hoverClass);
     }

这个想法是计算当前具有用户焦点的文本输入的数量,如果有多个,则添加hoverClass使菜单项保持可见的文本输入。如果没有焦点项目,它将照常进行隐藏。

于 2013-05-29T20:41:06.440 回答
0

我对 superfish 1.7.4 有同样的需求。这是我的解决方案,经过 Chrome 31、IE 10 和 IE 10 兼容模式 IE 7 测试:

 /*to store the input which gets the focus (mouse click or tab key)*/
    var inputFocused = null;
    $('#mymenu').superfish({
    delay: 500
    , speed: 'fast'
    , disableHI: true
    , onInit: function(){
        var ul = $(this);
        var inputs = ul.find('input[type=text], input[type=password]');
        inputs.each(function(index, elt){
        $(elt).on('click', function(event){
            inputFocused = $(elt);
            event.stopPropagation();
        });
        $(document).on('click', function(event){
                            /*to allow people to choose to quit the menu*/
            inputFocused = null;
        });
        $(elt).on('keyup', function(event){
            inputFocused = $(elt);
            event.stopPropagation();
        });
    });
}
, onHide: function(){
var ul = $(this);
if(inputFocused != null && ul.find(inputFocused).length > 0){
    ul.css('display', 'block');
    inputFocused.focus();
}
}
});
于 2013-11-21T14:10:16.177 回答