2012-01-06 30 views
1

我需要在jQuery中創建交叉瀏覽器風格的標記。所以,而不是使乾淨的HTML SELECT元素標籤,我使用嵌套元素。頁面上會有很多可用的選擇框,因此它們應該彼此正確地工作。在多個元素之外單擊時隱藏

編輯:淡入效果 「淡入()/淡出()」 應當被用來代替 「隱藏()/顯示()」

介紹一個例子:

代替具有經典下拉列表中的清潔html元素

<select> 
    <option>Option 1</option> 
    <option>Option 1</option> 
    <option>Option 1</option> 
</select> 

我有嵌套的元素,所以我可以適當他們的風格:

<div class="gui-selectbox"> 
    <a class="gui-selectbox-button"> 
    <span class="gui-btn-l"></span> 
    <span class="gui-btn-c">Option 1</span> 
    <span class="gui-btn-r"></span> 
    </a> 
    <div class="gui-selectbox-dialog"> 
    <ul> 
     <li>Option 1</li> 
     <li>Option 2</li> 
     <li>Option 3</li> 
    <ul> 
    </div> 
</div> 

下面是代碼http://jsfiddle.net/aspirinemaga/XR4Y3/

應該以這種方式工作:

  • 當我的任何元素上點擊,它應該關閉所有selectboxes
  • 當我點擊在「.gui-selectbox-button」上,它應該顯示「.gui-selectbox-dialog」其父「.gui-selectbox」
  • 如果用戶cli 「.gui-選擇框按鈕」和「.gui-選擇框,對話框」之外中正,它應該關閉每個打開的selectboxes

更新:

我怎麼能告訴工作以不關閉如果當前目標是它的孩子,父母div?

這裏是一個例子:http://jsfiddle.net/aspirinemaga/ejyRR/5/。這是第三個因素。

+0

是'href =「選擇框按鈕」'假設是'class =「選擇框按鈕」'? – 2012-01-06 15:13:20

+0

我讓你工作JSfiddle:http://jsfiddle.net/XR4Y3/5/ – Jules 2012-01-06 15:37:05

回答

1

你可以合併你的代碼相當多。這將做你想要的。

例1

$('html').on('click', function() { 
    $('.gui-selectbox-dialog:visible').hide(); 
}); 

$('.gui-selectbox').on('click', function(event) { 
    $('.gui-selectbox-dialog:visible').hide(); 
    $(this).find('.gui-selectbox-dialog').show(); 

    event.stopPropagation(); 
}); 

$('.gui-selectbox-dialog ul').on('click', 'li', function(event) { 
    alert('selected = ' + $(this).text()); 

    event.stopPropagation(); 
}); 

小提琴演示:http://jsfiddle.net/tJ7Qb/

編輯:更新了我的代碼和演示聯繫,因爲我一直在使用舊.click()事件的方法和部分一些使用新.on()方法。還在選項點擊時添加了提醒。

+0

非常感謝傑夫!將嘗試適應我的代碼與你的一個。 – aspirinemaga 2012-01-06 15:44:59

+0

我更新了我的答案,以修復使用新舊jQuery代碼的代碼中的一些差異。現在它全部編碼爲使用'.on()'事件方法支持最新的1.7.1版本。 – 2012-01-06 15:49:59

+0

順便說一句,傑夫,我需要使用「淡入/淡出」效果,我試圖把.stopPropagation函數之前的「.fadeIn」效果,但它使閃爍。任何想法解決它? – aspirinemaga 2012-01-06 15:51:45

0

你可以做的是將click()函數分配給你的身體。並在此功能內確認哪個元素被完全點擊。如果它不是您的「選擇」框,請關閉打開的框。否則,打開或關閉被點擊的那個。

讓我澄清一下它的一些代碼:

$(document).click(function(event) { 

    if (gui_currentSelectboxID != null) { 
     $this = $(event.target); 
     $parent = $this.parent().parent(); 

     //Check if the clicked item was NOT the gui-selectbox option 
     if ($parent.attr('class') != 'gui-selectbox') { 
      $('#' + gui_currentSelectboxID).children('.gui-selectbox-dialog').fadeOut(100); 
      $('#' + gui_currentSelectboxID).children('.gui-selectbox-button').removeClass('active'); 
     } 
    } 

}); 

這應該做的伎倆:

http://jsfiddle.net/XR4Y3/5/

您可以通過驗證,如果.parent().parent()實際存在還是優化這一點,因爲實例document將不會有兩個父母。其他優化將使用您實際聲明的功能來隱藏選擇框等。

+0

感謝您的代碼Jules,我目前正在測試它。 – aspirinemaga 2012-01-06 15:30:06

+0

@aspirinemaga我改編了一下我的代碼,並向你展示了一個可能的方法來實現它:http://jsfiddle.net/XR4Y3/5/ – Jules 2012-01-06 15:33:16

+0

是的,這很好,但問題是當你點擊打開的對話框的內容時,它關閉了,這不是我想要的。我希望打開的對話框保持打開狀態,即使您點擊它,它也具有與按鈕類相同的父類。 – aspirinemaga 2012-01-06 15:40:20