当我尝试动态禁用页面中的输入范围时,页面中的所有其他输入元素都停止在chrome中工作。
此处,当我停用#mySlider
时,#chkBox
和#myButton
无法访问,并且不会触发相应的功能,甚至无法选中此复选框。
我的Chrome版本:31.0.1650.63米
HTML
<input type="range" min="0" max="5" value="0" id="mySlider" onChange="checkMove(this)" />
<input type="checkbox" value="one" id="chkBox" ><br/>
<input type="button" id="myButton" value="Click Me" onClick="clickCheck();" />
SCRIPT
function checkMove(elem) {
var minVal = elem.value;
if (minVal == 2) {
elem.disabled = true;
}
}
function clickCheck() {
alert("hi")
}
答案 0 :(得分:0)
1)因为这似乎是Chrome的一个错误。您可以通过模拟已禁用的输入来破解它,只需将事件更改为onmouseup
即可使其生效
/* CSS */
#range {
position: relative
}
#range.disabled .cover {
display: block;
}
#range.disabled input {
color: rgb(82,82,82);
}
.cover {
width: 100%;
height: 100%;
background: transparent;
z-index:5;
position: absolute;
top: -5px;
bottom: 0;
right:0;
left: 0;
display: none;
}
<!-- HTML -->
<label id="range">
<input type="range" min="0" max="5" value="0" id="mySlider" onmouseup="checkMove(this)">
<div class="cover"></div>
</label>
<input type="checkbox" value="one" id="chkBox">
<br/>
<input type="button" id="myButton" value="Click Me" onClick="clickCheck();" />
// JAVASCRIPT
var range = document.getElementById('range');
function checkMove (elem) {
var minVal = elem.value;
console.log(minVal)
if (minVal >= 2) {
range.className = 'disabled';
}
}
修改强>
2)另一种破解方法,就是避免动态禁用它,这是首先发生错误的时候。有两个range
元素,一个disabled
和一个abled
。隐藏已禁用的元素,同时镜像来自abled元素的值。
当你想要禁用元素时,根据你的情况切换两个元素。
检查this fiddle,开关是否流畅且不明显。
<div id="range">
<input type="range" min="0" max="5" value="0" id="mySlider" onchange="checkMove(this)">
<input type="range" disabled min="0" max="5" value="0" id="altSlider">
</div>
// Javascript
var range = document.getElementById('range'),
alt = document.getElementById('altSlider');
function checkMove(elem) {
var minVal = elem.value;
alt.value = minVal;
console.log(minVal)
if (minVal == 2) {
range.className = 'disabled';
}
}
CSS:
#range {
position: relative;
display: inline-block;
}
#range.disabled #altSlider {
opacity: initial;
}
#range.disabled #mySlider {
display: none;
}
#altSlider {
opacity: 0;
}
#mySlider {
z-index:5;
position: absolute;
top: 0;
left: 0;
}
答案 1 :(得分:0)
为什么不尝试使用jquery选择器来禁用它
Html是
<input type="range" min="0" max="5" value="0" id="mySlider" />
<input type="checkbox" value="one" id="chkBox" ><br/>
<input type="button" id="myButton" value="Click Me" />
jquery的
jQuery(document).ready(function($){ $("#mySlider").change(function(){ var val = parseInt($(this).val()); var maxrange= parseInt($(this).attr("max")); if(val>=2){ $(this).val(2); $(this).attr("disabled", "true"); } }) $("#chkBox, #myButton").click(function(){ alert("It Works!"); }); })
答案 2 :(得分:0)
我知道该错误已在chrome中修复...一段时间以来,但是在检查了该错误的原因和解决方案后,我认为我会在需要时提供一种解决方法。
// Replace the `elem.disabled = true;` with
setTimeout(function(){ elem.disabled = true; },0);
我们的想法是让浏览器退出当前事件流,然后禁用输入元素。
问题本质上是catch 22,禁用输入,然后在出现最终事件时更新范围,问题是元素现在已被禁用,因此永远不会收到此类事件,因此离开了浏览器挂起,并且从未发布过用户界面。
有关更多详细信息,请查看上方@PrasanthKC在评论中的链接中提供的补丁。