Mouseup событие над флэш-объектом не срабатывает - PullRequest
2 голосов
/ 08 апреля 2011

У меня есть этот скрипт, работающий с Как заставить mouseup срабатывать после завершения перемещения мыши , работающего в области действия jQuery (документ).

Позже я добавил флеш-объект внутрь тела. и когда я щелкаю по flash-объекту, запускается событие mousedown, событие mousemove, но не событие mouseup, с которого я хочу отсоединить mousemove.

Но когда я нажимаю на область без Flash, mousedown работает, mousemove работает и mouseup также работает. Он работает так, как я хотел, в Chrome, но не в Firefox.

Вот коды, и я позвонил handleMouseDown в $(document).ready

handleMouseDown: function () {
    jQuery(document).mouseup(function() {
        Log("unbind.");
        jQuery(document).unbind('mousemove');
    }); 

    jQuery(document).mousedown(function(e) { 
      Log('click');
      // You can record the starting position with
      var start_x = e.pageX;
      var start_y = e.pageY;

      jQuery(document).mousemove(function(e) {
          // And you can get the distance moved by
          var offset_x = e.pageX - start_x;
          var offset_y = e.pageY - start_y;

          Log('moves') ;
          return false;
      }); 

      // Using return false prevents browser's default,
      // often unwanted mousemove actions (drag & drop)
      return false;
  }); 
}
//firebug method log calls
function Log(str) {
    if (typeof(console.log) == 'function') console.log(str);
}

Ответы [ 5 ]

0 голосов
/ 26 апреля 2015

Другое решение заключается в использовании свойства MouseEvent.buttons, которое является Firefox специфичным и так как это Firefox причуда.Это свойство недоступно, например, в Safari .Вот код для определения, нажата ли левая кнопка, отметьте touchmove флажок, чтобы избежать срабатывания на сенсорных устройствах:

if ( e.buttons != 'undefined' && e.type != 'touchmove'  && !(e.buttons & 1 ) ) 
bMouseDown = false;
0 голосов
/ 26 февраля 2015

Это старый вопрос, но, похоже, у него нет рабочего ответа, поэтому я просто скажу, как я его обошел, так как это все еще проблема сегодня.В то время как событие mouseup, по-видимому, не запускает flash-объект, происходит общее событие «click», но если вы отслеживаете состояние «вверх» и «вниз», вы можете использовать его, чтобы получить то, что вы хотите.Супер базовый пример:

$(document).on("mousedown", function () {
    mouseButtonStatus = "down";
});

$(document).on("mouseup", function () {
    mouseButtonStatus = "up";
});

// This little bodge gets around the issue with FireFox and the mouseup event
$(document).on("click", function () {
    if (mouseButtonStatus === "down"){
        mouseButtonStatus = "up";
    }
});

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

0 голосов
/ 08 апреля 2011

Вы можете поместить свой код вверх для мыши в отдельную функцию, которую вы можете вызвать из вашего обработчика JavaScript и вызов ExternalInterface из Flash, когда кнопка мыши отпущена над объектом Flash. Конечно, это работает, только если вы можете редактировать источник Flash.

0 голосов
/ 11 декабря 2011

Я мог бы решить эту проблему следующим образом:

$('object').live('mousedown', function() {
    alert('I was clicked');
});

только .bind() не выполнил работу, возможно, потому что объект вставлен через swfobject ...

0 голосов
/ 08 апреля 2011

С этим немного сложно справиться.

Сначала любой флеш-объект захватит весь ввод. Это означает, что любые события мыши или клавиатуры находятся внутри объекта flash! В то время как ввод с клавиатуры фиксируется только тогда, когда элемент находится в фокусе, mouseUp будет по-прежнему происходить «внутри» объекта flash.

Во-вторых, единственное решение, которое я могу придумать, - это наложить все флэш-объекты на невидимый div на переднем плане, когда mouveUp должен сработать. Может сработать ... может и нет, но теоретически так и должно быть.

...