2011-04-17 15 views
0

ajaxがアニメーション "読み込み中" gifのライトボックスを表示している間、一般的なajaxローダを作成しようとしています。Javascriptスコープの問題

私はスコープにいくつか問題があります。

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

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); 

誰もが共有してくださいそれを解決する方法を知っていれば。

第一及び第二の溶液は、何かをしたが、それを完全に固定しhaventは、 は、今私は別のエラーを取得しています:「キャッチされない例外TypeErrorを:オブジェクト#は何の方法]ダイアログ '$ .loader.impl.close.sdありません」

+0

:「キャッチされない例外TypeError:オブジェクト#は何の方法]ダイアログ '$ .loaderを持っていませんが.impl.close.sd " – user235410

+0

@user' dialog'とは何ですか?そしてそれはどこに定義されていますか? –

答えて

2

これはそれを動作させるだろう。

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

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

+0

それは何かを修正しましたが、別のエラーが発生しています: "Uncaught TypeError:Object#にはメソッド 'ダイアログ'がありません $ .loader.impl.close.sd" – user235410

1

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

最初の答えは、一つのことを固定されているが、私は別だ
var t = setTimeout(function() {s.d.dialog('destroy'); }, s.o.msgTime * 1000); 
+0

これは修正されましたが、 "Uncaught TypeError:オブジェクト#にはメソッド 'ダイアログ'がありません$ .loader.impl.close.sd" – user235410