6

我有世界上最简单的 javascript 函数:

fnSubmit()
{
  window.print();
  document.formname.submit();
}

由以下人员调用:

<button type="button" id="submit" onclick="fnSubmit()">Submit</button>

一切都很好,出现了打印对话框,但是在打印或取消打印后,我收到以下错误:

“document.formname.submit 不是函数”

我的表单定义如下:(显然我在实际代码中没有使用 formname 但你明白了)

<form name="formname" id="formname" method="post" action="<?=$_SERVER['SCRIPT_NAME']?>">

显然我并不想在这里做任何特别的事情,而且我过去也使用过类似的方法,我到底在这里想念什么?

4

5 回答 5

28

简而言之:将提交按钮的ID更改为不同于“提交”的内容。此外,也不要将名称设置为此值。

现在,一些更深入的见解。一般情况下,这document.formname.submit是一种在调用时将提交表单的方法。但是,在您的示例中,document.formname.submit不再是方法,而是表示按钮的 DOM 节点。

发生这种情况是因为表单的元素可以通过它们的nameid属性作为其 DOM 节点的属性使用。这个措辞有点混乱,所以这里有一个例子:

<form name="example" id="example" action="/">
  <input type="text" name="exampleField" />
  <button type="button" name="submit" onclick="document.example.submit(); return false;">Submit</button>
</form>

在此示例中,document.forms.example.exampleField是一个 DOM 节点,表示名称为“exampleField”的字段。你可以使用 JS 来访问它的属性,例如它的值:document.forms.example.exampleField.value.

然而,在这个例子中,有一个名为“提交”的表单元素,这是提交按钮,可以使用 访问document.forms.example.submit。这会覆盖之前的值,这是允许您提交表单的函数。

编辑:

如果重命名字段对您不利,还有另一种解决方案。在写这篇文章之前不久,我把这个问题留在了网站上,并以简洁的 JavaScript hack 的形式得到了回复:

function hack() {
  var form = document.createElement("form");
  var myForm = document.example;
  form.submit.apply(myForm);
}

请参阅如何使用 JavaScript 可靠地提交 HTML 表单?完整的细节

于 2010-01-04T14:53:16.623 回答
6

鉴于您的表单同时具有 anid和 a已name定义,您可以使用以下任何一种:

使用form标签id

document.getElementById('formname').submit();

使用form标签的name属性:

document.forms['formname'].submit();
于 2009-06-24T00:20:33.033 回答
5

试试这个:

fnSubmit()
{
  window.print();
  document.getElementById("formname").submit();
}
于 2009-06-24T00:07:22.573 回答
0

最可能的罪魁祸首是 IE 混淆了 JavaScript 变量、ID 和名称。在您的来源中搜索与您的表单名称共享的内容。

于 2009-06-24T04:08:41.463 回答
0
  1. 在表单中放置一个输入按钮。
  2. 给 tabindex="-1" 就可以了。
  3. 使用 style="display:none;" 使其不可见。

像这样

<input type="submit" tabindex="-1" style="display:none;" />
于 2012-04-02T08:20:21.017 回答