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();
    }
});

http://jsfiddle.net/jgsp1ory/5/

一种可能的解决方法是在鼠标悬停在输入上时临时修复输入:

$("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>