Jquery - 区分'点击'并且'关注'使用两者时的相同输入

时间:2014-03-13 16:25:12

标签: javascript jquery html onclick onfocus

如果输入被点击,如果输入进入焦点,我试图在输入上触发事件。

我遇到的问题是阻止事件在点击上触发两次,因为很明显,点击输入也会使其成为焦点。我已经在jfiddle上放了一个非常宽松的版本来向你展示我的意思,代码如下:

HTML:

<body>
    <input type="textbox" name="tb1" class="input1"></input>
    <label> box 1 </label>
    <input type="textbox" name="tb2" class="input2"></input>
    <label> box 2 </label>
</body>

JQuery的

$(function () {
    $('.input2').click(function() {
        alert("click");
    });
    $('.input2').focus(function() {
        alert("focus");
    });
});

JSFiddle http://jsfiddle.net/XALSn/2/

您会看到,当您选择输入2时,您会收到一条警报,但如果您点击则会获得两条警报。理想情况下,对于我的场景,它需要是一个警报而忽略另一个。它似乎也没有真正关注。

提前感谢任何建议。

5 个答案:

答案 0 :(得分:3)

如何在焦点上设置标记,以便我们可以触发焦点并忽略点击,但是还可以监听焦点元素的点击次数?合理?看看demo jsFiddle - 如果您对焦或点击未聚焦的.index2,它会触发焦点事件并忽略点击。在聚焦时,点击它会触发点击。

我不知道为什么你会想要这个(我想不出任何人想要出于任何原因点击焦点元素(因为克拉已经在场上活动)但是你走了:

$(function () {
    $('.input2').on("click focus blur", function(e) {
        e.stopPropagation();
        if(e.type=="click"){
            if($(this).data("justfocussed")){
                $(this).data("justfocussed",false);
            } else {
                //I have been clicked on whilst in focus
                console.log("click");
            }
        } else if(e.type=="focus"){
            //I have been focussed on (either by clicking on whilst blurred or by tabbing to)
            console.log("focus");
            $(this).data("justfocussed",true);
        } else {
            //I no longer have focus
            console.log("blur");
            $(this).data("justfocussed",false);
        }
    });
});

http://jsfiddle.net/XALSn/12/

答案 1 :(得分:0)

只需在点击事件

上添加e.preventDefault()即可
$(function () {
    $('.input2').click(function(e) {
        console.log("click");
        e.preventDefault();
        e.stopPropagation();
    });
    $('.input2').focus(function() {
        console.log("focus");
    });
});

如果我理解你的问题,e.prevnetDefault()将阻止浏览器自动关注点击。然后你可以做一些与焦点不同的东西

答案 2 :(得分:0)

这可能不是最佳答案,但这是一种做法。我建议在输入中添加标签索引,并在其他输入模糊模糊时触发焦点事件。

我已经添加到这个小提琴: http://jsfiddle.net/XALSn/9/

$(function () {
    $('.input2').click(function(e) {
    alert("click");
    e.preventDefault();
});
});

$('input').blur(function(){
    $('input').focus(function() {
        alert("focus");
    });
});

答案 3 :(得分:0)

你可以使用我在JS中经常使用的一件事

var doSomething = true;

$(function () {
    $('.input2').click(function(e) {
        if (doSomething) {
        // do something :)
        }    
        doSomething = false;
    });
    $('.input2').focus(function() {
        if (doSomething) {
        // do something :)
        }
        doSomething = false;
    });
});

但你必须在mouseout或foucs over等上更改doSomething的值:)

答案 4 :(得分:0)

$(function () {
    var hasFocus = false;
    $("body")
    .off()
    .on({
        click : function()
        {
            if(!hasFocus)
            {
                hasFocus = true;
                alert("click");
            }
        },

        focus : function()
        {
            if(!hasFocus)
            {
                hasFocus = true;
                alert("focus");
            }
        }
    },".input2");
});

尝试设置标志hasFocus并相应地采取行动

http://jsfiddle.net/AEVTQ/2/