【问题标题】:javascript code freezes the browser and the code only works in firefoxjavascript代码冻结浏览器,该代码仅适用于firefox
【发布时间】:2011-10-02 01:29:18
【问题描述】:

我有一个表单,提交前应填写所有文本框。我的表格是这样的

<form name="form" method="post" action="url" onsubmit="return checkEmpty(this)" >
<div class="field">
<label>field1</label><input type="text" name="f1" />
</div>
<div class="field">
<label>field2</label><input type="text" name="f2" />
</div>
..
....
......
input type="submit" name="Submit" value="submit" />
</form>

我在这里所做的是,当提交表单时,我检查是否有任何文本框为空,如果有,我创建一个 dom 元素 h3 并将其附加到相应字段的 div 和如果文本框不为空,我检查是否有任何文本框附加到相应的字段,如果找到,我将其删除。这是我的javascript代码

function checkEmpty(form) {
   var textboxes=form.elements;
   for(var i=0;i<textboxes.length;i++)
   {
      if((textboxes[i].type=="text" || textboxes[i].type=="password") && textboxes[i].textLength==0)   //text box is empty                     
      {
         var msg=document.createElement('h3');
         msg.innerHTML="u cant leave this field blank";
         textboxes[i].parentNode.appendChild(msg);
         return false;
      }
      else                      //text box is not empty
      {
         var rem_msg=textboxes[i].parentNode.getElementsByTagName('h3');
         for(var j=0;j<rem_msg.length;j++)
            textboxes[i].parentNode.removeChild(rem_msg[j]);
      }
   }
}

现在当我提交表单时浏览器冻结。 *我的代码也不能在 ggogle chrome 中工作,只能在 firefox 中工作* 在我没有删除元素之前,代码工作正常,但删除元素是必要的,因为说用户在第一次尝试时没有在文本框 1 中输入任何值,所以会添加一个 h3 元素,但现在他在第一个文本框中输入了一些文本但将第二个文本框留空,因此第一个文本框的 h3 元素应该消失。


因为代码下面的答案 不再冻结浏览器,而是 我仍然只能添加h3 元素到 dom 但不能删除 他们。代码也可以在 Firefox 中使用 但不在谷歌浏览器中。

【问题讨论】:

  • 你为什么不用jQuery?这比你需要的代码多得多。
  • 贾斯汀摩根:我知道 dis 是一种奇怪的方法,但我想知道为什么浏览器会崩溃?我能理解的唯一原因是 js 执行不能像无限循环一样停止,但我在代码中没有看到任何类似的东西
  • 我认为@Martin 有正确的答案,但我也注意到您的else 块中没有return 语句。这是否会引发错误或导致冻结可能取决于浏览器,但这可能是一个问题。当checkEmpty(this) 可能没有返回值时,您正在调用return checkEmpty(this)
  • @Justin Morgan:也许你是对的。该代码在谷歌浏览器中不起作用。它只是在 Firefox 中起作用。但是如果将return 放入else 块中,那么即使单个文本框不是空的,也会提交表单

标签: javascript firefox dom google-chrome


【解决方案1】:

我认为可能是格式错误的for:

for(var i=0;i<rem_msg.length;;i++)

你有一个额外的;,所以我认为i++ 没有运行。

【讨论】:

  • 不,不是因为那个。我纠正了它,但仍然是同样的问题
【解决方案2】:

问题是您在两个不同的循环中使用变量i。当内部循环结束时,它总是将i 设置为rem_msg.length,这将使外部循环永远不会达到其退出条件,因此您最终会出现无限循环。

要解决您的问题,您只需将第二个 i 重命名为例如j,你很高兴。

【讨论】:

  • 谢谢你的工作,但另一个问题。一旦我在文本框中输入一些文本并提交,h3 元素就不会被删除,而且代码在谷歌浏览器中不起作用,甚至appendElement 也不起作用。它只是在 Firefox 中工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-28
  • 2017-03-28
相关资源
最近更新 更多