意外的Javascript DOM事件侦听器问题
Unexpected Javascript DOM event listener issues
我创建了一个函数来检查两个密码字段,但当我修复输入时,只有一个字段获得成功类,另一个没有;为了使两个字段都具有success类,您必须单击它以进行更新。我可以使用什么DOM事件来立即更新它?
window.onload = addListeners;
function addListeners() {
if(window.addEventListener) {
_('pass1').addEventListener("blur", checkPassword, false);
_('pass2').addEventListener("blur", checkPassword, false);
} else if (window.attachEvent) {
_('pass1').attachEvent("onblur", checkPassword);
_('pass2').attachEvent("onblur", checkPassword);
}
}
// Index pages field checker
function checkPassword() {
var p1Val = _("pass1").value;
var p2Val = _("pass2").value;
var p1 = _("pass1");
var p2 = _("pass2");
if(p1Val != p2Val) {
this.className = this.className.replace( /(?:^|'s)suSuccess(?!'S)/g , '' );
this.className += " suError";
_("pass2Check").innerHTML = "Your password fields do not match";
} else if (p1Val == "" && p2Val == ""){
p1.className = p1.className.replace( /(?:^|'s)suSuccess(?!'S)/g , '' );
p2.className = p2.className.replace( /(?:^|'s)suSuccess(?!'S)/g , '' );
p1.className += " suError";
p2.className += " suError";
_("pass2Check").innerHTML = "Fill in both password fields";
} else {
this.className = this.className.replace( /(?:^|'s)suError(?!'S)/g , '' );
this.className += " suSuccess";
_("pass2Check").innerHTML = "Your password fields match";
}
}
问题是,当验证成功以及值不匹配时,您只对触发事件的元素this
执行操作,而其他输入保持原样,直到您在处理程序上触发它。
更改您的功能如下:
function checkPassword() {
var p1 = _("pass1");
var p2 = _("pass2");
// Here you can avoid an additional DOM traversal by storing the reference first
var p1Val = p1.value;
var p2Val = p2.value;
// You can combine the invalid conditions using || operator
if(p1Val != p2Val || p1Val == "" && p2Val == ""){
p1.className = p1.className.replace( /(?:^|'s)suSuccess(?!'S)/g , '' );
p2.className = p2.className.replace( /(?:^|'s)suSuccess(?!'S)/g , '' );
p1.className += " suError";
p2.className += " suError";
_("pass2Check").innerHTML = "Fill in both password fields";
} else {
p1.className = p1.className.replace( /(?:^|'s)suError(?!'S)/g , '' );
p2.className = p2.className.replace( /(?:^|'s)suError(?!'S)/g , '' );
p1.className += " suSuccess";
p2.className += " suSuccess";
_("pass2Check").innerHTML = "Your password fields match";
}
}
补充说明:如果旧的浏览器支持不是问题,则可以使用classList-DOM API的add()
和remove()
方法来添加和删除css类,而不是regex。
相关文章:
- Highslide(iframe的侦听器)
- 如何在for循环中添加事件侦听器
- 选项卡侦听器未被来自后台脚本的消息激活
- 未命中服务器发送的事件侦听器
- 如何覆盖原型中的事件侦听器
- 加载侦听器上的函数触发得太早
- 在侦听器内部调用函数时出现问题(onClick)
- 设置 ctrl + 键按下事件侦听器时出现问题(未检测到)
- Google 跟踪代码管理器 (GTM) 新事件侦听器代码出现问题
- 事件侦听器的有趣内存问题
- 我的代码中的 request.end 侦听器有什么问题
- jQuery 注册 2 个键事件侦听器时遇到问题
- 仅在侦听器函数中加载脚本/模块会导致问题吗?
- 通过 jquery 侦听器将 html 表单链接到 javascript 函数时遇到问题
- Jquery,链接/按钮的侦听器和文档就绪问题
- jquery 中的 id 侦听器问题
- 使用模板事件侦听器删除 Meteor.js 集合时出现问题
- 意外的Javascript DOM事件侦听器问题
- Javascript:循环遍历数组以创建侦听器,通过引用和值调用发出问题
- 为已发出的事件创建侦听器时的闭包问题