2

submitChrome 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>

「Normal Submit」をクリックすると、次の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 フォーム データ セットの構築」:

サブミッターサブミッターのコンテキストでオプションでフォームフォームのフォーム データ セットを構築するアルゴリズムは次のとおりです。特に指定されていない場合、submitterは null です。 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 に答える