2011-12-06 7 views
20

私は動的にフォームを生成しています。簡単にするために、それは電子メール/パスワードのあるログインフォームと仮定します。フォームは送信されますが、実際のログインを処理するAJAXリクエストが送信され、送信イベントはキャンセルされます(e.preventDefault())。ダイナミックに生成されたフォーム(ajaxで処理される)のブラウザのネイティブオートコンプリート

のページに移動してのページに移動しますが、ブラウザの自動補完の検出がキャンセルされるようです。これは実際にはない - <フォームを提出しなければならない

  • name

    • あなたの入力フィールドtype="text"を持っている必要があります。

      私はネイティブのオートコンプリートが機能するためにあなたはいくつかの要件を気力する必要があると思います私の場合起こっています

    私の分析は正しいですか?この場合、自動補完を行う方法はありますか?ファン達を追い払うために


    :私はjQueryのを必要とするすべてのソリューションを探していないよ[あなたの枠組みを挿入]、私はネイティブブラウザのオートコンプリート機能を使用したいです。私は自動完成させたい単語のリストを持っていません。

  • 答えて

    11

    DMosesソリューションを大幅に私の解決策に影響を与えたが、それは大きな違いは、私は私の独自のソリューションを作るために良いアイデアだと思った、恵みはいえDMosesに行くがあります:P

    DMoses液の移動(またはコピーが)フォームをiframeに送信し、それを送信します。あなたがこれをやりたい理由は、あなたの '親'がリロードしないからです。より簡単な解決策があります:は、iframeに送信するフォームを持っています。これはまったく同じで、ノードをコピーする必要はありません。

    この手順も完全に再現可能です。唯一の欠点は、オートコンプリートエントリが正確に追加されたときを制御しないことです。 有効なのエントリだけを追加したいかもしれませんが、少なくともこの場合は、ajaxが含まれていないと正常なフォームの動作を完全に模倣しています。オートコンプリートに追加するものを制御するには、DMosesのソリューションを使用して、フォームをコピーしてiframeで送信します。

    は私にとっては、これで十分です:

    <form onsubmit="return ajaxit();" autocomplete="on" target="the_iframe"> 
        <input id="foo" name="foo"/> 
        <input type="submit" /> 
    </form> 
    <iframe id="the_iframe" name="the_iframe" src="javascript:false"></iframe> <!-- you'll want this hidden --> 
    

    最良の部分:余分なJavaScriptを有効にして作業を行う必要はありません!(フォームの一意のID /名前を生成する以外は、それほど簡単ではありません)。

    jsFiddle:http://jsfiddle.net/KzF6s/13/

    +0

    賞金ありがとう!値がまだほとんどのブラウザで追加されている場合は、HTTP 500を返してもらえませんか?重要であれば試してみる価値があるかもしれません。 –

    +1

    私はそれが重要だとは思わない。私が投稿するページは、とにかく実際のページではない( 'javascript:false')、これを動作させるために常に' 500 'を返すアイドルページを持っているのはiffyです。 – Halcyon

    +0

    現在のブラウザでは、これを動作させることができません:http://jsfiddle.net/KzF6s/ – smhg

    13

    [OK]を私はこれを行うための複雑な方法を見つけました:ここ

    はjavascriptのである:ここでは

    function ajaxit() { 
        var iFrameWindow = document.getElementById("myframe").contentWindow; 
        iFrameWindow.document.body.appendChild(document.getElementById("myform").cloneNode(true)); 
        var frameForm = iFrameWindow.document.getElementById("myform"); 
        frameForm.onsubmit = null; 
        frameForm.submit(); 
        return false; 
    } 
    

    はhtmlです:[送信]をクリック

    <form id="myform" onsubmit="return ajaxit();" autocomplete="on"> 
        <input id="foo" name="foo"/> 
        <input type="submit" /> 
    </form> 
    <iframe id="myframe" src=""></iframe> <!-- you'll want this hidden --> 
    

    は(ajaxitが実行されます)方法。このメソッドはiframeに同じフォームを作成し、それをサーバーに送信します。あなたはサーバーリクエストを行うためにその提出物をピギーバックすることも、別のajaxリクエストを行い、iframeを無視することもできます。

    私はそれが醜いことを知っていますが、それは動作します。

    編集:ここにはjsbinがあります。

    +0

    賢明、私はそれが好きです。なぜ私はそれについて考えなかったのだろうか:P私は 'iframe'がうまくいかないと思っていたが、明らかにそうだった! – Halcyon

    +0

    実際には2つの異なる状況があります:AJAXで提出されたフォームと動的に生成されたフォーム(おそらくAJAXで提出されたもの)です。 * jsbin *の例は、最初のものだけを扱います。 – smhg

    +0

    何が起こっているのか詳しく教えてもらえますか?直接送信するのではなく、iframe内でフォームを送信することで何が得られますか?私たちが解決しようとしている問題は、通常のフォーム送信メカニズムの代わりにAJAXを使用してフォームを送信する方法だと思いました。私の場合、私はJSONを提出しなければなりません。サーバーは通常のフォームエンコーディング(application/x-www-form-urlencodedなど)を受け入れません。 – Gili

    0

    他の回答の回避策についてのコメントでフィドルに少しいじりの後、私はブラウザはこれを正しく処理するのを待つことができます誰のために、このリストを作ることにしました。

    ので、要約として、これらのブラウザのバージョンでは、JavaScriptで生成されたフォームのオートコンプリート値をサポートしています。

    • FireFoxの25
    • クロム33(現在のバージョンは31ですので、すぐに来て)
    • Internet Explorer 11(reference
    関連する問題