Javascript 将getNext()与Mootools一起使用

Javascript 将getNext()与Mootools一起使用,javascript,mootools,Javascript,Mootools,我想在mootools 1.11中做一个自动补全程序。一切都很好,但我就是无法检查 this.selectel.getNext() 是空的或其他什么。Firebug通过getNext()为每个元素输出[li],为不存在的元素输出[null] 我看到有些人只是在做: if(this.selectel.getNext()) {... 但这在这里不起作用,因为我总是得到空对象。这里一定发生了非常愚蠢的事情 下面是一些解决此问题的代码: this.selectel = $$('ul.results'

我想在mootools 1.11中做一个自动补全程序。一切都很好,但我就是无法检查

this.selectel.getNext()
是空的或其他什么。Firebug通过getNext()为每个元素输出[li],为不存在的元素输出[null]

我看到有些人只是在做:

if(this.selectel.getNext()) {...
但这在这里不起作用,因为我总是得到空对象。这里一定发生了非常愚蠢的事情

下面是一些解决此问题的代码:

this.selectel = $$('ul.results').getFirst();

...

onCommand: function(e, mouse) {
    if (e.key && !e.shift) {

        switch (e.key) {
            case 'up':                  
                this.selectel.getPrevious().addClass('active');
                if(this.selectel) this.selectel.removeClass('active');
                this.selectel = this.selectel.getPrevious();
                e.stop(); 
            return;

            case 'down':
                var test = this.selectel.getNext();
                console.log(typeof(test));

                if(this.selectel.getNext() != null) {  // not working

                    this.selectel.getNext().addClass('active');
                    if(this.selectel) this.selectel.removeClass('active');
                    this.selectel = this.selectel.getNext();
                }
                e.stop(); 
            return;

        }
    }
您正在调用getNext()两次

更换这些线路:

if(this.selectel.getNext() != null) {  // not working
   this.selectel.getNext().addClass('active');
   if(this.selectel) this.selectel.removeClass('active');
   this.selectel = this.selectel.getNext();
}
与:


您从测试输出的类型中得到了什么?
console.log(this.selectel)
是您期望的元素吗?是或甚至是,
this
是否指向类实例或窗口对象(取决于
this.firevent(“命令”)
的绑定方式-
this.firevent(“命令”),this;
?)顺便说一句,这不是错误,但是:您不需要计算选择器是否直接为空,如果(this.selectel.getNext()){…}如果定义为true,它将作为true,如果为null,它将作为false。element.getNext()也接受选择器,因此您可以执行
。getNext(“div.inactive”)
这是类实例。就像我上面所说的控制台。log(this.selectel)输出[null]。我还尝试了(this.selectel.getNext(){…}但是我得到的不是null,而是[null],一个我无法处理的null对象。如果
this.selectel
输出null,那么这个范围就不会绑定到类实例。如果它找不到元素,它肯定找不到它旁边的元素。你需要向我显示类本身发生
fireEvent(“命令”)
(可能是在键盘或其他东西上)。另外,你从来没有说过this.selectel为null,但是this.selectel.getNext()-但是它是一个链,从原始元素开始并在原始元素正确引用dom对象时进行回复。我猜你不明白。this.selectel输出[null]在最后一个li元素上不为null。上下自动完成结果可以正常工作。因此,解析UL元素可以正常工作。只有最后一个li元素会导致问题。当我为下一个(不存在的)li元素获取[null]时,这是很公平的。如果(!this.selectEl.getNext()){e.stop();return;}…这里的代码使用getNext(缓存它)不起作用?如果为null,它将作为false进行计算。如果所有操作都失败,发布到JSFIDLE上,我将进行查看…这不起作用。我尝试了此操作但未成功:var test=this.selectel.getNext();if(test!=null){test.addClass('active');if(this.selectel)this.selectel.removeClass('active');this.selectel=this.selectel.getNext();}他建议的只是将选择器缓存到el中,这样您就不会调用它两次。需要var el=,否则它会变成window.el,这是不可取的。我已经准备好将它存储到test中(见上文)。但是如果(test!=null){…没有得到null,但是[null]不是false。
if(el = this.selectel.getNext() != null) {  // not working
   el.addClass('active');
   if(this.selectel) this.selectel.removeClass('active');
   this.selectel = el;
}