ich eine Benutzersteuerung in asp.net, die Markup ähnlich dem folgenden Ausgänge:Show/Hide Combobox Dropdown mit reinem Javascript
<div id="combobox1">
<div id="combobox1_text"><span>combobox 1</span></div>
<div id="combobox1_ddl">
<input type="checkbox" id="combobox1_$1" />
<label for="combobox1_$1">Item 1</label>
<br />
<input type="checkbox" id="combobox1_$2" />
<label for="combobox1_$2">Item 2</label>
<br />
<input type="checkbox" id="combobox1_$3" />
<label for="combobox1_$3">Item 3</label>
<br />
<input type="checkbox" id="combobox1_$4" />
<label for="combobox1_$4">Item 4</label>
<br />
<input type="checkbox" id="combobox1_$5" />
<label for="combobox1_$5">Item 5</label>
<br />
</div>
</div>
eine JavaScript-Datei begleitet diese Kontrolle hat die folgende Klasse (minimaler Code zu reproduzieren das Problem nur):
ComboBox = function(cb) {
var pnlContainer = document.getElementById(cb);
var pnlComboBox = document.getElementById(cb + '_text');
var pnlDropdownList = document.getElementById(cb + '_ddl');
var isCollapsed = true;
var collapseDropdown = function() {
if (!isCollapsed) {
isCollapsed = true;
pnlDropdownList.style.display = 'none';
//-- some more custom handling code follows here --
}
};
pnlComboBox.onclick = function() {
isCollapsed = !isCollapsed;
pnlDropdownList.style.display = (isCollapsed) ? 'none' : 'block';
};
pnlContainer.onclick = function(event) {
event.stopPropagation();
};
document.addEventListener('click', function() {
collapseDropdown();
}, false);
}
Und schließlich auf meiner Seite erstelle ich eine Instanz der Klasse wie folgt:
cb1 = new ComboBox('combobox1');
All dies funktioniert gut, bis nur eine Instanz dieses Steuerelements vorhanden ist. Es klappt korrekt zusammen, wenn etwas oder irgendwo außerhalb des Steuerelements angeklickt wird, genau wie erwartet.
Das Problem:
Das Problem tritt auf, wenn mehr als eine Instanz dieses Steuerelement auf der Seite ist. Wenn eine der Comboboxen geöffnet ist und der Benutzer auf eine andere Instanz meiner Combobox klickt, wird die vorherige nicht minimiert.
https://jsfiddle.net/x8qjo79f/
Ich weiß es, weil die event.stopPropagation()
Anruf geschieht, aber nicht wissen, was für dies zu tun:
JsFiddle für minimalen Code, um das Problem zu reproduzieren, sind hier zu finden.
Ich hatte ursprünglich den Dropdown-Kollaps auf "onblur" -Ereignis. Das Problem ist mit Chrome-Browser, wo es das Dropdown-Menü zusammenklappt, sobald ein Kontrollkästchen im Dropdown-Bereich angeklickt wird. Ich möchte, dass es geöffnet bleibt, bis der Benutzer irgendwo außerhalb der Combobox klickt oder es durch Klicken auf den Combobox-Textbereich einklappt. –
Ich überarbeitete meine Antwort –
Sehr gut. Ich habe beobachtet, dass ich den 'event.stopPropagation()' Aufruf danach nicht mehr benötige und die Ereignisbehandlung 'pnlContainer.onclick' vollständig loswerden kann. –