2

submit如果通过 Chrome v19 中的 javascript 提交,我的按钮的值将丢失。它适用于 IE8、IE9 和 FF12。我有以下显示问题的页面:

<html>
<head>
<script type="text/javascript">
    function submitorder()
    {
        document.openord.TYPE.value='Submitted using javascript';
        document.openord.submit();
    }
</script>
</head>

<body>
<pre>
The contents of $_REQUEST are:
<?php var_dump($_REQUEST); ?>
</pre>

<form method="post" action="showParms.php" name="openord">
    <input type="hidden" name="TYPE" value="Submitted the regular ol' way">
    <input type="hidden" name="NAME" value="Frederick Q. Larson">
    <input type="submit" name="TASK" value="Submit with Javascript" onclick='submitorder();'>
    <input type="submit" name="TASK" value="Normal Submit">
</form>
</body>
</html>

单击“正常提交”,您将看到TASK如下值:

The contents of $_REQUEST are:
array(3) {
  ["TYPE"]=>
  string(29) "Submitted the regular ol' way"
  ["NAME"]=>
  string(19) "Frederick Q. Larson"
  ["TASK"]=>
  string(13) "Normal Submit"
}

“使用 Javascript 提交”按钮并非如此:

The contents of $_REQUEST are:
array(2) {
  ["TYPE"]=>
  string(26) "Submitted using javascript"
  ["NAME"]=>
  string(19) "Frederick Q. Larson"
}

在 IE 和 FF 中,单击“使用 Javascript 提交”时,您会看到:

The contents of $_REQUEST are:
array(3) {
  ["TYPE"]=>
  string(26) "Submitted using javascript"
  ["NAME"]=>
  string(19) "Frederick Q. Larson"
  ["TASK"]=>
  string(22) "Submit with Javascript"
}

知道为什么 Chrome 会遇到这个问题吗?

4

2 回答 2

3

如果您只想提交带有通过 JavaScript 更改的参数的表单,那么

function submitorder() {
    document.openord.TYPE.value='Submitted using javascript';
}

就足够了,因为当用户点击提交按钮时,表单会自动提交。

“正确”的行为

根据规范,“4.10.22.4 构造表单数据集”部分:

可选地在提交者提交者的上下文中为表单表单构造表单数据集的算法如下。如果没有另外指定,则提交者为空。 3.循环:对于控件中的每个元素字段,按树形顺序运行以下子步骤:     1. 如果满足以下任一条件,则跳过此元素的这些子步骤:     • 字段元素是按钮,但不是提交者。
. . .


    . . .

提交表单时使用此算法(规范参考)。
显然,由于没有点击按钮,提交者是空的,因此没有提交元素。

在 Firefox 中,启动提交表单的功能的按钮似乎被标记为submitter。在没有(表单提交)按钮的情况下调用函数会显示与 Chrome 中相同的行为:http: //jsfiddle.net/3fwcr/1/

event.preventDefault();添加到按钮的click事件中时,表单也会像在 Chrome 中一样提交:http: //jsfiddle.net/3fwcr/2/
显然,Firefox的默认提交仍然被触发,即使表单已经被提交(似乎违反规范:“如果表单已经被提交(..),那么中止这些步骤”(“这些步骤”=表单提交))。

于 2012-06-18T21:33:24.127 回答
0

我认为这不是问题/错误,只是因为您使用 JavaScript 进行提交。您可以添加一些这样的代码:

var hiddenVal = document.createChild("input");
hiddenVal.setProperty("name", "TASK");
hiddenVal.setProperty("type", "hidden");
hiddenVal.setProperty("value", Submit with JavaScript");
document.openord.appendChild(hiddenVal);
于 2012-06-18T21:02:25.900 回答