【问题标题】:Problem with eval functioneval函数的问题
【发布时间】:2009-09-03 12:29:34
【问题描述】:

您好,我在这段代码中遇到了一个奇怪的错误:

 function validateForm(aform) {
  var s="";

  //check if form has validator arr
  if (aform.validatorArr)  {
    //Iterate over Form elements
    for (var i=0;i<aform.validatorArr.length;i++)  {
      eval("var anelem=document.forms."+aform.name+"."+aform.validatorArr[i][1]);
      var pattern=getPatternByName(aform.validatorArr[i][2]);

      if (aform.validatorArr[i][4]=="radio") {
        var fv="";

        eval("var chkArray=aform."+aform.validatorArr[i][1]+";");

        for (j=0;j<chkArray.length;j++)  {
          if (chkArray[j].checked) {
            fv=chkArray[j].value;
          }
        }

        if (validateValue(fv,pattern)==false)  {
          s+=aform.validatorArr[i][3]+"\n";
        }

      } else {
        if (validateField(anelem,pattern)==false)  {
          s+=aform.validatorArr[i][3]+"\n";
        }
      }
    }

    //Report errors
    if (s!="") {
      alert(s);
      return false;
    }

  }

  return true;
}

缺少] 在元素列表之后 217号线

这是第 217 行:

 eval("var anelem=document.forms."+aform.name+"."+aform.validatorArr[i][1]);

有什么问题吗?

更新

de 函数是这样调用的:submitForm('formbuilder_form'); 与表单名称相同:

    <form name="formbuilder_form" method="POST" action="processform.php" style="margin:0px">

问题已解决

在表单元素中,有人认为最好是这样:

Js 不喜欢这样。

感谢大家的帮助。

【问题讨论】:

  • 顺便说一句,你不需要使用evaldocument.forms[aform.name][aform.validatorArr[i][1]] 应该可以正常工作。

标签: javascript


【解决方案1】:

你为什么这样做? 你应该这样做:

var anelem=document.forms[aform.name][aform.validatorArr[i][1]];

但是从更新后的帖子可以理解,aform 是一个字符串 - 而不是一个对象。所以你应该先得到一个对象。

aform=ocument.forms[aform]

【讨论】:

  • 更好 - document.forms[aform.name].elements[aform.validatorArr[i][1]];
  • 错误表示页面上没有名为 aform.name 的表单。
  • 怎么调用validateForm(aform)
  • 来自表单中的提交按钮
【解决方案2】:

没有必要使用 eval。试试这个:

var anelem = document.forms[aform.name][aform.validatorArr[i][1]];

【讨论】:

  • 这给了我错误:document.forms[aform.name] is undefined Line 218
【解决方案3】:

forms.fish 与所有 JavaScript 对象的forms['fish'] 相同。因此,您可以使用 []s 来获取名称存储在来自对象的字符串中的属性,而不是邪恶的 eval

重要提示:如果您发现自己曾经使用过eval,那么您可能犯了一个错误。

"document.forms."+aform.name

特别可笑,因为您试图获取表单对象的 name 并使用该名称访问表单 — 这与您开始使用的表单对象相同!

但是:

submitForm('formbuilder_form')

无论您使用 eval 还是 [] 都是错误的:您将字符串传递给 submitForm 而不是表单对象。字符串没有name 属性。

将 submitForm 与正常的表单提交过程分开会很麻烦,并且会破坏非 JavaScript UA。如果你写:

<form method="post" action="processform.php" onsubmit="return submitForm(this);">
   ...
</form>

那么函数中的“aform”将是表单对象,您可以像这样简单地访问元素:

var anelem= aform[aform.validatorArr[i][1]];

无需担心document.forms、编写提交按钮或表单名称的脚本。虽然,为了避免表单属性上的名称冲突,这更好:

var anelem= aform.elements[aform.validatorArr[i][1]];

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-17
    • 2013-04-10
    • 1970-01-01
    • 2023-02-22
    • 2011-04-12
    • 1970-01-01
    • 2011-04-28
    • 1970-01-01
    相关资源
    最近更新 更多