【发布时间】:2018-02-28 21:28:44
【问题描述】:
所以我查看了与我的问题相关的大多数链接,但似乎无法使其正常工作。
在此链接jquery focus back to the same input field on error not working on all browsers 上尝试了解决方法,但它对我不起作用。
我有一个 javascript,它在退出(模糊)时评估输入字段的值。效果很好。问题是当值错误时,我会显示警报,删除字段的内容并将焦点重新设置在错误的字段上。
问题来了。在 Firefox 中,焦点仍将转到我单击的另一个字段(触发上一个字段的 blur())。 在 IE(11.0.9600) 或 Chrome(64.0) 中,警报会显示,但会一直以某种无限循环返回。我必须杀死浏览器。
所以这是我的 HTML 的一个非常截断的版本:
<!DOCTYPE html>
<html class="OUTPUT WEB CHANNEL_WEB simplex" section="ChargesLinesList" dpi="96" scale="1.0">
<input id="dateBilled" class="myDateField" name="dateBilled" value="2018-01-18" type="text">
<input id="dateBilled" class="myDateField" name="dateBilled" type="text">
<input id="dateBilled" class="myDateField" name="dateBilled" type="text">
这是我验证值并显示警报的代码:
$(".myDateField").on("blur", function(event){
var myDateFormat = /^(((((1[26]|2[048])00)|[12]\d([2468][048]|[13579][26]|0[48]))-((((0[13578]|1[02])-(0[1-9]|[12]\d|3[01]))|((0[469]|11)-(0[1-9]|[12]\d|30)))|(02-(0[1-9]|[12]\d))))|((([12]\d([02468][1235679]|[13579][01345789]))|((1[1345789]|2[1235679])00))-((((0[13578]|1[02])-(0[1-9]|[12]\d|3[01]))|((0[469]|11)-(0[1-9]|[12]\d|30)))|(02-(0[1-9]|1\d|2[0-8])))))$/;
if(!myDateFormat.test($(this).val())){
alert('Invalid date or format. Make sure you the format his YYYY-MM-DD and the date is valid');
$(this).val("");
$(this).focus();
}
})
【问题讨论】:
-
你能发布你的实际代码吗?您发布的代码将模糊侦听器应用于所有三个
<input>s,我猜这就是导致浏览器挂起的原因。这个setTimeout(() => { this.focus(); }, 50);对我有用。 -
这将导致一个永无止境的警报循环
-
您正在创建一个潜在的无限循环,因为每次焦点更改时,前一个字段都会收到
blur事件,如果验证失败,您将尝试focus它,导致另一个字段获取blur,但如果它无效,它将尝试focus,依此类推。 -
另请注意,仍然可以按 Tab 键来规避这一点(如下面的答案所示)。我认为这个糟糕的用户体验,宁愿在字段周围放置一个红色边框或其他东西并禁用提交按钮。让人们按照他们想要的顺序填写表格。
-
@ChrisG 按
TAB不会绕过change事件。
标签: javascript input focus alert blur