1

首先是代码:

function searchItems(){
var noParameters = new Boolean(0);
var formFields = $('form')[0].elements;
for(i=0;1<formFields.length;i++){
    if(formFields[i].type == 'text'){
        if(!(formFields[i].value)){
            noParameters = 0;
        }
    }
}
alert(noParameters.valueOf());
}

此函数在表单提交时调用。它的目的是查看是否所有“文本”类型的表单字段都没有值(空输入框)。

当我认为我应该收到警报时,我没有收到警报。布尔变量在声明的时候就被初始化了,所以里面有一个值。if 语句都可以正常工作,我已经反复检查过。我在浏览器中遇到的唯一错误是“类型为空或不是对象”,它位于将表单字段类型与“文本”进行比较的行上。

我尝试了不同的警报语法但没有成功:noParameters.toString(),将 noParameters.valueOf() 分配给一个变量,然后发出警报,'true' 和 'false' 而不是 0 和 1。为什么我的警报没有节目?

4

4 回答 4

4

您有一个无限循环,因为条件1 < formFields.length始终为真。然而,i每次都会增加,直到formFields[i]评估为null并且您得到异常,因为您无法访问type非对象的属性。


对于您的问题:new Boolean(0);为 value 创建一个绝对不必要的 Object 包装器false。不要使用它。在循环内部,您最终分配0给变量。JavaScript 是弱类型的,所以这在语法上是有效的,但仍然很奇怪。

然后,在警报中使用该.valueOf()方法。对于数字,0这将起作用,因为它被隐式转换为Number实例,但也不常见。如果您只使用布尔值,则不需要它。

于 2012-08-01T20:57:49.210 回答
2

你在循环中犯了一个错误:你说 'while' 1

于 2012-08-01T20:56:33.430 回答
2

你可能是说

for(i=0;i<formFields.length;i++){
于 2012-08-01T20:58:55.467 回答
1

其他人已经指出,你在应该有变量1的地方有一个错字,如. 但如果你的目的是:1<formFields.lengthii<formFields.length

“查看是否所有类型为‘文本’的表单字段都没有值(空输入框)。”

然后我会像这样整理你的功能:

function searchItems(){
   var noParameters = true,
       formFields = $('form')[0].elements;
   for(i=0;i<formFields.length;i++){
      if(formFields[i].type == 'text' && formFields[i].value != ""){
         noParameters = false;
         break;
      }
   }
   alert(noParameters);
}

也就是说,只要发现任何非空白文本字段设置noParameters为 false 并跳出循环。正如我在上面的评论中提到的,只使用原始值truefalse,不要使用new Boolean(). 请注意,您不需要嵌套if语句:&&运算符使用短路评估,因此如果左侧条件为真,它将仅测试右侧条件。

或者,由于您的问题被标记为“jquery”,因此以下内容更短(但在运行时效率较低):

function searchItems() {
   var noParameters = $('form input[type="text"]').filter(function(){
                         return this.value != "";
                      }).length === 0;

   alert(noParameters);
}

也就是说,如果具有非空白值的文本类型输入集的长度为 0,那么您没有设置任何参数...

无论哪种方式,在您测试时,.value您可能希望修剪任何空格,以便用户无法通过输入空格来欺骗您的代码:

if(formFields[i].type == 'text' && formFields[i].value.replace(/\s/g,"") != "")
于 2012-08-01T21:25:14.883 回答