【问题标题】:Function still running after return返回后功能仍在运行
【发布时间】:2017-08-26 04:16:07
【问题描述】:

我正在使用 RobotJS 向我的 Electron 应用程序添加颜色选择器,当用户单击按钮时,.click() 会触发我的函数,该函数专注于输入(隐藏的 opacity: 0; height: 0px; width: 0px;),它充当何时的代理用户单击 (.blur()) 以获取光标位置的颜色。然后它将该颜色放入另一个输入字段并返回。但是,如果用户随后单击返回的输入字段然后单击退出,.blur() 仍会触发。为什么会这样?我该如何预防?

<input class="clickProxy" style="opacity: 0; height: 0px; width: 0px;" /> 

$('.color_picker').click(function(){
    getColorAtPointer();
});

function getColorAtPointer(){
    $('input[name="colorSample"]').focus();

    $('input[name="colorSample"]').blur(function(){
        var mouse = robot.getMousePos();
        $('input[name="colorSample"]').val('#'+robot.getPixelColor(mouse.x, mouse.y));
        return;
    });
}

谢谢!

【问题讨论】:

    标签: javascript jquery node.js electron


    【解决方案1】:

    在用户单击颜色选择器后,您将绑定模糊事件。您永远不会取消绑定它,因此每次用户离开 colorSample 元素时它都会继续触发。你有几个选择。

    在我看来,最好的方法是使用 .one 而不是 blur,这样事件只会触发一次。

    例如:

    function getColorAtPointer(){
        $('input[name="colorSample"]').focus();
    
        $('input[name="colorSample"]').one("blur", function(){
            var mouse = robot.getMousePos();
            $('input[name="colorSample"]').val('#'+robot.getPixelColor(mouse.x, mouse.y));
            return;
        });
    }
    

    或者,您可以命名模糊事件(例如.on("blur.color-picked"),然后在模糊事件处理程序内部取消绑定事件(例如.off("blur.color-picked")

    另外值得注意的是,你不必在点击事件中使用匿名函数,你可以直接传递函数

    $('.color_picker').click(getColorAtPointer);
    

    【讨论】:

    • 有道理!谢谢!
    • 实际上,不需要return; 对吧?
    • 正确。如果您想返回它,事件处理程序会理解 false 的返回值。这应该防止事件传播/冒泡。当然,当您不从函数调用 return 时,javascript 会为您返回 undefined,这很好。
    猜你喜欢
    • 1970-01-01
    • 2020-02-04
    • 1970-01-01
    • 2014-07-31
    • 1970-01-01
    • 2020-08-06
    • 1970-01-01
    • 1970-01-01
    • 2021-08-10
    相关资源
    最近更新 更多