2

いくつかの関数を含む PHP ファイルを (wordpress プラグインの一部として) 使用しています。
そのうちの 1 つは html フォームを作成し、もう 1 つは送信されたフォームを処理します。
フォームをビルドするsubmit()関数に、非同期関数を呼び出す関数を追加しました。
フォームが送信される前に終了するために、非同期関数が終了したときのpreventDefault()呼び出しを使用しています。 問題は、afterを呼び出すと、送信されたフォームを処理する PHP 関数で、元の送信とは異なる結果が生じることです。 submit()
submit()preventDefault()

PHPコードは次のとおりです。

if(isset($_POST['submit-reg']))
{
    $output = sreg_process_form($atts); 
    return $output;
}
else
{
    $data = array();
    $form = simplr_build_form($data, $atts);        
    return $form;               
}

使用せずpreventDefault()submit()状態が良好で、フォームが正常に送信された場合。
それらを使用すると、2番目の部分が実行され、フォームが送信される代わりに再構築されます。
問題は次のとおりです。何が原因で false になり、どうすれば修正できますかpreventDefault()? 編集:これがJSです:submit()isset($_POST['submit-reg']))

$('#simplr-reg').submit(function(event)
{           
    event.preventDefault();
    codeAddress(function(success){}); //callback from googlemaps
});

function codeAddress(callback)
{               
    var geocoder = new google.maps.Geocoder();

    geoCodingStarted = true;

    geocoder.geocode( { 'address': address}, function(results, status)
    {
        if (status == google.maps.GeocoderStatus.OK) 
        {   
            var latitude = results[0].geometry.location.lat();
            var longitude = results[0].geometry.location.lng();
            $("input[name=latitude]").val(latitude); 
            $("input[name=longitude]").val(longitude);      

            $('#simplr-reg').submit();          
        }                   
    });         
}  // end of code address
4

2 に答える 2

3

通常の方法でフォームを送信すると、submit-regが設定されます。PreventDefaul()を使用してフォームを非同期で送信すると、フォームは非同期で処理されますが、フォームが送信されることはないため、値が設定されることはありません。別の方法を使用して、フォームが処理または構築されているかどうかを確認する必要があります。おそらく隠されたフィールド。または、ページに動的に設定された別のフラグ。

W3Cから

17.13.3フォームデータの処理

ユーザーがフォームを送信すると(たとえば、送信ボタンをアクティブにすることによって)、ユーザーエージェントは次のようにフォームを処理します。

ステップ1:成功したコントロールを特定する

ステップ2:フォームデータセットを作成する

フォームデータセットは、成功したコントロールから構築されたコントロール名/電流値のペアのシーケンスです

ステップ3:フォームデータセットをエンコードする

次に、FORMデータセットは、FORM要素のenctype属性で指定されたコンテンツタイプに従ってエンコードされます。

ステップ4:エンコードされたフォーム *データセット*を送信します

最後に、エンコードされたデータは、メソッド属性で指定されたプロトコルを使用して、アクション属性で指定された処理エージェントに送信されます。

この仕様は、フォームで使用できるすべての有効な送信方法またはコンテンツタイプを指定しているわけではありません。ただし、HTML 4ユーザーエージェントは、次の場合に確立された規則をサポートする必要があります。

  • メソッドが"get"HTTPURIであり、アクションがHTTP URIの場合、ユーザーエージェントはアクションの値を取り、「?」を追加します。次に、「application/x-www-form-urlencoded」コンテンツタイプを使用してエンコードされたフォームデータセットを追加します。次に、ユーザーエージェントはこのURIへのリンクをトラバースします。このシナリオでは、フォームデータはASCIIコードに制限されています。
  • メソッドが"post"HTTPURIであり、アクションがHTTP URIの場合、ユーザーエージェントは、action属性の値と、enctype属性で指定されたコンテンツタイプに従って作成されたメッセージを使用して、HTTP「post」トランザクションを実行します。アクションまたはメソッドの他の値については、動作は指定されていません。

ユーザーエージェントは、HTTPの「get」および「post」トランザクションからの応答をレンダリングする必要があります。

使用preventDefault()すると、変数「submit-reg」が設定されないため、これが発生して存在しなくなるのを防ぐことができます。

jQueryサイトからの詳細情報

これで、フォームが送信されると、メッセージにアラートが送信されます。これは実際の送信の前に発生するため、イベントオブジェクトで.preventDefault()を呼び出すか、ハンドラーからfalseを返すことで、送信アクションをキャンセルできます。

于 2011-05-19T19:15:36.510 に答える
2

PHPの動作が異なる場合、その入力は異なります。print_r($_POST)両方の状況で行い、何が違うかを確認してください。PHPは、ページでJavascriptを実行したことを気にしませんでした。表示されるのは、いくつかのフォーム値が入ってくることだけです。

異なる値が入ってくると、動作も異なります。したがって、これらの入力を確認して、Javascriptがフォームデータを変更している理由を理解してください。

于 2011-05-19T19:14:14.777 に答える