2012-01-20 13 views
0

この同じ問題が他のところで議論されていますが、 :

$(#form)内に$ .postを使用しています.AJAX経由でフォームを送信すると、ユーザーはページを離れません。これはIEでうまく動作しますが、FFとChromeの両方で、クエリー文字列のフォームフィールド名と値を持つ現在のページがリフレッシュされます。これは、フォームにaction = ""が指定されていないためです。で指定された関数の名前を変更すると、IEが$ .postを正しく実行する関数を見つけられず、フォームフィールドの名前と値で現在のページも更新されるため、IEに問題を複製させることができますクエーストリング。

フォームは動的に作成され、一度に複数のフォームを表示できるように、フォーム名に乱数を入れる必要があります。私はそれが問題の一部だとは思わないが、フォーム名は常にすべてのブラウザのalert()に正しく表示されるためです。

function add_new_product(){ 

    var formName = "frm_add_new_product_" + window.random_number_for_IDs; 

    alert('this alert is BEFORE the (#formname).submit'); 

    $("#" + formName).submit(function(event) { 
     alert('this alert is inside the (#formname).submit BEFORE .preventDefault'); 
     event.preventDefault(); 
     alert('this alert is inside the (#formname).submit AFTER .preventDefault but BEFORE $.post'); 
     $.post("add_new_product.php?SiteID=<?php echo $_GET['SiteID']; ?>", $("#" + formName).serialize(), function(data){$("#DIV_new_product_name_" + window.random_number_for_IDs).html(data);}); 
     alert('this alert is inside the (#formname).submit AFTER $.post'); 
    }); 

    alert('this alert is AFTER the (#formname).submit'); 

    $("#DIV_new_product_form_" + window.random_number_for_IDs).fadeOut(100, function(){$("#DIV_new_product_name_" + window.random_number_for_IDs).fadeIn(100);}); 

} 

IEでは、すべての警告()は上記の順序ではなく表示されます。 $(#form).submitの前と後のものを最初に表示し、次にその中のものを表示します。 FFとChromeは$(#form).submitの前後にアラート()だけを表示しますが、内部にはアラートは表示されません。固定

+0

「<?php echo $ _GET ['SiteID'];」とは何ですか? ?> 'クライアントに表示されますか?それはあなたが期待するものですか?また、スクリプトは 'function(data){}'の中のコードを待つだけなので、最後の "AFTER"アラートは常にそれらの前に表示されます。データがクライアントに返された後に実行する必要があるものは、その 'function(data){}'の中に入っている必要があります – Niklas

+0

Chromeの優れた組み込みのイントロスペクションツール、特にJavaScriptデバッガを試しましたか? Ctrl + Shift + iを押しながらスクリプトをクリックし、ドロップダウンからスクリプトを取得し、デバッグする行番号をクリックします。 – cheeken

+0

Niklas:Firebugは、PHPのSiteIDが正しく表示されることを示しています。謎は、なぜ、サブミットが全く機能していないように見えるかということです。その場合は、指定したDIVにadd_new_product.phpのターゲットページのエラーが表示されるようにしてください。 –

答えて

0

を私はから、フォームのonSubmit検証を変えた "add_new_product();" "javascript:add_new_product(); falseを返します。" preventDefaultはフォーム送信の「デフォルト」アクションを「防止」していないためです。そのため、フォームタグに指定された "アクション"がなく、preventDefaultが何も起こっていなかった理由があったため、クエリー文字列のフィールド名と値でページを更新するだけです。私はまた、 "戻りfalseを入れてみました" preventDefaultをコメントアウトした後に関数内で呼び出されますが、タグのonSubmitにあるときにのみ機能します。

次に、add_new_product()スクリプトの各行をコメントアウトしました。ただし、動的フォーム名、$ .post行、およびそれらをフェードアウトして最後の行を連結する最初の行は、ajax応答.html(データ)経由でデータを取り込みます。

3つのブラウザすべてで動作します。

関連する問題