2011-04-17 335 views
0

我正在嘗試構建一個通用的ajax加載器,而ajax運行的是帶有動畫「加載」gif的燈箱將會顯示。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); 

如果有人知道如何解決它,請分享。

第一和第二的解決方案做了一些事,但還沒有完全固定的,現在 我得到一個不同的錯誤:「遺漏的類型錯誤:對象#有沒有方法‘對話框’$ .loader.impl.close.sd」

+0

第一個答案固定的一件事,但我得到另一位說:「遺漏的類型錯誤:對象#有沒有方法‘對話框’$ .loader .impl.close.sd「 – user235410 2011-04-17 14:59:27

+0

@user什麼是」對話框「,它在哪裏定義? – 2011-04-17 17:52:27

回答

2

這將使其工作:

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

當你傳遞一個字符串到setTimout,那麼該字符串(代碼)執行全局代碼 - 既然s是一個局部變量,它的確不是在全局代碼中定義。

+0

這確實解決了一些問題,但我得到了一個不同的錯誤:「Uncaught TypeError:Object# has no method'dialog' $ .loader.impl.close.sd」 – user235410 2011-04-17 14:54:52

1

當您將字符串傳遞給setTimeout時,字符串中的代碼將在window對象的上下文中執行。由於window.s不存在,您會收到錯誤消息。你可以通過封閉來的setTimeout讓您的s變量在這樣的範圍:

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

這確實解決了一些問題,但我得到了一個不同的錯誤: 「Uncaught TypeError:Object# has no method'dialog'$ .loader.impl.close.sd」 – user235410 2011-04-17 14:55:44