рассечение

у меня была проблема, и для ее решения требовалась функциональность, встроенная в mootools. поэтому я начал анализировать его. есть интересующая меня функция IframeShim.destroy вот так

destroy: function(){
        if (this.shim) this.shim.destroy();
        return this;
    }

теперь, что я не могу понять в этом, что такое shim. В частности, я пытаюсь понять, что Request.JSONP.cancel его код выглядит так

cancel: function(){
        if (this.running) this.clear().fireEvent('cancel');
        return this;
    }

теперь эта отмена вызывает clear, чей код такой

clear: function(){
        this.running = false;
        if (this.script){
            this.script.destroy();
            this.script = null;
        }
        return this;
    }

теперь в этой ясной функции я вижу destroy(), которая ведет меня к shim (см. код вверху), и я застрял. Все эти функции находятся в mootools-more.js.

Помощь?

было бы здорово, если бы кто-нибудь мог предоставить простую реализацию javascript для Request.JSONP.cancel. Есть ли у него альтернатива JQuery?


person lovesh    schedule 29.07.2011    source источник


Ответы (1)


Уничтожение, вызываемое методом Request.JSONP.clear, не является IframeShim.destory, это часть ядра mootools. Вот источник:

destroy: function(){
    var children = clean(this).getElementsByTagName('*');
    Array.each(children, clean);
    Element.dispose(this);
    return null;
},

Все, что делает Element.dispose, — это вызывает родной DOM-метод jasvascript Node.removeChild, который удаляет элемент из DOM.

Таким образом, все, что делает JSONP.cancel, — это видит, был ли добавлен узел DOM скрипта через Request.JSONP.cancel. Если это так, он удаляет элемент скрипта из DOM с помощью removeChild.

Важно то, что он установил флаг running в false. Если вы посмотрите на Request.JSONP.success, первое, что он делает перед вызовом вашей функции обратного вызова, это проверяет, установлен ли флаг running в false, и если это так, он немедленно возвращается. Это эффективно "отменяет" выполнение.

Если вы имели в виду, отменяет ли он HTTP-запрос, ответ - нет, не отменяет.

person Philip Ramirez    schedule 29.07.2011
comment
спасибо, +1. вызов destroy()на узле отменяет любые http-запросы, сделанные узлом. Если вы не понимаете, что я имею в виду, см. это - person lovesh; 29.07.2011
comment
означает ли это, что Request.JSONP.cancel не может отменить HTTP-запрос? - person lovesh; 29.07.2011
comment
@lovesh нет, это не отменяет HTTP-запрос. Что он делает, так это отменяет выполнение обратного вызова после загрузки скрипта. - person Philip Ramirez; 29.07.2011
comment
@lovesh заметил, что в Request.JSONP.send они установили src как URL-адрес, переданный в опциях + callback=Request.JSONP.request_map.request_'+ index. Это связывает его с сопоставленным Request.JSONP.success, который перед выполнением сначала проверяет, является ли this.running ложным, и, если это так, немедленно возвращается и, таким образом, отменяет его (поскольку назначенный обратный вызов никогда не будет выполняться). - person Philip Ramirez; 29.07.2011