7

div がクリックされたときに検索ボックスをスライドして開く小さな jQuery を作成しました。基本的に、クリックすると、最初は非表示の 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;
}

また、これは、私がやろうとしていることを視覚的に理解するために、初期状態とクリック/開いた状態のサンプル画像です。ありがとう!

ここに画像の説明を入力

4

2 に答える 2

8

閉じるボタンは.searchitボックス内にあるため、最初のハンドラーも直後に起動されます。クローズ ハンドラー中にクリック イベントの伝播を停止すると、動作するはずです。

$('ul.tert-nav li.searchit img.closesearch').click(function(e) {
    e.stopPropagation();
    $('.searchbox').hide();
    $('ul.tert-nav li').removeClass('search');
});
于 2013-02-05T20:45:54.317 に答える
3

代替手段は、クリックされたものである場合にstopPropagation()のみ、それを実行させることです。divdiv

これは、コントロール内に独自のクリック イベントを持つ多数の要素があり、それらすべてを更新したくない場合、またはクリック イベントを伝播させる必要があるが内部で区別できるようにしたい場合に非常に便利です。途中のいくつかのクリックイベントで。

あなたの特定の状況で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();
});

デモ- クリック イベントのソースを検証する


于 2013-02-05T20:48:10.760 に答える