私は2日前まで正しく動作するJQuery 1.7のある古いWebサイトを持っています。突然、いくつかのボタンが機能しなくなり、クリックした後、コンソールにこの警告が表示されます。
フォームが接続されていないため、フォームの送信がキャンセルされました
クリックの背後にあるコードは次のようなものです。
this.handleExcelExporter = function(href, cols) {
var form = $('<form method="post"><input type="submit" /><input type="hidden" name="layout" /></form>').attr('action', href);
$('input[name="layout"]', form).val(JSON.stringify(cols));
$('input[type="submit"]', form).click();
}
Chrome 56はこの種のコードをもうサポートしていないようです。そうではありませんか?もしそうなら私の質問は:
P.S 最新のFirefoxバージョンでも動作しません(メッセージなし)。 IE 11.0&Edgeでも動作しません。 (どちらもメッセージなし)
クイックアンサー:フォームを本文に追加します。
document.body.appendChild(form);
または、上記のようにjQueryを使用している場合は、次のようにします。$(document.body).append(form);
詳細:HTML規格によると、フォームがブラウジングコンテキスト(ドキュメント)に関連付けられていない場合、フォームの送信は中止されます。
HTML SPEC 4.10.21.3.2を参照
Chrome 56では、この仕様が適用されました。
Chromeコードの差分 @@ -347,9 + 347,16 @@を参照
あなたの質問#1についてP.S。私の意見では、ajaxとは異なり、フォームを送信すると即座にページが移動します。
したがって、「非推奨の警告メッセージ」を表示することはほとんど不可能です。
また、この重大な変更が機能変更リストに含まれていないことは受け入れられないと思います。 Chrome 56の機能 - www.chromestatus.com/features#milestone%3D56
enterキーを押してフォームを送信しようとしたときにReact JSでこのエラーが表示される場合は、フォームを送信しないフォーム内のすべてのボタンにtype="button"
が付いていることを確認してください。
type="submit"
を含むbutton
が1つしかない場合は、Enterキーを押すとフォームが正しく送信されます。
参照先 :
https://dzello.com/blog/2017/02/19/demystifying-enter-key-submission-react-forms-multiple-buttons/https://github.com/facebook/react/issues/2093
フォームが文書内にあることを確認する必要があります。体にフォームを追加することができます。
フォームの初期化にjQueryを使用しているようです。
@KyungHun Jeonの答えを試してみると、jQueryを使っている私にはうまくいきません。
それで、私はjQueryの方法を使って本体にフォームを追加しようとしました:
$(document.body).append(form);
そしてそれはうまくいった!
あるいはevent.preventDefault()をインクルードします。 handleSubmit(event)で{
クリックした人にエラーが表示されたボタンに属性 type = "button" を追加してください。
あなたがReactでこれを見た場合に気をつけるべきことは、それが送信されている間、<form>
はまだDOMでレンダリングしなければならないということです。つまり、これは失敗します
{ this.state.submitting ?
<div>Form is being submitted</div> :
<form onSubmit={()=>this.setState({submitting: true}) ...>
<button ...>
</form>
}
そのため、フォームが送信されると、state.submitting
が設定され、フォームの代わりに "submitting ..."メッセージが表示され、このエラーが発生します。
Formタグを条件の外側に移動することで、必要なときに常にそこにあることが保証されました。
<form onSubmit={...} ...>
{ this.state.submitting ?
<div>Form is being submitted</div> :
<button ...>
}
</form>
私たちの実装でも同じ問題に直面しました。
私たちはjquery.forms.jsを使っていました。これはフォームプラグインで、こちらから入手できます。 http://malsup.com/jquery/form/
上記と同じ回答を使用して貼り付けました
$(document.body).append(form);
そしてそれはうまくいった。ありがとう。
KyungHun Jeonからの回答によりますが、appendChildはDOMノードを想定しているので、jqueryオブジェクトにインデックスを追加してノードを返します。document.body.appendChild(form[0])
また、jquery-x.x.x.jsに単一のパッチを適用して、 "try {rp;} catch(m){}"の1833行目の後に次のコードを追加するだけで解決できます。
if (r instanceof HTMLFormElement &&! r.parentNode) { r.style.display = "none"; document.body.append (r); r [p] (); }
これは、フォームが本体の一部ではない場合に検証して追加します。
これはクロム関連ではないので後世を追加しますが、これはこのフォーム送信エラーを検索するときにGoogleに表示された最初のスレッドでした。
今回の場合は、現在のdiv htmlを送信時に「読み込み中」のアニメーションに置き換える機能を追加しました。フォームが送信される前に発生したため、送信するフォームやデータはありませんでした。
振り返ってみると非常に明らかな誤りですが、誰かがここに来た場合には将来的にそれらをいくらか節約するかもしれません。