基本上我想问你什么,当我使用具有参数的函数的事件监听器为什么我不能在函数中使用word时,这是一个例子,因为我无法正确解释它。
var elUsername = document.getElementById('username');
var elMsg = document.getElementById('feedback');
function checkUsername(minLength){
if (elUsername.value.length < minLength){
elMsg.textContent = 'ur username must contain at least 5 chars';
}else {
elMsg = "";
}
}
elUsername.addEventListener('blur', function(){checkUsername(5)}, false);
------------------------------------------------------------
function checkUsername(){
var elMsg = document.getElementById('feedback');
if (this.value.length <5){
elMsg.textContent = 'usename must be 5 chars or more';
}else {
elMsg.textContent='';
}
}
var elUsername = document.getElementById('username');
elUsername.onblur = checkUsername;
所以函数中的第二个例子if语句中没有参数我可以使用它,但在第一个例子中,我无法解释为什么会这样?
答案 0 :(得分:1)
这是因为你在事件监听器中的匿名函数内调用checkUsername
方法,如果你改变了
elUsername.addEventListener('blur', function(){checkUsername(5)}, false);
到
elUsername.addEventListener('blur', checkUsername, false);
并在函数内部进行值检查(如第二个代码示例),它将起作用。
这是因为&#39;这个&#39;调用checkUsername时不会传递,这是可能的,但您必须使用.call()
方法调用它。像这样:
elUsername.addEventListener('blur', function(){checkUsername.call(elUsername, 5)}, false);
现在elUsername
已作为this
传递给checkUsername
函数。
虽然我更愿意直接调用checkUsername
函数并从那里进行计算。
答案 1 :(得分:0)
简化说明:它们可用于对象拥有的任何函数。
通过做:
elUsername.onblur = checkUsername;
您已将功能附加到对象elUsername
。因此this
将引用对象elUsername,但仅限于使用onblur字段调用函数时:elUsername.onblur()
。
如果你想在第一种情况下做同样的事情,你可以使用函数call
来强制参数this
的值:
elUsername.addEventListener('blur', function(){
checkUsername.call(elUsername, 5)
}, false);
请参阅https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Objets_globaux/Function/call