当前位置: 首页 > 知识库问答 >
问题:

在输入范围html元素上防止mousedown事件,但仍允许用户拖动滑块

丁晋
2023-03-14

那么,有没有一种方法可以在输入范围元素上禁用mousedown和/或click事件,但同时让用户拖动滑块并在change事件上仍然触发?

禁用在线点击,但仍然允许拖动滑块。我想要防止用户在滑块中间跳转(使用mousedown/click),但我想让他们拖动它,这样值就会改变。

<input id="slider" name="slider" type="range" value="-1" min="-1" max="30" step="1" />

这没有任何帮助,因为在更改范围时会被调用,并且会弄乱数字。

$slider.on('mousedown', function(event) {
    //event.preventDefault();
    this.value = -1;
    /* Act on the event */
    console.log("mousedown");
});
 $slider.on('click', function(event) {
    event.preventDefault();
    this.value = -1;
    /* Act on the event */
    console.log("click");
});

如果调用Event.PreventDefault();mousedown滑块上的不起作用,也不能拖动。有没有办法绕过。

我正在尝试在html中重新创建这个效果,对于这种缩放,有没有jQuery效果?

共有2个答案

商运锋
2023-03-14

您可以使用CSS控制范围的部分,并以这种方式禁用所有这些部分的指针事件,但滑块的thumb除外。这样,只有在点击滑块的按钮时才注册点击事件。

pointer-events: none;          // disable all event on the range

使用伪类选择器以thumb为目标,并覆盖所有主要浏览器,如下所示。

input[type=range]::-webkit-slider-thumb {   // support webkit (e.g. Chrome/Safari)
input[type=range]::-moz-range-thumb {       // support for Firefox
input[type=range]::-ms-thumb                // support for IE 

这是它在行动中的样子。

null

$("#slider").on('mousedown', function(event) {
  console.log('Mouse-down: only fired when thumb of the range is clicked');
});
$("#slider").on('mouseup', function(event) {
  console.log('Mouse-up: only fired when thumb of the range is clicked');
});
input[type=range] {
  pointer-events: none;
}

input[type=range]::-webkit-slider-thumb {
  pointer-events: auto;
}

input[type=range]::-moz-range-thumb {
  pointer-events: auto;
}

input[type=range]::-ms-thumb {
  pointer-events: auto;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input id="slider" name="slider" type="range" value="-1" min="-1" max="30" step="1" />
柯子琪
2023-03-14

您可以使用CSS伪类给出inputpointer-events:autothumb(允许鼠标事件),并给出范围的其余部分输入pointer-events:none(不允许鼠标事件)。

pointer-events的文档说明:

pointer-events CSS属性指定在什么情况下(如果有的话)特定图形元素可以成为鼠标事件的目标。

如果未指定pointer-events属性,则该元素的行为与它相同。在SVG内容中,该值与visiblePainted值具有相同的效果。

元素永远不是鼠标事件的目标;但是,如果其后代元素的指针事件设置为其他值,则鼠标事件可能以这些后代元素为目标。在这些情况下,鼠标事件将在事件捕获/泡泡阶段期间,在前往/离开子元素的途中,根据需要触发该父元素上的事件侦听器。

null

input[type=range]{
  pointer-events: none;
}
input[type=range]::-webkit-slider-thumb{/*Webkit Browsers like Chome and Safari*/
  pointer-events: auto;
}
input[type=range]::-moz-range-thumb{/*Firefox*/
  pointer-events: auto;
}
input[type=range]::-ms-thumb{/*Internet Explorer*/
  pointer-events: auto;
}
<input type="range" value="0" min="0" max="100"/>
 类似资料:
  • 在我的Angular 2应用程序中,我使用普通的HTML5输入类型“范围”为用户提供一个简单的滑块组件。 我需要知道用户何时释放滑块。释放意味着使用鼠标完成拖动并释放鼠标按钮。为此,我参加了OnMouseUp活动。然而,这不适用于我使用触摸设备的情况。 在我的平板电脑,我可以拖动滑块aroun,但当释放它与我的手指的事件是没有发射。 我知道,这不是鼠标,但是什么事件相当于在鼠标上运行并在触摸设备上

  • 问题内容: 当我玩时,只有在将滑块放到新位置时Firefox才会触发onchange事件,在该位置上,Chrome和其他人在拖动滑块时触发onchange事件。 如何在Firefox中拖动来实现? 问题答案: 显然Chrome和Safari是错误的:仅应在用户释放鼠标时才触发。要获取连续更新,您应该使用该事件,该事件将通过鼠标和键盘捕获Firefox,Safari和Chrome中的实时更新。 但是

  • 问题内容: 我使用jQueryMobile为iOS和Android创建了一个网站。 我不希望文档本身滚动。相反,只有一个区域(一个元素)应该是可滚动的(通过css属性)。 所以我通过以下方式禁用了文档滚动: 但这也将禁用文档中所有其他元素的滚动,无论是否设置。 我该如何解决? 问题答案: 终于,我开始工作了。真的很简单:

  • 问题内容: 我一直在寻找一种“灯箱”类型的解决方案,它允许这样做,但还没有找到(请提出建议,如果您知道的话)。 我尝试重新创建的行为就像单击图片时在Pinterest上看到的一样。叠加层是可滚动的( 因为整个叠加层像页面顶部的页面一样向上移动 ),但是叠加层 后面 的主体是固定的。 我试图仅使用CSS( _即使用覆盖整个页面和正文的覆盖层)_来创建它,但这并不能阻止其滚动。 如何防止正文/页面滚动

  • 问题内容: 这个答案描述了如何使用CSS3设置复选框样式,而无需使用: 这在Chrome 22中有效,但在Firefox 15或IE 9中无效。 鉴于后两种浏览器均缺乏支持, 根据CSS3规范 , Chrome的行为是否有效? 问题答案: 这是未知的土地;规格并不能解决问题。在CSS 2.1规范说 : “注意。该规范并未完全定义:before和:after与替换元素(例如HTML中的IMG)的交互

  • 问题内容: 我正在开发一个Web应用程序,正在尝试为其提供功能齐全的窗口系统。目前进展顺利,我只遇到一个小问题。有时,当我去拖动应用程序的一部分时(通常是窗口的角落div,应该触发调整大小的操作),Web浏览器变得很聪明,并认为我的意思是拖放东西。最终结果是,当浏览器进行拖放操作时,我的动作被暂停。 是否有一种简单的方法来禁用浏览器的拖放?理想情况下,我希望能够在用户单击某些元素时将其关闭,但要重