javascript - 如何判断触发事件的元素类型

标签 javascript jquery design-patterns jquery-events

我正在使用以下模块来显示子菜单:

icisSite.fatNav = function(trigger){

    function init() {
        width = 0,
        $mainMenuListEl = $('.nav-SiteNav .nav-list > li'),
        $subNav = $('.subNav > li > ul');
        appendSubNav();
        getWidth();
    };

    function appendSubNav(){
        $subNav.each(function(index){
            index = ++index;
            $(this).appendTo($mainMenuListEl[index]);   
        });    
    };

    function subNavShow(trigger){
        setWidth(trigger);
        trigger.toggleClass('hover');   
    };

    function subNavHide(trigger){
        trigger.toggleClass('hover');
        trigger
        .find('ul')
        .removeAttr('style');
    };

    function getWidth(){
        $mainMenuListEl.each(function(index){
            width += parseInt($(this).outerWidth());
        });

        width = width - 11;
    };

    function setWidth(trigger){
        trigger
        .find('ul')
        .css({'width': width}); 
    };

    return {
        setup: init,
        show: subNavShow,
        hide: subNavHide
    };

}();

icisSite.fatNav.setup();

$('.nav-SiteNav .nav-list > li:gt(0)').hover(function() {
    $this = $(this);
    icisSite.fatNav.show($this);    
},function(e) {
    icisSite.fatNav.hide($this);
});

$('.nav-SiteNav .nav-list > li:gt(0) a').focusin(function() {

    var $this = $(this);

    $this
    .parent()
    .toggleClass('hover');

    $this
    .parent()
    .find('ul')
    .css({'width': icisSite.width});

}); 

$('.nav-SiteNav .nav-list > li:gt(0) a').focusout(function() {

    var $this = $(this);

    $this
    .parent()
    .toggleClass('hover');

    $this
    .parent()
    .find('ul')
    .removeAttr('style');

});

我想重构以适应 focusin 和 focusout 事件。由于代码与悬停事件非常相似但又不相同。

除了检查“触发”的元素类型之外,我不确定该怎么做,想知道是否有更好的方法?

我什至不知道如何检索元素的类型?因此,如果它是一个悬停,它将返回一个 li 元素和一个焦点元素。

最佳答案

如果你想测试一个 jQuery 对象是否是你可以简单地使用 .is() 的东西

if($(this).is('li')){
}

if($(this).is('a')){
}

此外,您还可以通过检查 event.type 来重构 focusin,focusout 一些

未测试,但可能看起来像这样......

$('.nav-SiteNav .nav-list > li:gt(0) a').bind("focusin, focusout", function(event) {
    var $this = $(this);
    $this
    .parent()
    .toggleClass('hover');

    $this
    .parent()
    .find('ul');

   if(event.type =="focusout"){
     $this.removeAttr('style');
   }
   else
   {
     $this.css({'width': icisSite.width});
   }
});

关于javascript - 如何判断触发事件的元素类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5512307/

相关文章:

javascript - 当浏览器调整大小以适应移动设备分辨率时,会出现底部滚动条

javascript - IE7/8中$(window)和$(document)有什么区别?

使用 val() 时特殊字符的 Javascript/jQuery 编码

java - 没有输入参数的构建器,具有静态构建方法?

javascript - 使用 YouTube API 构建允许 YouTube 搜索的页面

JavaScript 如何验证控制台中某人更改的值

javascript - css 大小和边距以及百分比

javascript - 使用 JQuery .insertBefore() 方法未按给定的顺序执行

ios - 如何在手机中强制执行唯一的用户名

c++ - 在另一个类的成员函数中从成员函数启动线程