2011-11-30 65 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

相关问题