stopPropagation 不阻止默认
stopPropagation without preventing default
是否可以在不阻止默认事件行为的情况下停止事件传播?
滚动时应该让输入 increment/decrement 但阻止它冒泡到任何其他元素并滚动外部 div。 (以下是Chrome-我觉得而已)
$("input[type=number]").on("mousewheel",function(e){ // only works with chrome I think
e.stopPropagation();
console.log("scrolled");
});
div{
height:50px;
overflow:auto;
border: 1px solid black;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<div>
<input type='number'>
<div class='filler'></div>
</div>
但是 stopPropagation
调用似乎什么也没做。外面的 div 仍然滚动。
现在,这个特殊问题(滚动数字输入)可以通过 preventingDefault
并手动递增和递减输入 (JSFiddle) 来解决。
我正在寻找不涉及重新创建默认行为的通用解决方案。
所以我认为 preventDefault 替代方案是唯一能让这项工作成功的方案。
我也想过这个方案,但基本上是一样的。它在 div 上设置滚轮事件,并在检测到输入时取消它。
$("body > div").on("mousewheel",function(e){
if (e.target && e.target.tagName == "INPUT")
{
var currentVal = $(e.target).val() === "" ? 0:parseInt($(e.target).val(),10);
var step = $(e.target).attr("step") || 1;
//should have some min/max handling to be complete
if(e.originalEvent.wheelDelta > 0){
$(e.target).val(currentVal+parseInt(step,10));
}else{
$(e.target).val(currentVal-parseInt(step,10));
}
e.preventDefault();
}
});
一种可能的解决方法是在鼠标悬停在输入上时临时修复输入:
$("input[type=number]").on("mousewheel",function(e){
e.stopPropagation();
}).on("mouseenter", function() {
$(this).css("position", "fixed");
}).on("mouseleave", function() {
$(this).css("position", "");
});
div{
height:50px;
overflow:auto;
border: 1px solid black;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<div>
<input type='number'>
<div class='filler'></div>
</div>
是否可以在不阻止默认事件行为的情况下停止事件传播?
滚动时应该让输入 increment/decrement 但阻止它冒泡到任何其他元素并滚动外部 div。 (以下是Chrome-我觉得而已)
$("input[type=number]").on("mousewheel",function(e){ // only works with chrome I think
e.stopPropagation();
console.log("scrolled");
});
div{
height:50px;
overflow:auto;
border: 1px solid black;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<div>
<input type='number'>
<div class='filler'></div>
</div>
但是 stopPropagation
调用似乎什么也没做。外面的 div 仍然滚动。
现在,这个特殊问题(滚动数字输入)可以通过 preventingDefault
并手动递增和递减输入 (JSFiddle) 来解决。
我正在寻找不涉及重新创建默认行为的通用解决方案。
所以我认为 preventDefault 替代方案是唯一能让这项工作成功的方案。
我也想过这个方案,但基本上是一样的。它在 div 上设置滚轮事件,并在检测到输入时取消它。
$("body > div").on("mousewheel",function(e){
if (e.target && e.target.tagName == "INPUT")
{
var currentVal = $(e.target).val() === "" ? 0:parseInt($(e.target).val(),10);
var step = $(e.target).attr("step") || 1;
//should have some min/max handling to be complete
if(e.originalEvent.wheelDelta > 0){
$(e.target).val(currentVal+parseInt(step,10));
}else{
$(e.target).val(currentVal-parseInt(step,10));
}
e.preventDefault();
}
});
一种可能的解决方法是在鼠标悬停在输入上时临时修复输入:
$("input[type=number]").on("mousewheel",function(e){
e.stopPropagation();
}).on("mouseenter", function() {
$(this).css("position", "fixed");
}).on("mouseleave", function() {
$(this).css("position", "");
});
div{
height:50px;
overflow:auto;
border: 1px solid black;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<div>
<input type='number'>
<div class='filler'></div>
</div>