【问题标题】:jQuery - show/hide search boxjQuery - 显示/隐藏搜索框
【发布时间】:2013-01-20 21:53:12
【问题描述】:

我编写了一个小 jQuery,用于在单击 div 时滑动打开搜索框。基本上,单击它会显示一个最初隐藏的 div,并且该 div 内部是一个搜索框和一个关闭按钮。这一切都很好。然而,关闭按钮不起作用。我的猜测是关闭按钮并没有隐藏那个 div,因为它本身就在 div 里面。这是我所拥有的,这是jsfiddle

HTML

<ul class="tert-nav">
    <li><img alt="" border="0" src="images/icon-cart.png" width="16" height="16" /></li>
    <li><img alt="" border="0" src="images/icon-tickets.png" width="16" height="16" /></li>
    <li class="searchit">
        <img alt="" border="0" class="searchicon" src="images/icon-search.png" width="16" height="16" />
        <div class="searchbox">
            <img alt="" border="0" class="closesearch" src="images/icon-close.png" width="16" height="16" />
            <input placeholder="search..." type="text" />
            <input type="submit" value="" />
        </div>
    </li>
</ul>

jQuery

$(document).ready(function() {

// Search
$('ul.tert-nav li.searchit').click(function() {
    $(this).addClass('search');
    $('.searchbox').fadeIn();
    $('ul.tert-nav li img.searchicon').hide();
});

$('ul.tert-nav li.searchit img.closesearch').click(function() {
    $('.searchbox').hide();
    $('ul.tert-nav li').removeClass('search');
});

})

CSS

ul.tert-nav {
    float: right;
    position: absolute;
    margin: 0;
    padding: 0;
    right: 0;
    top: 0;
    list-style: none;
}

ul.tert-nav li {
    float: right;
    width: 26px;
    height: 28px;
    background: #3c3c3c;
    text-align: center;
    margin-left: 2px;
    cursor: pointer;
    transition: all .2s ease;
    -o-transition: all .2s ease;
    -moz-transition: all .2s ease;
    -webkit-transition: all .2s ease;
}

ul.tert-nav li:hover {
    background: #000;
}

ul.tert-nav .search {
    width: 246px;
    text-align: left;
    cursor: default;
}

ul.tert-nav .search:hover {
    background: #3c3c3c;
}

ul.tert-nav .searchbox {
    display: none;
    width: 100%;
}

ul.tert-nav .searchbox .closesearch {
    float: left;
    margin: 6px 4px 0px 4px;
    cursor: pointer;
}

ul.tert-nav .searchbox .closesearch:hover {
    opacity: 0.8;   
}

ul.tert-nav .searchbox input[type=text] {
    float: left;
    width: 184px;
    height: 24px;
    padding: 0px 0px 0px 10px;
    margin: 2px 0px 0px 0px;
    border: none;
    background: url(images/search-bg.png) no-repeat;
    outline: none;
}

ul.tert-nav .searchbox input[type=submit] {
    float: left;
    width: 26px;
    height: 24px;
    margin: 2px 0px 0px 0px;
    padding: 0px;
    border: none;
    background: url(images/search-btn.png) no-repeat;
    outline: none;
    cursor: pointer;
}

此外,这里是初始状态和单击/打开状态的示例图像,以直观地了解我正在尝试做什么。谢谢!

【问题讨论】:

    标签: javascript jquery html show-hide


    【解决方案1】:

    stopPropagation() 的替代方案是只让div 执行此操作,前提是单击了div

    如果您在控件中有很多元素具有自己的点击事件并且您不想更新所有元素,或者如果您需要让点击事件传播但仍希望能够传播,这将非常方便在沿途的一些点击事件中进行区分。

    虽然在你的具体情况下stopPropagation() 会更容易偏离路线。

    $('ul.tert-nav li.searchit').click(function (event) {
            // Did the click originate from this?
            if(event.target !== this){
                // No, it wasn't. So we do nothing.
                return;
            }
    
            $(this).addClass('search');
            $('.searchbox').fadeIn();
            $('ul.tert-nav li img.searchicon').hide();
    });
    

    DEMO - 验证点击事件的来源


    【讨论】:

      【解决方案2】:

      因为关闭按钮在.searchit 框内,所以第一个处理程序也会在之后立即被触发。在关闭处理程序期间停止单击事件的传播,它应该可以工作:

      $('ul.tert-nav li.searchit img.closesearch').click(function(e) {
          e.stopPropagation();
          $('.searchbox').hide();
          $('ul.tert-nav li').removeClass('search');
      });
      

      【讨论】:

      • 完美!有道理,我什至试图阻止传播,但我认为我只是没有添加 (e) :)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-09
      • 2013-07-03
      • 1970-01-01
      相关资源
      最近更新 更多