0

汎用のajaxローダーを構築しようとしていますが、ajaxの実行中に、アニメーション化された「読み込み中」のgifが表示されるライトボックスが表示されます。

スコーピングに問題があります。

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

var t=setTimeout( "s.d.dialog( 'destroy' )" ,(s.o.msgTime*1000));

エラーは次のとおりです。"Uncaught ReferenceError: s is not defined"

;(function ($) { 
      $.loader = function (data, options) {
    return $.loader.impl.init(data, options);
  };

  $.loader.close = function (data) {
    $.loader.impl.close(data);
  };

  $.loader.create = function () {
    $.loader.impl.create();
  };

$.loader.defaults = {
        appendTo: 'body',
        autoCreate: true,
        msgTime: 5,
    };

$.loader.impl = {
    d: {},
    init: function(data, options){

        var s = this;
        s.o = $.extend({}, $.loader.defaults, options);

        if ((typeof data === 'object')&&!(data instanceof jQuery)&&data.url) {

            data.success = function(data, textStatus, jqXHR){ $.loader.close(); }
            data.error = function(jqXHR, textStatus, errorThrown){ $.loader.close('Error accessing server'); }
            $.ajax(data);
        }else if(s.o.autoCreate){
            s.create();
        }

        return s;
    },
    create: function() {
       var s = this;
       s.d = $('<div  id="dialog" style="display:hidden"><span style="width: 100%" id="loading_diag"><center><img src="http://www.mydomain.com/images/ajax-loader.gif" /></center></span></div>').appendTo(s.o.appendTo);
       s.d.dialog({ title: 'Loading ...', dialogClass: 'noTitleStuff', modal: true, draggable: false, resizable: false });

    },
    close: function(data)
    {
        var s = this;
        //alert(typeof s.d);
        if ((typeof data === 'string')&&data) {
            $("#loading_diag").hide();
            $("#dialog").html(data);

            var t=setTimeout( "s.d.dialog( 'destroy' )" ,(s.o.msgTime*1000));
        }else{
            s.d.dialog( "destroy" );
            }

        s.d= {};
    },
};

})(jQuery);

誰かがそれを解決する方法を知っているなら、共有してください。

最初と2番目の解決策は何かをしましたが、完全には修正されていません。「Uncaught TypeError:Object#has no method'dialog'$.loader.impl.close.sd」という別のエラーが発生します。

4

2 に答える 2

2

これで動作します:

var t = setTimeout(function() { s.d.dialog('destroy'); }, s.o.msgTime * 1000);

文字列をに渡すsetTimoutと、その文字列(コード)はグローバルコードで実行sされます。これはローカル変数であるため、実際にはグローバルコードで定義されていません。

于 2011-04-17T14:38:31.030 に答える
1

文字列をsetTimeoutに渡すと、文字列内のコードがwindowオブジェクトのコンテキストで実行されます。window.s存在しないため、エラーが発生します。次のように、クロージャをsetTimeoutに渡して、s変数をスコープ内に保持できます。

var t = setTimeout(function() {s.d.dialog('destroy'); }, s.o.msgTime * 1000);
于 2011-04-17T14:41:50.350 に答える