在单击按钮或更新字段上运行代码,但不能同时运行

时间:2014-06-07 19:21:27

标签: javascript html javascript-events

我想要两个:

  • <input onchange='fncChkVrification()'>
  • <button onmouseup='fncChkVrification()'>Hit Enter after pasting or typing the Code. Or Click Here.</button>

为了便于使用,我希望用户能够在填写输入文本框后按Enter键,并运行代码。问题是,用户可能需要稍后返回该输入字段,并重新运行具有相同值的代码。

例如:

  • 用户在输入字段中输入验证码并按Enter键。
  • 但他们还没有登录。所以用户会收到一条消息,说明他们还没有登录。
  • 他们登录并返回输入字段以运行验证,但是当他们跳出字段或按Enter键时,没有代码运行,因为验证码是相同的。

代码仅在值更改时运行。我假设浏览器记录并跟踪该值以及它是否已被更改。

我可以:

  • 如果出现错误,请清除该字段,并让用户再次输入验证码 。但是我想避免这种情况。
  • 仅使用按钮,而不是onchange事件。

我想为用户提供两个选项。我已经读过JavaScript不能同时运行两个函数,但是如果代码非常短并且运行得非常快,它会运行两次,不是同时运行,而是立即运行?

如果由于某种原因代码第二次运行,它可能根本不会影响结果,但我希望避免不必要的重复。

代码 DOES 运行两次!如果单击该按钮,则会触发两个事件。来自按钮的onmouseup,输入字段中的 onchange

window.countTimesRun = 0;

window.fncChkVrification = function() {
  console.log('fncChkVrification ran: ');

  countTimesRun = countTimesRun + 1;
  console.log('countTimesRun: ' + countTimesRun);

  var getVrfyChkCode = document.getElementById('divForOnHoldKey').value;

  google.script.run.withFailureHandler(onFailure)
    .withSuccessHandler(rtrnFromVerify)
    .verifyCode(getVrfyChkCode);
};

从技术上讲,JavaScript可能不会同时运行,但代码非常短,而且速度很快,可以连续运行两次。

我可以以某种方式暂停,跟踪或保留计时器。但这似乎有点过分以使其值得。我可能只需要一个按钮,而不是onchange个事件。除非有人有简单的解决方案。我没有使用jQuery。

如果JavaScript的输入字段有onexit事件,那么可能会解决问题。但据我所知,这并不存在。

我认为将onmouseup按钮更改为onclick可能会有所作为,但这并不起作用。

我只是尝试使用&#39; onblur`并且创造了许多非常不受欢迎的情况。当字段失去焦点时代码运行,但随后光标停留在输入字段中。因此,如果我点击新的浏览器选项卡,它会陷入循环。代码将运行,新的浏览器选项卡将无法加载,然后焦点会重新回到同一个地方!

我尝试使用按钮获得焦点,但是当我按Enter键时,光标不会移动到下一个标签元素。如果我单击Tab,按钮将获得焦点,代码将运行。但如果我点击Enter,则没有任何反应。

我已经意识到,我的问题的解决方案是控制当用户点击Enter键时会发生什么。因此,从某种意义上说,当按下Enter键时,这是一个重复的问题。在我发布这篇文章的时候,我没有意识到这一点。

我找到了解决方案。解决方案的关键是他们keyCode检查。这是一个有效的jsFiddle:Run Code on Either Enter Key Press, or Button Click, but not Both

1 个答案:

答案 0 :(得分:1)

听起来你已经陷入困境了。如果我已经正确地理解了这个小提琴你正在描述的内容:http://jsfiddle.net/wR32h/

这是它的核心:

FormManager.prototype.initialize = function () {
    this.elements.input.onkeyup = this.handleInputKeyup.bind(this);
    this.elements.button.onclick = this.handleButtonClick.bind(this);
};

FormManager.prototype.handleInputKeyup = function (evt) {
    // check to see if the key was enter
    if (evt.keyCode !== 13) {
        return;
    }
    if (this.checkState()) {
        this.validateCode();
    } else {
        alert('you need to log in before validation can take place');
    }
};

FormManager.prototype.handleButtonClick = function (evt) {
    if (this.checkState()) {
        this.validateCode();
    } else {
        alert('you need to log in before validation can take place');
    }
};

我们可以通过捕获onkeyup来消除由于模糊和更改事件而导致的任何问题,并且如果密钥未输入则简单地返回。

使用这种方法,您不应该触发多个事件......如果没有更多的代码,很难看出到底出了什么问题,但希望我已经正确理解并覆盖了您的问题。