Событие изменения jQuery не запускается в IE при отпускании мыши вне множественного выбора - PullRequest
2 голосов
/ 03 декабря 2010

Хорошо, мне понадобилось время, чтобы придумать название для этого вопроса.

Допустим, у вас есть список множественного выбора, и вы используете jQuery для обнаружения события изменения. Это будет хорошо работать под Firefox и IE при нормальных условиях. Но в IE, если вы выбираете что-то в списке и не отпускаете мышь до тех пор, пока курсор не окажется вне выделения, событие не будет запущено. Это работает в Firefox.

HTML:

<select size="4" name="ListBox" multiple="multiple" id="ListBox">
    <option value="32">32</option>
    <option value="48">48</option>
</select>

Javascript:

$(ListBox).change(function ()
{
    alert("Change fired");
});

Вы можете проверить пример здесь: http://jsfiddle.net/as7EN/1/

FF 3.6.12: РАБОТА
IE8: НЕ РАБОТАЕТ

Спасибо за любые предложения.

Ответы [ 2 ]

2 голосов
/ 03 декабря 2010

Оказывается, это jQuery 1.4. * Ошибка!

Я снова протестировал Fiddle с более ранней версией jQuery, 1.3.2, и, конечно же, она работает!

Я опубликовалотчет об ошибке на jQuery, пожалуйста, проголосуйте за мой отчет там, если вы хотите, чтобы они его исправили (очень маленькие стрелки над билетом рядом со ссылкой «Предыдущий билет»):

http://bugs.jquery.com/ticket/7698

0 голосов
/ 03 декабря 2010

хакерский раствор

[Отредактированное решение]

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 исправит это самостоятельно.

Кроме того, если вы хотите, чтобы мультиселект работал, скажите мне, и я все это взломаю

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...