2

我正在尝试学习纯原生JavaScript,所以请不要建议使用框架来解决任务。我知道这太棒了,当我用完纯 JS 后,学习它们将是我要做的第一件事 :)

现在,问题。小提琴

如您所见,我在那里有两个自定义下拉菜单。它们中的每一个都可以用鼠标和键盘打开和控制。解决此任务我需要做的最后一件事是实现以下功能:打开一个下拉菜单应关闭另一个下拉菜单,单击下拉菜单外部应关闭任何打开的下拉菜单(假设一次只能打开一个) .

我尝试向onclick文档添加一个侦听器,如果下拉列表中的任何一个打开但之前未使用过,它将关闭下拉列表,但是在我单击文档一次后,下拉列表不再显示。但这甚至不能解决一半的问题。由于我将标志 bIsOpen 分配给对象,因此我无法从另一个对象访问它们以查看它是否被触发。

请给我一个提示:)

4

1 回答 1

1

将打开和关闭逻辑移动到它们自己的函数中:

DropDown.prototype.open = function (e) {
    ...
}

DropDown.prototype.close = function (e) {
    ...
}

this.htmlDropDown.onclick = function (e) {
    if (this.bIsOpen) {
        this.open(e);
    } else {
        this.close(e);
    }
}

(确保打开和关闭功能调整bIsOpen,而不是onclick处理程序。)

然后,添加所有当前存在的下拉列表:

function DropDown(htmlObject) {
    DropDown.dropdowns.push(this);
    ...
}

DropDown.dropdowns = []; // no 'prototype'

最后,在打开器中,关闭所有其他下拉菜单:

DropDown.prototype.open = function (e) {
    var dropdown;
    for (var i = 0; i < DropDown.dropdowns.length; i++) {
        dropdown = DropDown.dropdowns[i];
        if (dropdown !== this) {
            dropdown.close();
        }
    }
    ...
}
于 2013-02-11T14:55:48.190 回答