Конвертировать IE event.button в W3C event.button - PullRequest
4 голосов
/ 16 февраля 2010

При наведении мыши (и вверх) мне нужно проверить, какая кнопка мыши изменила свое состояние. Это довольно легко с моделью W3C и даже старым способом netscape (event.which), но IE доставляет мне головную боль. Я знаю, что event.button в IE - битовая маска, но проблема в том, что я не могу узнать, какая кнопка была нажата из этой битовой маски. Если IE дает мне event.button == 3, то я не могу сказать, нажал ли пользователь левую кнопку, когда правая кнопка уже была нажата, или пользователь нажал правую кнопку, когда левая кнопка уже была нажата.

Чтобы решить эту проблему раз и навсегда, я ищу хорошее общее решение для преобразования прерванного события IE в событие, совместимое с W3C. Может быть, кто-то уже сделал это и хочет поделиться?

Ответы [ 3 ]

3 голосов
/ 16 февраля 2010

Вы можете найти эту страницу полезной: http://unixpapa.com/js/mouse.html. На ней есть раздел, посвященный обнаружению кнопок мыши, который я использовал ранее и нашел полезным и точным, включая следующее:

Пока нет независимого от браузера способ узнать, какая кнопка мыши который для всех браузеров, опрошенных, Вы можете подойти очень близко. следующий тест работает для всех браузеров кроме оперы 7. (смешивает право и средние кнопки мыши в Opera 7, но опера 7 довольно старая, там были только несколько версий, где право и средние кнопки даже работали, а тогда только если пользователь установил скрытый вариант, так что вам действительно все равно.) Это также неправильно обрабатывает одновременное нажатие нескольких мышек кнопки в IE. Чтобы сделать это ваш приложение должно отслеживать, какие Сообщалось, что кнопки были в предыдущие события mousedown, чтобы он мог выяснить, какой из них был добавлен.

if (event.which == null)
   /* IE case */
   button= (event.button < 2) ? "LEFT" :
             ((event.button == 4) ? "MIDDLE" : "RIGHT");
else
   /* All others */
   button= (event.which < 2) ? "LEFT" :
             ((event.which == 2) ? "MIDDLE" : "RIGHT");
3 голосов
/ 16 февраля 2010

IMO (и quirksmode's ), битовая маскировка IE лучше, чем версия W3C, потому что вы можете обнаружить комбо-клики, такие как левый + правый или средний + левый. Это предлагает немного больше гибкости. Оба (общее количество нажатых кнопок и самая новая нажатая кнопка) будет еще лучше.

Я не знаю библиотеки или скрипта, которые уже делают то, что вы пытаетесь сделать, я думаю, что большинство разработчиков просто проигнорируют комбо-клики, если они не захотят применить определенное действие к комбо-клику. Кроме того, это довольно сложно, вам придется обнаружить как onmousedown, так и onmouseup для всего документа и записать состояние кнопок мыши. Затем на элементе, над которым вы хотите применить свою магию, вычтите предыдущее состояние мыши из нового. Что-то вроде (проверено):

if (document.attachEvent)
{
    (function ()
    {
        var mState = 0;
        document.documentElement.attachEvent("onmousedown", function () 
        {
            mState += event.button;
        });
        document.documentElement.attachEvent("onmouseup", function () 
        {
            mState -= event.button;
        });
        document.getElementById("jim").attachEvent("onmousedown", function ()
        {
            var realButton = event.button - mState;

            alert(realButton); 
            // Your code here
        });
    })();
}

Конечно, есть только около миллиона вещей, которые могут пойти не так с этим сценарием. Например, в моем примере у меня есть окно предупреждения, которое всплывает с реальным состоянием кнопки. Если вы отпустите кнопку, когда диалоговое окно с предупреждением установлено, документ не обнаружит наведений мыши и выкинет все из строя. Аналогично, любые события mouseup или mousedown на других элементах, которые останавливают распространение вплоть до обработчика события documentElement , могут привести к его разрыву.

Если вам нужен мой совет, выведите сообщение о комбо-щелчке мыши, угадайте «правильную» кнопку мыши или игнорируйте их все вместе. Любой из этих вариантов лучше, чем хакерский подход.

0 голосов
/ 16 февраля 2010

Эта статья может быть полезна:

Как выровнять модели событий IE и W3C

...