Обнаружить кнопку средней кнопки (кнопка прокрутки) с помощью jQuery

У меня есть список с тегами для воспроизведения некоторых mp3 файлов onclick. Он отлично работает при привязке к событию 'click' с jQuery:

$oo.data({'__mp3play':true,'wapiHandle':h+0,'wapiIndex':o.ajaxPlayList[h].length})
           .bind( 'click', function()
            { var wh = $j(this).data('wapiHandle');
              if( typeof o.regObjects[wh] == 'object' && o.regObjects[wh].play(this.href))
               { return false; }
            });

При нажатии левой кнопки мыши: Он отключает обработку по умолчанию при загрузке моего плагина Flash, иначе он будет нормально открыт.

НО: Когда я использую кнопку прокрутки мыши и нажимаю на нее, событие клика не запускается, и ссылка открывается нормально.

Я пытался использовать события mousedown или mouseup, но не помогает, ссылка всегда открывается обычно с побочным эффектом, который музыка начинает играть также с флэш-плеером.

Также preventDefault() не работает вообще.

Может ли кто-нибудь сказать мне, как определить среднюю кнопку мыши (нажмите кнопку прокрутки)?

Спасибо за ваши комментарии.

PS: Я уже пробовал другие решения о "средней кнопке", доступной на этом сайте.

Протестировано во всех браузерах с таким же результатом.

EDIT: Это также не работает, ссылка будет нормально открыта при использовании средней кнопки мыши. При использовании левой кнопки мыши ничего не происходит.

$oo.bind( 'mousedown click mouseup', function(e)
{ e.preventDefault(); e.stopPropagation(); return false; });

Ответы

Ответ 1

Хорошо, ребята,

Спасибо за ваш вклад. "@no.good.at.coding" имеет приятное решение, но не работает на IE (см. ниже в этом письме), но является хорошей отправной точкой. Я изменяю его код:

// Avoid relations will be opened in extra tab when clicking middle-scroll-button to open it
$(document).bind($.browser.msie ? "mousedown" : "click", function(e)
{
    if (e.which == 2 && e.target.tagName == 'A') 
    {
        var bIE = $.browser.msie,
            $o = $(e.target),
            oe = $o.data('events'),
            b = true,
            f = function(){};

        if (typeof oe == 'object' && oe['click']) {
            f = function(){ $o.trigger('click'); }
        } else {
            b = (typeof $o[0].href == 'string' && ($o[0].target == undefined || $o[0].target == '' || $o[0].target == '_self'));
            if (b) { 
                f = function () { window.location.href=$o[0].href; };
            }
        }

        if (!b) { return; }

        e.stopImmediatePropagation();
        e.stopPropagation();
        e.preventDefault();

        if (bIE)
        {
            if (!window.__swcp__) { 
                window.__swcp__= $('<div style="position:fixed;top:0px;left:0px;width:100%;height:100%;background:#000;display:block;z-index:9999;opacity:0.01;filter:alpha(opacity:1);" />').appendTo('body'); 
            }
            window.__swcp__.show();
        }

        setTimeout(f, 50);
        if (bIE) { 
            setTimeout( function() { window.__swcp__.hide(); }, 1000 );
        }

        return false;
    }
});

Средняя кнопка действует теперь как левая кнопка мыши. Поскольку вы можете видеть, что IE нуждается в еще одном, мы должны расфокусировать тег связи в течение 1 секунды, чтобы избежать его открытия на дополнительной вкладке. Я использую здесь простой способ сделать это, создать прозрачный div (opacity = 0.01) "для глаз", который будет размещен над содержимым окна, чтобы любая ссылка на странице была не сфокусирована. Пользователь не заметит никакой разницы, кроме того, что указатель мыши может измениться с указателя на значение по умолчанию, и через одну секунду он изменится на указатель (только IE). Я могу жить с этим.

Я принимаю это как ответ, но если у вас есть идея лучше, дайте мне знать.

Ответ 2

После быстрого теста кажется, что три из них упорядочены следующим образом:

  • Влево - 1
  • Средний - 2
  • Вправо - 3

Итак, если у вас есть:

$(document).mousedown(function(e){
    switch(e.which)
    {
        case 1:
            //left Click
        break;
        case 2:
            //middle Click
        break;
        case 3:
            //right Click
        break;
    }
    return true;// to allow the browser to know that we handled it.
});

Ответ 3

Хорошо, я думаю, у меня это есть. Здесь работает скрипка. Трюк (по крайней мере, с FF4), по-видимому, связан с привязкой обработчика кликов к document и остановить его распространение.

$(document).click(function(e){
        //not checking for the right click will prevent the context-menu from showing, you may or may not want to do that
        if (e.which != 3) { 
            e.preventDefault();
            return false;
        }
    });

Это решение было найдено на этой странице форума.

Ответ 4

e., который должен это сделать:

Простой пример:

$(document).ready(function(){
    $(document).mousedown(function(e){
         alert(e.which); // ##=> left
    }) 
})

Ответ 5

Если вы (как я) нашли это из-за странных ошибок среднего клика от клиентов. И вы просто хотите, чтобы любой средний или правый щелчок отображался как левый клик

Забудьте об этом хромовом коде IE.

Короткий и сладкий:

$(document).click(function(e){
  // checking for any non left click and convert to left click.
  if (e.which != 1) { 
    e.which = 1;
  }
});

Очевидно, если вам нужно немного больше дискриминации, вы можете сделать что-то вроде:

$('a.no-non-left-clickies').click(function(e){
  // checking for any non left click and convert to left click.
  if (e.which != 1) { 
    e.which = 1;
  }
});