1

私は mailchimp API を統合していますが、データの送信中に読み込み中のアニメーターを表示することで、もう少しユーザーフレンドリーにしたかっただけです。アニメーターを表示して成功すると、アニメーションで div が非表示になります。

ただし、問題は、スクリプトが電子メールが正しくないなどのエラーを返す場合、ローダーも非表示にする必要があることです。これは、これまでに試したことに基づいていません。

次のスクリプトで、アニメーターの hide() 関数をどこに挿入する必要があるかについてのアイデアはありますか?

<script type="text/javascript">
var fnames = new Array();var ftypes = new Array();fnames[0]='EMAIL';ftypes[0]='email';fnames[1]='FNAME';ftypes[1]='text';fnames[2]='LNAME';ftypes[2]='text';var err_style = '';
try{
    err_style = mc_custom_error_style;
} catch(e){
    err_style = 'margin: 1em 0 0 0; padding: 1em 0.5em 0.5em 0.5em; background: ERROR_BGCOLOR none repeat scroll 0% 0%; font-weight: bold; float: left; z-index: 1; width: 80%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; color: ERROR_COLOR;';
}
$(document).ready( function($) {
  var options = { errorClass: 'mce_inline_error', errorElement: 'div', errorStyle: err_style, onkeyup: function(){}, onfocusout:function(){}, onblur:function(){}  };
  var mce_validator = $("#mc-embedded-subscribe-form").validate(options);
  options = { url: 'http://somethingorother.us2.list-manage.com/subscribe/post-json?u=a9cf617dfdf4f2eaoeuaoeub75b&id=4b3aoeu1e2a0&c=?', type: 'GET', dataType: 'json', contentType: "application/json; charset=utf-8",
                beforeSubmit: function(){
                    $('#mc_embed_signup .mc-field-group p').hide();
                    $('#subscribe_loading').fadeIn();
                    $('#mce_tmp_error_msg').remove();
                    $('.datefield','#mc_embed_signup').each(
                        function(){
                            var txt = 'filled';
                            var fields = new Array();
                            var i = 0;
                            $(':text', this).each(
                                function(){
                                    fields[i] = this;
                                    i++;
                                });
                            $(':hidden', this).each(
                                function(){
                                  if ( fields[0].value=='MM' && fields[1].value=='DD' && fields[2].value=='YYYY' ){
                                    this.value = '';
                              } else if ( fields[0].value=='' && fields[1].value=='' && fields[2].value=='' ){
                                    this.value = '';
                  } else {
                                      this.value = fields[0].value+'/'+fields[1].value+'/'+fields[2].value;
                                  }
                                });
                        });
                    return mce_validator.form();
                }, 
                success: mce_success_cb
            };
  $('#mc-embedded-subscribe-form').ajaxForm(options);

});
function mce_success_cb(resp){
    $('#subscribe_loading').hide();
    $('#mce-success-response').hide();
    $('#mce-error-response').hide();
    if (resp.result=="success"){
        $('#mce-'+resp.result+'-response').show();
        $('#mce-'+resp.result+'-response').html(resp.msg);
        $('#mc-embedded-subscribe-form').each(function(){
            this.reset();
      });
    } else {
        var index = -1;
        var msg;
        try {
            var parts = resp.msg.split(' - ',2);
            if (parts[1]==undefined){
                msg = resp.msg;
            } else {
                i = parseInt(parts[0]);
                if (i.toString() == parts[0]){
                    index = parts[0];
                    msg = parts[1];
                } else {
                    index = -1;
                    msg = resp.msg;
                }
            }
        } catch(e){
            index = -1;
            msg = resp.msg;
        }
        try{
            if (index== -1){
                $('#mce-'+resp.result+'-response').show();
                $('#mce-'+resp.result+'-response').html(msg);            
            } else {
                err_id = 'mce_tmp_error_msg';
                html = '<div id="'+err_id+'" style="'+err_style+'"> '+msg+'</div>';

                var input_id = '#mc_embed_signup';
                var f = $(input_id);
                if (ftypes[index]=='address'){
                    input_id = '#mce-'+fnames[index]+'-addr1';
                    f = $(input_id).parent().parent().get(0);
                } else if (ftypes[index]=='date'){
                    input_id = '#mce-'+fnames[index]+'-month';
                    f = $(input_id).parent().parent().get(0);
                } else {
                    input_id = '#mce-'+fnames[index];
                    f = $().parent(input_id).get(0);
                }
                if (f){
                    $(f).append(html);
                    $(input_id).focus();
                } else {
                    $('#mce-'+resp.result+'-response').show();
                    $('#mce-'+resp.result+'-response').html(msg);
                }
            }
        } catch(e){
            $('#mce-'+resp.result+'-response').show();
            $('#mce-'+resp.result+'-response').html(msg);
        }
    }
}
</script>
4

