什么是jQuery等同于此,它做了什么?

时间:2010-11-19 01:28:50

标签: javascript jquery extjs

我正在将一些javascript从ExtJS转换为jQuery,我不知道这是做什么的,所以我不确定它转换为...

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 个答案:

答案 0 :(得分:2)

由于您位于setTimeoutthis将代表window对象。

我不知道ExtJS,但它似乎是在window上创建一个委托处理程序。

可能最好参考ExtJS文档。根据{{​​3}}:

  

创建一个委托(回调),将范围设置为obj。直接调用任何函数。示例:this.myFunction.cre ...


编辑:我相信它会被这样称呼:

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

它将确保在调用hideAll时,将在其当前上下文中调用它。

您可以对setTimeout中传递给show的匿名函数执行相同的操作:

showTimeout = setTimeout($.proxy(function () {
                 this.el.show();
              }, this), delay);

答案 1 :(得分:0)

你可以用jQuery完成同样的事情:

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

编辑:由于方法hideAll不包含对this的引用,因此您可以更简单地完成此操作:

hideTimeout = setTimeout(this.hideAll, delay);