Вопрос об Javascript - PullRequest
       13

Вопрос об Javascript

0 голосов
/ 17 апреля 2011

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

У меня есть некоторые проблемы с областью видимости.

Кодis:

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: Object # не имеет метода 'dialog' $ .loader.impl.close.sd"

Ответы [ 2 ]

2 голосов
/ 17 апреля 2011

Это заставит его работать:

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

Когда вы передаете строку в setTimout, эта строка (код) выполняется в глобальном коде - и поскольку s является локальной переменной, онадействительно не определено в глобальном коде.

1 голос
/ 17 апреля 2011

Когда вы передаете строку в setTimeout, код в строке выполняется в контексте объекта window. Поскольку window.s не существует, вы получаете ошибку. Вы можете передать замыкание в setTimeout, чтобы сохранить переменную s в области видимости:

var t = setTimeout(function() {s.d.dialog('destroy'); }, s.o.msgTime * 1000);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...