简体   繁体   English

jQuery - 显示/隐藏搜索框

[英]jQuery - show/hide search box

I've written a little jQuery to slide open a search box when a div is clicked. 当点击div时,我写了一个小jQuery来滑动打开搜索框。 Basically, on click it shows a div that's initially hidden & inside that div is a search box and a close button. 基本上,点击它会显示一个最初隐藏的div,其中div是搜索框和关闭按钮。 That's all working fine. 这一切都很好。 What isn't working however is the close button. 然而,关闭按钮不起作用。 My guesses are that the close button is not hiding that div because it itself is inside the div. 我的猜测是关闭按钮没有隐藏该div,因为它本身就在div中。 Here's what I've got and here's a jsfiddle . 这就是我所拥有的,这里是一个jsfiddle

HTML 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 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 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;
}

Also, here's an example image of the initial state and the clicked/opened state to give a visual idea of what I'm trying to do. 此外,这里是初始状态和点击/打开状态的示例图像,以便直观地了解我正在尝试做什么。 Thanks! 谢谢!

在此输入图像描述

Because the close button is inside the .searchit box, the first handler is also being fired right after. 因为关闭按钮位于.searchit框内,所以第一个处理程序也会在之后被触发。 Stop the propagation of the click event during the close handler and it should work: 在关闭处理程序期间停止click事件的传播,它应该工作:

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

Alternative to stopPropagation() is to only let the div do it's thing if it was the div that was clicked on. stopPropagation()替代方法是只让div执行它的事情,如果它是被点击的div

This can come very handy if you have either lot of elements inside the control with their own click events and you don't want to update all of them or if you need to let the click event propagate but still want to be able to distinguish within in some click events along the way. 如果控件内部有很多元素都有自己的点击事件,并且您不想更新所有元素,或者您需要让click事件传播但仍希望能够区分内部,那么这可以非常方便在一些点击事件中。

Though in your specific situation stopPropagation() will be easier off course. 虽然在你的具体情况下, 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 - Validate the source of the click event DEMO - 验证click事件的来源


声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM