JavaScript:全局变量的代码示例“使用严格”解释

时间:2011-08-07 23:39:44

标签: javascript jquery

我正在学习jquery并开始我的第一次尝试,根据我目前所知的(不是很多)构建一个表单验证脚本。

这实际上只是验证脚本的单选按钮部分,但在我走得太远之前,我认为我走上了正确的轨道 - 编码方式。我知道有一些基本问题需要解决。

剧本(jsFiddle):http://jsfiddle.net/pkdsleeper/xNt5n/

问题:

a. How best to remove the global variables using 
b. jsLint recommends "use strict", so I added it, but im not sure what it does. 
c. any good refs?
d. Generally, feel free to rip this code apart (cuz I AM trying to learn) but 
   please explain my errors in noob-speak :)

提前谢谢你 轨枕

2 个答案:

答案 0 :(得分:3)

一个。好吧,你完全摆脱了全局性。但是,正如您的代码现在看起来一样,您可以将整个内容包装在(function(){ ... all your current code in here ... }())中,并将 nothing 留在全局范围内。

湾对于“use strict”,请参阅this question

℃。 typeof questions['c'] === "undefined" ...

d。目前,您的js与标记(html)过于依赖,反之亦然。如果您在表单中添加或删除某些内容,则必须编辑您的js。如果你想对另一个表单使用验证,你将不得不重新开始整个过程​​。

验证者是“不引人注目的javascript”/渐进增强的主要候选者(这里有一些材料:A List Apart& Wikipedia)。基本上,你的标记(html),你的样式(css)和你的“行为”(javascript)都应该是分开的,所以它们可以独立更改。这是你可以尝试的东西:

  1. 在表单中添加类名(例如“验证”)
  2. 设置js以在页面加载时查找form.validate
  3. 对于找到的每个表单,添加一个submit事件处理程序
  4. 当处理程序触发时,您在给定表单中搜索具有您指定的各种其他类名的输入(例如“required”或“phone-number”或其他)。类名称告诉您的代码,应该进行哪些类型的验证。例如,<input type="text" class="required zip-code">意味着a)它是一个邮政编码,b)它是必填字段。
  5. 如果有任何验证错误,请取消提交并以某种方式提醒用户。否则,让提交继续。
  6. 这显然是一个非常粗略的轮廓,但我不会为你编写代码:) 关键是,如果您需要更多的表单或不同的表单或类似的东西,您有一个通用的验证脚本,而您需要做的就是用适当的类名“标记”输入。

    所有这一切:有的jQuery插件可以进行表单验证。自己写一个绝对是一个很好的练习,但是看看已经存在的东西以及它是如何工作的也是一个好主意。不要立即查看代码,而是阅读如何使用这些验证器(例如,他们是否使用类名或其他东西?)并尝试弄清楚它们是如何工作的。

答案 1 :(得分:3)

  

一个。如何最好地使用

删除全局变量

将其包装在匿名函数中,并将其作为提交侦听器分配给表单。

  

湾jsLint建议“使用严格”,所以我添加了它,但我不知道它做了什么。任何好的参考?

不要打扰。对于那些想要嘻哈的人来说,这只是个热门话题。您不能在常规Web上使用严格模式功能,因为太多浏览器不支持它们。您可以将其与其他兼容的ES 3代码一起使用,但它只适用于在测试期间应该找到的错误的调试工具(例如,在没有新的情况下调用构造函数)。

没有c?

  

d。一般情况下,随意撕掉这段代码(因为我正在努力学习),但请在noob-speak中解释我的错误:)

>   $rdoGroup = [], // an empty array which will be used to hold 

您似乎使用$来表示引用jQuery对象的变量,但 $ rdoGroup 只是一个数组。这可能会让人感到困惑。

>     $rdoGroup.push($(this).attr("name"));

$功能非常昂贵,如果你不需要,请不要使用它。标准HTML属性在所有浏览器中都可用作DOM属性,因此:

      $rdoGroup.push(this.name);

效率提高100倍,具体取决于浏览器。

>     for (i = 0; i < $rdoGroup.length; i++) {               
>         if ($rdoGroup[c].toString() !== $(this).attr("name").toString()) {

分配给 $ rdoGroup 的值是字符串,调用它们的 toString 方法是多余的。

如上所述,使用this.name。 name属性是一个字符串,因此不需要 toString

我认为没有jQuery,练习会更容易,这似乎远远超过了帮助。如果您正在尝试学习javascript,我建议您在不使用任何库的情况下学习javascript。

一旦你对使用javascript有了相当的信心,那么你就可以更好地使用库来实现图书馆所擅长的东西,而不是将它用于它不擅长的东西。