хакерский раствор
[Отредактированное решение]
var clickDown = false;
var currentlySelected = null;
$("#ListBox").mousedown(function (event)
{
clickDown = this;
});
$(document).mouseup(function () {
setTimeout(function() {
if (clickDown) {
if (currentlySelected != clickDown.selectedIndex) {
alert("change");
currentlySelected = clickDown.selectedIndex;
}
clickDown = false;
}
}, 0);
});
В основном для mouseDown мы устанавливаем флаг, указывающий, что вы щелкаете по списку.
Затем мы проверяем каждые mouseUp во всем документе. Мы завернем всю функцию в тайм-аут, чтобы IE8 правильно установил selectedIndex. И если установлен флаг clickDown, мы знаем, что clickUp поступил из списка. Для удобства я также храню объект списка в флаге, поскольку (object === true) в javascript.
Затем мы просто проверяем, изменилась ли наша переменная, содержащая текущий индекс. Если это так, то происходит изменение, и мы обновляем эту переменную, чтобы отразить новый индекс.
Наконец, мы должны установить для clickDown значение false снова, в противном случае другие нажатия в документе будут отображаться в списке из списка.
Это включает проверку каждого клика вверх и ни в коем случае не является элегантным решением
http://jsfiddle.net/as7EN/37/
[Edit] Это исправило только хром. Не для IE8. Работаю над этим.
Я сузил его до того факта, что IE изменяет selectedIndex после запуска события mouseUp.
Этой ошибки можно избежать, обернув ее в timeOut, чтобы функция вызывалась после того, как IE8 установит selectedIndex в реальное значение. Меня не волнует, что IE6 / 7 исправит это самостоятельно.
Кроме того, если вы хотите, чтобы мультиселект работал, скажите мне, и я все это взломаю