【问题标题】:Jquery on keyup onceJquery在keyup上一次
【发布时间】:2017-06-21 02:57:47
【问题描述】:

当我下次输入一些文字时如何触发另一个警报?
例如:
1.放一些文字
2.警报触发
3.再放一些文字
4. 再次触发警报

编辑:我不想每次输入时都触发警报,我想做的是......假设我输入“abcd”,该功能应该只触发一次。然后我点击屏幕上的任何地方。后来,我在文本框中再次键入“dddd”,函数再次触发一次

编辑 2:对不起,伙计们,也许我的要求有点令人困惑,我只是编辑代码并重新解释以说明我的真实情况。所以,首先,我在文本框中键入“abcd”,工具提示应该在“a”的第一个字母上触发一次。然后我点击屏幕的任何地方,工具提示消失。接下来,我再次键入“gffee”,工具提示应该再次出现在“g”的第一个字母上。

<input type="text" id="test">
<input type="button" id="tool">


$('#test').one("keyup", function(){ 
    $('#tool').tooltip("show");
});

$('#tool').tooltip({
        placement: "bottom",
        trigger: "focus",
        title: "Click here",
    });

回答:
感谢大家的帮助,我根据大家的答案设法解决了这个问题。

    count = 0;

    $('#test').on("change", function(){ 
        count = 0;
    });

    $('#test').on("keyup", function(){  

        if(count == 0)
        {
            $('#tool').tooltip("show");
            count = 1;
        }
    });

    $('#tool').tooltip({
        placement: "bottom",
        trigger: "focus",
        title: "Click here",
    });

  <input type="text" id="test">
  <input type="button" id="tool">

【问题讨论】:

  • 使用.one() 只会触发一次事件
  • 下次如何触发一次?
  • 我猜删除一个
  • 是的,而不是 .one 使用 .on
  • 如果您不想运行一次.keyup(),请使用.on() 而不是.one()

标签: javascript jquery html


【解决方案1】:

试试这个

var triggered = 0; // or false

$('#test').on('input', function() {
    if(triggered == 0) {
        alert('whatever message here');
        triggered++;
    }
});

$('#test').on('blur', function() {
    // reset the triggered value to 0
    triggered = 0;
});

【讨论】:

  • 你给我一个想法如何做到这一点.. 非常感谢,会更新我的答案
  • 很高兴为您提供帮助。 :)
【解决方案2】:

我认为,仅使用keyup 事件就无法确定您何时完成输入。但是你可以尝试去抖动。我添加了underscore.js 以使用debouce,但您可以随意使用您自己的实现或其他库。来自下划线的去抖动文档

对于实现只有在输入停止到达后才会发生的行为很有用

您可以根据自己的需要调整等待时间。我已经做到了 500 毫秒

$('#test').on("keyup", _.debounce(function() {
  alert("test");
}, 500));
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>

<input type="text" id="test">

去抖动的精彩解释here

替代解决方案

另一种可能的解决方案是附加一个blur 处理程序,如果在您的input 之外单击该处理程序,它将执行

$("#test").on("blur", function(e) {
  alert("Test")
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>

<input type="text" id="test">

【讨论】:

    【解决方案3】:

    你不能只使用 onchange 函数吗?从您的编辑看来,这似乎更适合您的用例。

    所以

    $('#test').on("change", function(){ 
        alert("test");
    });
    

    【讨论】:

    • 感谢您的帮助。 onchange 对我来说似乎不是这样(这仅在输入/按键结束时才有效),我已经编辑了帖子以使问题更清楚。
    【解决方案4】:

    输入时使用clearTimeout(userTimer); 清除计时器,然后使用setTimeout(doneType, maxTimer*1000); 启动新计时器,如果超时调用函数doneType,maxTimer 以您选择的秒数为单位(此处为2s)

    var userTimer;
    var maxTimer = 2;
    
    //on input, clear the timer and start new timer
    $('#test').on('input', function () {
      clearTimeout(userTimer);
      userTimer = setTimeout(doneType, maxTimer*1000);
    });
    
    function doneType() {
      alert('keep type?');
    }
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    
    <input type="text" id="test">

    【讨论】:

    • 您不需要input 处理程序以及keyup 处理程序。一个或另一个就足够了。 (考虑到用户可以在不使用键盘的情况下编辑字段,使用input 可能会更好。)
    • @nnnnnn 谢谢,你是对的,只是在一种情况下,如果用户按下一个键 2 秒并且会触发 doneType,它可能会混淆用户。
    • 当我在 Chrome 中尝试您的演示(更新后)时,如果我按住某个键,则无论我按住它多长时间,在我松开之前都不会显示警报。
    • @nnnnnn 在我的 Macbook Chrome 上我有这个问题,但这是一个边缘情况,我更喜欢干净的代码 =D
    • 感谢您的帮助。我已经对帖子进行了一些编辑,您可以看看是否有比这更好的答案?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-30
    • 1970-01-01
    • 2022-10-14
    • 1970-01-01
    • 2011-12-08
    • 2012-05-21
    • 2011-07-09
    相关资源
    最近更新 更多