Что эквивалентно этому jQuery, и что оно делает? - PullRequest
1 голос
/ 19 ноября 2010

Я конвертирую некоторый javascript-код в jQuery из ExtJS, и я не знаю, что это делает, поэтому я не уверен, во что он конвертируется ...

hideTimeout = setTimeout(this.hideAll.createDelegate(this), delay);

задержка = 200

В чем я не уверен, так это createDelegate(this) ...

обновление

Все JS это ...

    Menu.prototype = {
        init: function () {
            var that = this;

            this.ui.link.bind("mouseover", function (e) {
                that.show();
            });
            this.ui.link.bind("mouseout", function (e) {
                that.hide();
            });

            var subOptions = $("li", this.ui.parent);

            $.each(subOptions, function (el) {
                el = $(el);

                el.bind("mouseover", that.cancelTimeout, this);
                el.bind("mouseout", that.hide, this);
            });
        },
        hideAll: function () {
            $("#hd .nav ul ul").hide();
        },
        show: function () {

            this.hideAll();

            this.cancelTimeout();

            showTimeout = setTimeout((function () {
                this.el.show();
            }).createDelegate(this), delay);
        },
        hide: function () {
            this.cancelTimeout();

            hideTimeout = setTimeout(this.hideAll.createDelegate(this), delay);
        },
        cancelTimeout: function () {
            clearTimeout(hideTimeout);
            clearTimeout(showTimeout);
        }
    };

Ответы [ 2 ]

2 голосов
/ 19 ноября 2010

Поскольку вы находитесь в setTimeout, this будет представлять window объект.

Я не знаю ExtJS, но, похоже, он создает обработчик делегата на window.

Вероятно, лучше всего ссылаться на документы ExtJS. Согласно документам для createDelegate:

Создает делегат (обратный вызов), который устанавливает область видимости obj. Звоните прямо на любую функцию. Пример: this.myFunction.cre ...


РЕДАКТИРОВАТЬ: Я считаю, что это будет называться так:

hideTimeout = setTimeout($.proxy( this.hideAll, this), delay);

Он будет гарантировать, что при вызове hideAll он будет вызван в текущем контексте.

Вы можете сделать то же самое для анонимной функции, переданной в setTimeout в show:

showTimeout = setTimeout($.proxy(function () {
                 this.el.show();
              }, this), delay);
0 голосов
/ 19 ноября 2010

Вы можете сделать то же самое с jQuery следующим образом:

hideTimeout = setTimeout(jQuery.proxy(this, "hideAll"), delay);

РЕДАКТИРОВАТЬ: Поскольку метод hideAll не содержит ссылку на this, вы можете сделать это еще проще:

hideTimeout = setTimeout(this.hideAll, delay);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...