2011-04-17 3 views
0

Я пытаюсь создать общий загрузчик ajax, в то время как ajax запускает лайтбокс с анимированным «Загрузка» gif.Javascript scoping issue

У меня есть некоторые проблемы с прицелом.

Код:

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

Если кто-нибудь знает, как решить это, пожалуйста, поделитесь.

Первое и второе решение сделало то, но нету зафиксировал его полностью, теперь я получаю другую ошибку: «Uncaught TypeError: Объект # не имеет метода„диалога“$ .loader.impl.close.sd»

+0

Первый ответ фиксируется одно, но я получил еще: «Uncaught 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: Object # не имеет диалогового окна« $ .loader.impl.close.sd », – user235410