1

サブスクライバーが受信したいニュースレターを選択できるフォームがあり、AJAX フォームが結果を Exact Target に送信し、サブスクライバーが追加したいすべてのリストにサブスクライバーを追加します。

これを処理するための PHP foreach ループのセットアップがあります。

<?php foreach ($listNumbers as $item): ?>
            var xmlData = 'Ths is the ET API call';
            $.post('ET url for API call'+xmlData);      
        <?php endforeach; ?>    

ループの実行後、ユーザーはこのようなサンキュー ページに送られます。

$(document).ready(function() {
location.href = "thank you url";
});

すべてが機能します..ほとんどの場合。API 呼び出しを送信するのに十分な時間をループに与えたいので、ドキュメント準備完了を使用しています。$.post 関数がいつ完了したかを検出する方法はありますか? 成功したら?ユーザーをサンキューページに送りますか?

コードが実行される前に、location href によって一部のユーザーがサンキュー ページに送られていることがわかりました。

ありがとう、マイケル

4

3 に答える 3

2

http://api.jquery.com/jQuery.post/

完了したことを知らせるコールバックがあります

jQuery.post( url [, data] [, success(data, textStatus, jqXHR)] [, dataType] )
  • url - リクエストの送信先 URL を含む文字列。
  • data - リクエストと共にサーバーに送信されるマップまたは文字列。
  • success(data, textStatus, jqXHR) - リクエストが成功した場合に実行されるコールバック関数。
  • dataType - サーバーから期待されるデータのタイプ。デフォルト: Intelligent Guess (xml、json、script、text、html)。

サンプル スクリプトでは、すべてのリクエストが終了したことを追跡する必要がありますが、可能であれば、1 回だけ呼び出すことができる新しいサーバー側呼び出しを作成することを強くお勧めします。

var xhrCount = <?= count($listNumbers) ?>;
<?php foreach ($listNumbers as $item): ?>
   var xmlData = 'Ths is the ET API call';
   $.post('ET url for API call'+xmlData, null, function() {
       xhrCount--;
       if (xhrCount === 0) {
           location.href = 'myurl'
       }
   });      
<?php endforeach; ?>  

よくわかりませんが、何が問題なのかはわかりませんが、count()自分で数えることはできます。

var xhrCount = 0;
<?php foreach ($listNumbers as $item): ?>
   var xmlData = 'Ths is the ET API call';
   xhrCount++;
   $.post('ET url for API call'+xmlData, null, function() {
       xhrCount--;
       if (xhrCount === 0) {
           location.href = 'myurl'
       }
   });      
<?php endforeach; ?>  
于 2012-04-05T15:41:16.137 に答える
1
$(document).ready(function() { }); // this is NOT the callback of the AJAX request

同じページ (既に準備ができている) にとどまっているため、すぐに呼び出されるため、上記は機能しません。AJAX 呼び出しは非同期であるため、要求が完了するまで待機しません。

呼び出しを非同期にするか、ajax リクエストの成功コールバックを使用することができます。

より明確にするために:

$(document).ready(function() {});DOM の準備ができたときに発生します (つまり、ページが読み込まれ、他のもの (イベント リスナーのアタッチなど) の準備ができたようなもの) です。あなたがしたいのは、次の.post()ようなコールバックを使用することです:

$.post('ajax/test.html', function(data) {
  // this only gets called when the ajax request is finished
});

しかし、本当の問題は残っています。なぜ PHP ループを使用して AJAX リクエストを作成しているのかということです。それはまったく意味がありません。まだ PHP を使用してページを作成しているので、AJAX を使用して取得したいコンテンツも追加してみませんか?

于 2012-04-05T15:41:48.923 に答える
0

あなたはこれを試すことができます var jqxhr = $.post('ET url for API call'+xmlData);

ループの後:

jqxhr.complete(function(){
  location.href = "thank you url";
});

ドキュメントでjqXHRステータス関数について読むことができます。

ただし、アプローチ全体を変更したい場合があります。おそらく、PHP は、ページがループできる 1 つの JavaScript 配列を出力する必要があります。何を達成しようとしていますか?

于 2012-04-05T15:45:28.830 に答える