onkeyup或onkeypress javascript事件问题 - 密码状态更新

时间:2011-12-28 23:38:29

标签: javascript events keyboard-events

编程问题第一(来自w3学校)

下面的编程示例方式(来自W3学校)非常简单,它可以在他们的网站上运行,但我真的很困惑。

onkeypress="return noNumbers(event)"

为什么在函数之前有一个返回?它有什么作用?如果您知道答案 - 您是如何找到这些信息的?我的猜测是,它允许keypressed函数继续处理击键,因为我的事件“中断了”吗?

- 我一直试图看看'事件'是什么。它似乎不是一个关键字。我花了>小时试图找到它是什么。它似乎没有在其代码示例中的任何位置分配。通常在那个地方你会看到'这个'。如果它是一个未分配的变量,它总是会传递事件处理程序吗?困惑...

我想用他们的功能

我想在您输入时设置密码强度检查器。我正在看他们的例子,所以我可以弄清楚如何捕获密钥(跨浏览器和最小的IE7)。我的想法是......

<input type="password" name="pword" maxlength="50" size="50" id="field_pword" onkeyup="PasswordStrength(name, 8, 'relaxed')" onblur="CheckField(name, 8, 1)">

注意: 是的,我知道最好在html之外分配事件处理程序,但我看不到将变量传递给它的方法,除非它是内联的。我是一个新手,所以我可能忽略了一些东西,但这就是为什么我在HTML中这样做。

,是不是我如何传递名字?它确实发送pword函数但我在那里做错了吗?我应该把它变成一个恒定的字符串吗?它按原样工作,但有时只是因为某些东西起作用......并不意味着它是正确的。 :)

onkeyup="PasswordStrength('pword', 8, 'relaxed')" onblur="CheckField('pword', 8, 1)">

我的checkfield函数有效(我在每个字段之后使用它)我最近在PasswordStrength中添加了。我的问题是......我的新功能不是通过事件处理程序,所以如何检查按下了什么键?我可以这样做吗?

onkeyup="PasswordStrength(name, 8, 'relaxed', event)"

或应该阅读......

onkeyup="return PasswordStrength(name, 8, 'relaxed', event)"

如果我无法传递任何“事件”,那么在我的功能中,我可以准确地获得按下的键是什么而没有大量的代码?自从我学习以来,我需要尽可能简单的例子(请)。

使用我的功能我会这样做,但我仍然不知道如何按下按键...

function PasswordStrength(sField, iMinLength, sStrength, e?)
{
var form = document.forms[0];
var gc = form[sField].value;
    // once I have the value I can do checking but it would be nice to have WHAT key
    // was pressed
    // the e? above is where I was thinking of passing the event

W3示例我从...中提取了一些知识

function noNumbers(e)
{
var keynum;
var keychar;
var numcheck;

if(window.event) // IE
{
keynum = e.keyCode;
}
else if(e.which) // Netscape/Firefox/Opera
{
keynum = e.which;
}
keychar = String.fromCharCode(keynum);
numcheck = /\d/;
return !numcheck.test(keychar);
}
</script>

<form>
Type some text (numbers not allowed):
<input type="text" onkeypress="return noNumbers(event)" />
</form>

</body>
</html>

当有人打字时,我打算使用密码字段旁边的innerHTML更改文本,说“Weak”,“Ok”,“Good”,“Perfect”或其他类似密码状态的内容。我喜欢这样做谷歌如何使用该字段左侧的图形,但我不知道如何做到这一点。洛尔。

我的方式可以修复吗?你有更好的方法来做我不知道的事吗?非常感激。等待智慧的注入......

2 个答案:

答案 0 :(得分:2)

仅针对您的第一个编程问题:

  • 您的建议是正确的,要在事件中返回值 允许您根据值内容中断操作。在false内返回onclick 将在点击结束时结束。所以如果<a href="http://test.de" onclick="return false;">linkname</a>不会将你链接到任何东西 JavaScript处于活动状态。
  • event只是在它遇到实际事件之前声明的变量,下面将进一步说明。

你知道JavaScript中的元素eventhandler属性吗? 它们是功能,即

document.createElement('div').onclick = function( event ){
  //do something...
  return true || false;
};

如果为标记分配onclick属性,则只是另一种调整方式来创建此匿名函数。所以

<input onclick="this.value = 'can\'t click me :P Mouse X: ' + event.clientX; return false;" type="text" id="ip" />

的行为就像你创建了一个带有参数event的匿名函数。

window.onload = function(){
  document.getElementById('ip').onclick = function( event ){
    this.value = 'can\'t click me :P Mouse X: ' + event.clientX; return false;
  };
};

除延迟分配外,这种行为完全相同。

this关键字始终是您正在访问其属性函数的所有者对象,或者是您传递给apply / call方法的对象。在这种情况下,它显然是所有者 - DOM元素。因此this.valueinput的值。

传递给函数的event只是一个对象,包含有关当前浏览器状态和杂项的一些有用信息。它具有略微不同的属性,在不同的浏览器中填充不同的值,但主要功能在任何地方都是相同的。

  • 如上所述,无论你是写下你做了什么还是这样,都没有区别:
window.onload = function(){
  var yourElement = document.getElementsByTagName('pword')[0];
  yourElement.onkeyup = function( event ){
    PasswordStrength(this.name, 8, 'relaxed')
  };
};
  • 仅仅使用name并不是错误 ..每当您访问所有者对象的属性时,您都可以省略this关键字。因此,这与写作
  • 的冲突完全相同
<script type="text/javascript">//<![CDATA[
 onload = function(){ alert('hello!') };
//]]></script>

而不是window.onloadthis.onload或甚至this.window.onload(这些都在理论上有效,因为包含对象的所有内容都有一个名为window的属性,它引用了自身)。你可以说这是一个惯例问题。但是,由于总是通过this关键字访问自己的属性(除window除外,你应该通过其属性window访问)的约定已得到强烈建立和支持,因此您可能应该编写{{ 1}}。

  • 这取决于您是否希望最终中断事件并且不让用户完成他的this.name。上面解释过。
  • 为什么你不能传递keyup对象?只需将其视为正常变量即可。
  • 结合上述信息和问题中的示例,您应该能够了解按下哪个键。

答案 1 :(得分:1)

1)“return”一词使得如果函数返回false,它将被传递回事件并停止浏览器处理击键(并且如果是那样,则出现在输入字段中)事件是什么)。

2)event是Event对象,其中包含有关事件的信息,例如按下的键,触发事件的位置等。

3)是的,你传递name的方式很糟糕,因为你没有传递它。请改用this.name

4)在这种情况下,您不需要return因为您没有尝试停止将键击添加到文本框中。同样,您无需传递event,因为您可以通过this.value来获取文本框的内容。

5)您只需传递this而不是this.namethis.value或其他任何值。然后,在函数中,从单个参数中获取属性。

6)一旦用this.value传递整个值,就可以对其进行测试。绝对没有必要知道按下了什么键,特别是像Ctrl+V之类的东西会让你完全搞砸。

7)您可以拥有<div>并更改其宽度和/或背景颜色,以制作一种强度条指示器。