2011-11-30 98 views
13

可能是一個愚蠢的問題,但是如何防止表單中的select元素在點擊時顯示其下拉菜單?我試過如下:防止選擇菜單打開

$('select').click (function (e) { 
    console.log (e); 
    return false; 
}); 

$('select').click (function (e) { 
    e.preventDefault(); 
    console.log (e); 
}); 

但既不工作。

我在做什麼錯?

編輯:我需要知道的原因是需要一個jquery增強選擇元素,需要優雅地退化。這個想法是,選擇,點擊後,打開一個jQuery UI對話框與用戶從他們的選擇(單擊列表項目導致選擇的值更新)的精心製作的列表。如果JS被禁用,則選擇應該正常運行。

問題是,除了對話框打開,下拉菜單也出現,這不是我想要的。我不能只是禁用該控件,因爲它的值需要與表單的其餘部分一起提交。

+1

什麼禁用選擇本身? –

+0

也許你應該解釋你爲什麼試圖這樣做。這並沒有什麼意義,最明顯的答案是:如果你不想要select元素打開,那麼不要使用select元素。 – RoToRa

+0

這是一個選擇,應該優雅地退化。詳細的解釋來一個問題編輯。 – GordonM

回答

1

使用禁用

$(this).attr("disabled","disabled"); 
+1

在禁用它之前,它仍然會打開選擇列表。最好的選擇是在點擊(某些用戶操作)之前或在'mouseenter'事件中禁用選擇。 –

+0

@jSang:你是對的.OP可以在加載或任何特定事件之前點擊它。 – Gowri

+0

添加禁用的屬性會改變選擇框的樣式是灰色的,這聽起來不像海報的意圖。 –

2

隱藏在頁面加載選擇選項(如果啓用Javascript)。當選擇框被點擊時,它們不會顯示,但第一個選項(「選擇一個選項」或其他)的文本仍然會出現在選擇區域中。

$(document).ready(function() { 
    $('#idOfSelect option').css('display', 'none'); 
}); 

更新的解決方案:

$(document).ready(function() { 
    $('#idOfSelect').focusin(function() { 
     $(this).css('display', 'none'); 
     $('body').click(function(event) { 
      $(this).unbind(event); 
      $('#idOfSelect').css('display', 'block'); 
     }); 
    }); 
}); 
+0

不幸的是,這種做法是行不通的。它會導致select中的所有內容消失,包括當前選定的項目。 – GordonM

+0

嗯......這個解決方案在Chrome中工作,但我發現,(至少)的Firefox隱藏選定的項目,如你所說。我會添加一個更新的解決方案。 –

4

從我的經驗,如果我需要禁用的東西,最簡單的方法有它的另一個無形的元素(使用絕對定位) 。當你想再次允許默認行爲時,你只需隱藏絕對元素。

1

我剛剛解決了這個確切的問題,通過操縱select的'size'屬性。不是很優雅,但工作。希望它對你有所幫助。

<!-- Example select dropdown --> 
<select id="select" onclick="tackleDropdown()"> 
</select> 

<!-- The JS function --> 
<script> 
    function tackleDropdown(){ 
     document.getElementById('select').setAttribute('size', 0); 

     // your code for displaying the jQuery UI dialog (is it colorbox???) 

     // re-enabling the drop down 
     document.getElementById('select').setAttribute('size', document.getElementById('select').options.length); 
    } 
</script> 
45

這應該工作: -

$('#select').on('mousedown', function(e) { 
    e.preventDefault(); 
    this.blur(); 
    window.focus(); 
}); 
+0

我們有一個贏家。我看到另一個省略this.blur()和window.focus()的解決方案。它不是每次都有效;你的解決方案,謝謝。 –

+0

top work @ deniz-ozger你不會相信多少次我試圖解決這個問題 – Matt

+0

@DaveNottage只是'preventDefault()'似乎適用於我...你能分享其他方式,它不會工作? –

0

可以,關鍵是要取消MouseDown事件,而不是點擊。事件鏈在點擊這樣的方式進行,如果鼠標按下取消了鼠標鬆開就不會發生:

function cancelDropDown(ev) { 
    ev.preventDefault(); 
} 

document.getElementById("selectElement").addEventListener("mousedown", cancelDropDown, false); 
2

的問題是,你使用了錯誤的事件。

<select onmousedown="(function(e){ e.preventDefault(); })(event, this)"> 
    <option>Some Option</option> 
</select> 

JsFiddle

相關問題