【问题标题】:Trigger a single function on multiple different events在多个不同事件上触发单个函数
【发布时间】:2017-12-13 21:24:48
【问题描述】:

我正在使用以下脚本创建一个将对象附加到文本区域的函数:
Project PageProject Code

inputNum.onchange = inputNum.onkeydown =  function(e){
        if(e.type == 'change' || (e.type = 'keydown' && e.keyCode == 13)){
            if(checkLength(inputNum.value,10) === true){
                inputNum.value = 9999999999;
            }

            //random variables and functions

            var j = 0;
            var m = setInterval(function(){
                if(j !== 0){
                    val = val * 40014;
                }
                if(val <= a){
                    if(useOpt === true){
                        res.value = res.value + "\n" + Math.round(Number((Number(val / div) * en) - sn));
                    }else{
                        res.value = res.value + "\n" + Number(Number(val / div) - Math.floor(val/div)).toFixed(5);
                    }
                }else{
                    var n = val;
                    n = l(n,a);
                    val = n;
                    console.log(n);
                    if(useOpt === true){
                        res.value = res.value + "\n" + Math.round(Number((Number(n / div) * en) - sn));
                    }else{
                        res.value = res.value + "\n" + Number(Number(n / div) - Math.floor(n/div)).toFixed(5);
                    }
                }
                j = j + 1;
                if(j == Number(rep.value)){
                    clearInterval(m);
                }
            },1);
            res.value = res.value.replace(/\n/,"");
        }
    };

但是,当我在输入元素上按“输入”时,我似乎无法找到只运行一次此功能的方法。按“回车”的结果是:

0.00002
0.00002
0.74558
0.74558

而不仅仅是 0.00002 和 0.74558 本身。 有没有一种方法可以让我在按回车键更改输入值时只运行一次该函数?另外,我不想为此使用 jQuery。我希望代码在更改数字但未按下 Enter 键时以及按下 Enter 键且未更改任何内容时以及更改值且按下 Enter 键时运行。

【问题讨论】:

  • 检查e.keyCode === 13(回车键)并在这种情况下取​​消事件。
  • 尝试从顶部条件中删除e.type == 'change' ||
  • 我希望当您编辑值,然后单击窗口而不是按“Enter”时,它也会运行。另外,即使您不更改值,但按回车键,我也希望代码运行。

标签: javascript function events


【解决方案1】:

作为一个很好的解决方法,我建议节流去抖动你的处理程序主体。有很多实现,您可以创建自己的实现,但让我们将 lodash throttle 设置为 false 的 trailing 选项:

var myHandler = function (e) { /* ... */ }
var myThrottledHandler = _.throttle(myHandler, 45, { trailing: false });
inputNum.onchange = inputNum.onkeydown = myThrottledHandler;

这将不允许在 45 毫秒过去之前调用您的处理程序两次。

【讨论】:

  • 嗯。所以你建议我设置某种计时器来停止一个事件并确保只有一个事件运行?
  • @DanielLau 没错。如果有两个不同的触发器('onChange' 和 'onKeyEnter'),我想这将是合适的解决方案。
  • @DanielLau 另外,我认为,如果您在处理程序的主体中有一些 value ,您可以尝试以下方法:1)将该值保存在外部范围中,2)如果保存的值与新值匹配,则添加从处理程序返回的第一行条件。
猜你喜欢
  • 1970-01-01
  • 2012-03-18
  • 2015-10-15
  • 1970-01-01
  • 2015-11-10
  • 2019-07-23
  • 2021-03-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多