2 に答える 2

1

ajaxForm プラグインは、具体的には、によってサポートされているオプションを利用できることを示しています。.ajax()

Options オブジェクトは、値を jQuery の $.ajax メソッドに渡すためにも使用できることに注意してください。$.ajax でサポートされているオプションに精通している場合は、ajaxForm および ajaxSubmit に渡される Options オブジェクトでそれらを使用できます。

したがって、 で実行する関数を作成するのと同じ方法で、 で実行する関数を作成successできますerror。次の jQuery.ajax()ページを見てください。

error(XMLHttpRequest, textStatus, errorThrown):

リクエストが失敗した場合に呼び出される関数。この関数には 3 つの引数が渡されます。XMLHttpRequest オブジェクト、発生したエラーの種類を説明する文字列、およびオプションの例外オブジェクト (発生した場合) です。2 番目の引数 (null 以外) に指定できる値は、"timeout"、"error"、"notmodified"、および "parsererror" です。これはAjax イベントです。


あなたの場合、成功時に使用するのと同じ方法でエラー時に画像を非表示にするだけです...次のようなもの:

// ... code
options = {
    // ... code
    success: function(responseXML)
             { mce_success_cb(responseXML); }, // <== mce_... takes an argument
    error:   function() { $('#subscribe_loading').hide(); 
                          // any other stuff to do on error;
                         }
};
// ... code

無名関数の引数(XMLHttpRequest, textStatus, errorThrown)を使用して、エラーに関する情報を取得し、保存および/または表示できます。


成功した AJAX 応答があり、応答内にエラーがある場合を処理したい場合は、変更しmce_success_cb()ます...この種のエラーを処理するように既に設定されているように見えるので、追加するだけです。必要な追加機能:

// ...
function mce_success_cb(resp){
    $('#subscribe_loading').hide();
    $('#mce-success-response').hide();
    $('#mce-error-response').hide();
    if (resp.result=="success"){
        // ...
        // This stuff happens if resp.result == "success"
        // ...
    } else {
        // Add in the error handling functionality you want here
        var index = -1;
        var msg;
        //...

いくつかの一般的な問題

いくつか開いたままにしているように見えるので、すべてのかっことかっこを数えるように注意してください。

ドキュメント準備完了の冒頭は次のようになります。

$(document).ready( function() {  // <== No need to pass anything to this
    // This will all be executed when the document is ready.
    // ...
});             // <== Maker sure to close all parens and brackets!!!

さらに、コールバックは複数のパラメーターを提供するため、コールバックsuccessの関数への参照を使用することはできません。次のようにする必要があります。success

    success: function(responseXML)
    {
        mce_success_cb(responseXML);
    }

コールバックに渡される引数について説明しているAJAXForm プラグインのドキュメントを確認してくださいsuccess

于 2010-09-22T02:29:41.127 に答える
0

私はあなたのコードを読んでいませんでしたが、関数のcomplete()メソッドを試しましたか? jQuery.ajaxサーバーから送信されたエラー コードに関係なく、データが読み込まれると関数が呼び出されます。

complete(XMLHttpRequest, textStatus)

リクエストが終了したとき (成功およびエラーのコールバックが実行された後) に呼び出される関数。関数には 2 つの引数が渡されます。XMLHttpRequest オブジェクトと、リクエストのステータスを分類する文字列 ("success"、"notmodified"、"error"、"timeout"、または "parsererror") です。これは Ajax イベントです。

( http://api.jquery.com/jQuery.ajax/より)

于 2010-09-23T03:07:38.600 に答える