根据HTML规范,HTML中的标签的"readonly"属性,并仍然获取POST数据?
你应该保持 select
元素的 disabled
属性,同时添加另一个隐藏的 input
,并设置相同的名称和值。
如果重新启用 SELECT 元素,在 onchange 事件中将其值复制到隐藏的输入框中,然后禁用(或删除)该隐藏的输入框。
这是一个演示:
$('#mainform').submit(function() {
$('#formdata_container').show();
$('#formdata').html($(this).serialize());
return false;
});
$('#enableselect').click(function() {
$('#mainform input[name=animal]')
.attr("disabled", true);
$('#animal-select')
.attr('disabled', false)
.attr('name', 'animal');
$('#enableselect').hide();
return false;
});
#formdata_container {
padding: 10px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div>
<form id="mainform">
<select id="animal-select" disabled="true">
<option value="cat" selected>Cat</option>
<option value="dog">Dog</option>
<option value="hamster">Hamster</option>
</select>
<input type="hidden" name="animal" value="cat"/>
<button id="enableselect">Enable</button>
<select name="color">
<option value="blue" selected>Blue</option>
<option value="green">Green</option>
<option value="red">Red</option>
</select>
<input type="submit"/>
</form>
</div>
<div id="formdata_container" style="display:none">
<div>Submitted data:</div>
<div id="formdata">
</div>
</div>
我们也可以禁用除所选选项外的所有选项。
这样,下拉列表仍然能够工作(并提交其值),但用户无法选择其他值。
<select>
<option disabled>1</option>
<option selected>2</option>
<option disabled>3</option>
</select>
option
标签的 disabled
属性在浏览器中的支持情况。 - Jo.$("#yourSelectId option:not(:selected)).attr("disabled", "disabled")
。 - Onkel-j$('#yourSelect').prop('disabled', true);
重新启用它以便在提交之前包括 GET / POST 数据:$('#yourForm').on('submit', function() {
$('#yourSelect').prop('disabled', false);
});
此外,你可以重新启用每个已禁用的输入或选择:
另外,您可以重新启用每个已被禁用的输入或选择:
$('#yourForm').on('submit', function() {
$('input, select').prop('disabled', false);
});
.prop('disabled', true/false)
来设置禁用属性。该属性不会改变实际状态。 - Paris Char使用CSS也可以为
... .on('mouseover', function(){ ... });
。 - Fr0zenFyrpointer-events: none
可以防止鼠标光标聚焦。为了同时防止键盘聚焦,您可以通过在所有聚焦事件上立即模糊补充它:$('select').css('pointer-events', 'none').on('focus', function () {$(this).blur();});
。 - Quinn ComendanttabIndex
еұһжҖ§/еұһжҖ§пјҢеҖјдёә-1
гҖӮ - Armen Michaeli我知道现在已经太晚了,但使用简单的CSS可以完成:
select[readonly] option, select[readonly] optgroup {
display: none;
}
不需要使用JavaScript技巧。
简单的jQuery解决方案
如果您的选择框具有 readonly
类,则使用此方法
jQuery('select.readonly option:not(:selected)').attr('disabled',true);
如果您的选择框具有readonly="readonly"
属性,则可以使用此方法。
$('select[readonly="readonly"] option:not(:selected)').attr('disabled',true);
select[readonly]
,这样您只需向元素添加 readonly 属性 - 这样您就不必将选择与任何其他类型区别对待。然后,JavaScript 逐步增强效果。请记住,此解决方案(以及大多数其他解决方案)仅帮助用户代理提供最佳用户体验 - 它实际上并没有强制执行任何内容(如果需要,必须在服务器端执行)。 - jgivoni<select id="countries" onfocus="this.defaultIndex=this.selectedIndex;" onchange="this.selectedIndex=this.defaultIndex;">
<option value="1">Country1</option>
<option value="2">Country2</option>
<option value="3">Country3</option>
<option value="4">Country4</option>
<option value="5">Country5</option>
<option value="6">Country6</option>
<option value="7" selected="selected">Country7</option>
<option value="8">Country8</option>
<option value="9">Country9</option>
</select>
在IE 6、7和8b2,Firefox 2和3,Opera 9.62,Windows的Safari 3.2.1以及Google Chrome中测试并且工作正常。
<select id="countries"> <option value="7" selected="selected">Country7</option> </select>
- Pothercaonchange = 'this.selectedIndex=this.defaultIndex; alert("您不应该更改此项..");'
而不是悄悄地更改所选的索引。 - Fr0zenFyr简单的 CSS 解决方案:
select[readonly]{
background: #eee;
cursor:no-drop;
}
select[readonly] option{
display:none;
}
这会导致选择框变为灰色,在悬停时出现漂亮的“禁用”光标,而在选择后,选项列表则变为空,因此您无法更改其值。select[readonly] option:not([selected]) {display:none;}
这样它只会禁用未选中的选项,并仍然提交表单中选定的值。但这仍然是一个很棒的答案! - Auspex[最简单的解决方案]
由于原帖明确要求不禁用选择元素,这是我用来使选择只读的方法。
在html中:
<select style="pointer-events: none;" onclick="return false;" onkeydown="return false;" ></select>
这就是解决方法
解释
这样,您无需创建任何额外的元素,也不需要使用JavaScript禁用/重新启用元素或搞乱表单提交逻辑,也不需要使用任何第三方库。
另外,您可以轻松地添加CSS样式,例如将背景颜色设置为灰色或将文本颜色设置为灰色,以表示该元素为只读。我未将其添加到代码中,因为它非常特定于您的站点主题。
或者,如果您想通过JavaScript来实现:
let isReadOnly = true ;
selectElement.onclick = function () {
return !isReadOnly ;
};
selectElement.onkeydown =function(){
return !isReadOnly ;
} ;
selectElement.style.pointerEvents = isReadOnly ? "none" : "all" ;