React-dnd: ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ° с ΠΏΡ€ΠΎΠΈΠ³Ρ€Ρ‹ΡˆΠ΅ΠΌ событий Firefox

Π‘ΠΎΠ·Π΄Π°Π½Π½Ρ‹ΠΉ Π½Π° 5 Π°ΠΏΡ€. 2018  Β·  7ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ  Β·  Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: react-dnd/react-dnd

Π― ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ» довольно Π½Π΅ΠΏΡ€ΠΈΡΡ‚Π½ΡƒΡŽ ΠΎΡˆΠΈΠ±ΠΊΡƒ, которая, ΠΏΠΎΡ…ΠΎΠΆΠ΅, Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π² самом Firefox. Π― ΠΌΠΎΠ³Ρƒ воспроизвСсти эту ΠΎΡˆΠΈΠ±ΠΊΡƒ Π΄Π°ΠΆΠ΅ Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΡƒΡ‡Π΅Π±Π½ΠΈΠΊΠ° ΠΏΠΎ ΡˆΠ°Ρ…ΠΌΠ°Ρ‚Π°ΠΌ. По сути, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΠΏΠ°ΡΡ‚ΡŒ Π² состояниС, ΠΏΡ€ΠΈ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Firefox Π½Π΅ отправляСт Π½ΠΈΠΊΠ°ΠΊΠΈΡ… событий ΠΌΡ‹ΡˆΠΈ, ΠΊΡ€ΠΎΠΌΠ΅ dragstart.

ВоспроизвСдСниС

Π©Π΅Π»ΠΊΠ½ΠΈΡ‚Π΅ источник пСрСтаскивания ΠΈ Π½Π°Ρ‡Π½ΠΈΡ‚Π΅ ΠΏΠ΅Ρ€Π΅Ρ‚Π°ΡΠΊΠΈΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ, отпуститС ΠΊΠ½ΠΎΠΏΠΊΡƒ ΠΌΡ‹ΡˆΠΈ Π΄ΠΎ появлСния ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ просмотра. Π’ ΡƒΡ‡Π΅Π±Π½ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ послС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Π²Ρ‹ сдСлаСтС это ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π·, Ρ†Π΅Π»ΠΈ пСрСтаскивания останутся Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΌΠΈ. Иногда Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ это Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ снова, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ ΠΏΠΎΠ»Π½ΡƒΡŽ ΠΎΡˆΠΈΠ±ΠΊΡƒ.

Π­Ρ‚ΠΎ Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΡ€ΠΎΡ‰Π΅ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π½Π° ΠΌΠ΅Π΄Π»Π΅Π½Π½Ρ‹Ρ… страницах, Π³Π΄Π΅ для ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ просмотра трСбуСтся врСмя. Π£ мСня Π΅ΡΡ‚ΡŒ страница, которая Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΎΡ‡Π΅Π½ΡŒ ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ, ΠΈ я ΠΌΠΎΠ³Ρƒ воспроизвСсти Π΅Π΅, отпуская Ρ‰Π΅Π»Ρ‡ΠΎΠΊ, ΠΈΠ½ΠΎΠ³Π΄Π° Π΄Π°ΠΆΠ΅ Ρ‡Π΅Ρ€Π΅Π· сСкунду послС Π½Π°Ρ‡Π°Π»Π° пСрСтаскивания.

Π‘ΠΈΠΌΠΏΡ‚ΠΎΠΌΡ‹

Как Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π²Ρ‹ Π²Ρ‹Π·Π²Π°Π»ΠΈ ΠΎΡˆΠΈΠ±ΠΊΡƒ, Firefox пСрСстаСт ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ события пСрСтаскивания, ΠΊΡ€ΠΎΠΌΠ΅ пСрСтаскивания, ΠΏΠΎΡ‡Ρ‚ΠΈ Π½Π° ΠΊΠ°ΠΆΠ΄ΡƒΡŽ Π²ΠΊΠ»Π°Π΄ΠΊΡƒ. Иногда я ΠΌΠΎΠ³Ρƒ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ Π½Π° ΠΎΠ΄Π½ΠΎΠΉ страницС ΠΈΠ·-Π·Π° Ρ€Π΅Π°ΠΊΡ†ΠΈΠΈ Π½Π° Π½Π΅Π΅, ΠΈ Ρ‚ΠΎΠ³Π΄Π° всС ΠΌΠΎΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Π²ΠΊΠ»Π°Π΄ΠΊΠΈ Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‚ ΠΏΡ€ΠΎΡΠ²Π»ΡΡ‚ΡŒ Ρ‚Π΅ ΠΆΠ΅ симптомы.

Π•ΡΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π΄Π²Π° способа Π²Ρ‹ΠΉΡ‚ΠΈ ΠΈΠ· этого сломлСнного состояния. Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π·Π°ΠΊΡ€Ρ‹Ρ‚ΡŒ ΠΈ снова ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ Π±Ρ€Π°ΡƒΠ·Π΅Ρ€. Π’ΠΎ-Π²Ρ‚ΠΎΡ€Ρ‹Ρ…, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π½Π°Ρ‡Π°Ρ‚ΡŒ пСрСтаскиваниС Π½Π° страницу, Π³Π΄Π΅ всС Π΅Ρ‰Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ response-dnd. Как Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π²Ρ‹ это сдСлаСтС, страница, Π²Ρ‹Π·Π²Π°Π²ΡˆΠ°Ρ остановку, ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ событиС dragend. Π’Π°ΠΊ:

  1. Π’ΠΊΠ»Π°Π΄ΠΊΠ° 1 Π²ΠΈΠ΄ΠΈΡ‚ Π½Π°Ρ‡Π°Π»ΠΎ ΠΊΠ»ΠΈΠΊΠ°
  2. На Π²ΠΊΠ»Π°Π΄ΠΊΠ΅ 1 Π½Π΅ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°ΡŽΡ‚ΡΡ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ события, ΠΊΡ€ΠΎΠΌΠ΅ clickstart
  3. ΠžΡ‚ΠΊΡ€ΠΎΠΉΡ‚Π΅ Π²ΠΊΠ»Π°Π΄ΠΊΡƒ 2 ΠΈ Π½Π°Ρ‡Π½ΠΈΡ‚Π΅ ΠΏΠ΅Ρ€Π΅Ρ‚Π°ΡΠΊΠΈΠ²Π°Ρ‚ΡŒ
  4. Π’ΠΊΠ»Π°Π΄ΠΊΠ° 1 Π²ΠΈΠ΄ΠΈΡ‚ ΠΊΠ»ΠΈΠΊ ΠΈ снова Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚

Π’ΠΎΡ‚ Π²ΠΈΠ΄Π΅ΠΎ, ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰Π΅Π΅ это странноС ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ с использованиСм Π΄Π²ΡƒΡ… Π²ΠΊΠ»Π°Π΄ΠΎΠΊ, ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΡ… https://react-dnd.github.io/react-dnd/examples-chessboard-tutorial-app.html.

ReactDnDFirefoxBug.zip

Π― ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽ macOS High Sierra 10.13.3 (17D102) с Firefox 59.0.2 (64-разрядная вСрсия). ΠŸΠΎΡ…ΠΎΠΆΠ΅, это происходит с любой вСрсиСй> = 57. Π― воспроизвСл ΠΎΡˆΠΈΠ±ΠΊΡƒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ response-dnd 2.6.0 ΠΈ 2.5.4.

Π― Π±Ρ‹Π» Π±Ρ‹ Ρ€Π°Π΄ ΠΏΠΎΠΌΠΎΡ‡ΡŒ с Π»ΡŽΠ±Ρ‹ΠΌ тСстированиСм ΠΈΠ»ΠΈ ΠΎΡ‚Π»Π°Π΄ΠΊΠΎΠΉ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ это ΠΈΠ»ΠΈ ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠΈΡ‚ΡŒ ΠΎΠ±Ρ…ΠΎΠ΄Π½ΠΎΠΉ ΠΏΡƒΡ‚ΡŒ, Ссли ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Π² самом Firefox.

browser bug bug wontfix

Π‘Π°ΠΌΡ‹ΠΉ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΉ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

Π‘ΠΈΠ»Π΅Ρ‚ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Mozilla здСсь: https://bugzilla.mozilla.org/show_bug.cgi?id=1452131

ВсС 7 ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

Π― нашСл Π»ΡƒΡ‡ΡˆΠΈΠΉ способ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ ΠΎΡˆΠΈΠ±ΠΊΡƒ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π΄Π°ΠΆΠ΅ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ response-dnd.

ПослС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Π²Ρ‹ сломали страницу, я ΠΌΠΎΠ³Ρƒ Π½Π°ΠΉΡ‚ΠΈ СдинствСнный способ ΠΈΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ это - это ΠΏΠ΅Ρ€Π΅ΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ ΡˆΠ°Ρ…ΠΌΠ°Ρ‚Π½ΡƒΡŽ Ρ„ΠΈΠ³ΡƒΡ€Ρƒ Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ response-dnd ΠΈΠ»ΠΈ ΠΏΠ΅Ρ€Π΅Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ Firefox. Π― Π½Π΅ совсСм ΡƒΠ²Π΅Ρ€Π΅Π½, Ρ‡Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ response-dnd, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΡ‚ΠΊΠ»Π΅ΠΈΡ‚ΡŒ Π΅Π³ΠΎ, ΠΈΠ»ΠΈ ΠΊΠ°ΠΊ Π½Π°ΠΉΡ‚ΠΈ ΠΎΠ±Ρ…ΠΎΠ΄Π½ΠΎΠΉ ΠΏΡƒΡ‚ΡŒ для этого.

<html>
<head>
</head>
<body>
<p>
  Click and drag the draggable item for longer than 1 second to see it dragging.
  Click, drag, and release within 1 second to cause the error.
</p>

<div class="dropzone">
  <div id="draggable" draggable="true" ondragstart="event.dataTransfer.setData('text/plain',null)">
    This div is draggable
  </div>
</div>
<div class="dropzone"></div>
<div class="dropzone"></div>
<div class="dropzone"></div>

<style>
  #draggable {
    width: 200px;
    height: 20px;
    text-align: center;
    background: white;
  }

  .dropzone {
    width: 200px;
    height: 20px;
    background: blueviolet;
    margin-bottom: 10px;
    padding: 10px;
  }
</style>

<script>
  var dragged;

  /* events fired on the draggable target */
  document.addEventListener("drag", function( event ) {
    console.log('drag')
  }, false);

  function sleep(ms){
      var waitTimeInMilliseconds = new Date().getTime() + ms;
      while(new Date().getTime() < waitTimeInMilliseconds ) true;
  }

  document.addEventListener("dragstart", function( event ) {
      // store a ref. on the dragged elem
      dragged = event.target;
      // make it half transparent
      event.target.style.opacity = .5;

      sleep(1000);

      // You can use this approach instead of the sleep. The image is quite
      // large so it's easy to release the mouse before the image is loaded
      // var img = new Image();
      // img.src = 'http://awakeningthegoddesswithin.net/wp/wp-content/uploads/2015/06/moon.jpg';
      // event.dataTransfer.setDragImage(img, 10, 10);
  }, false);

  document.addEventListener("dragend", function( event ) {
    console.log("dragend")
      // reset the transparency
      event.target.style.opacity = "";
  }, false);

  /* events fired on the drop targets */
  document.addEventListener("dragover", function( event ) {
      console.log("dragover")
      // prevent default to allow drop
      event.preventDefault();
  }, false);

  document.addEventListener("dragenter", function( event ) {
      console.log("dragenter")
      // highlight potential drop target when the draggable element enters it
      if ( event.target.className == "dropzone" ) {
          event.target.style.background = "purple";
      }

  }, false);

  document.addEventListener("dragleave", function( event ) {
      console.log("dragleave")
      // reset background of potential drop target when the draggable element leaves it
      if ( event.target.className == "dropzone" ) {
          event.target.style.background = "";
      }

  }, false);

  document.addEventListener("drop", function( event ) {
      console.log("drop")
      // prevent default action (open as link for some elements)
      event.preventDefault();
      // move dragged elem to the selected drop target
      if ( event.target.className == "dropzone" ) {
          event.target.style.background = "";
          dragged.parentNode.removeChild( dragged );
          event.target.appendChild( dragged );
      }
  }, false);
</script>
</body>

Π‘ΠΈΠ»Π΅Ρ‚ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Mozilla здСсь: https://bugzilla.mozilla.org/show_bug.cgi?id=1452131

Π― ΠΌΠΎΠ³Ρƒ это ΠΏΠΎΠ΄Ρ‚Π²Π΅Ρ€Π΄ΠΈΡ‚ΡŒ :(

ΠŸΠΎΠ΄Ρ‚Π²Π΅Ρ€ΠΆΠ΄Π΅Π½ΠΎ

Π’ Firefox внСсСно исправлСниС, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ Π²Ρ‹ΠΏΡƒΡ‰Π΅Π½ΠΎ с Firefox 63 (Π·Π°ΠΏΠ»Π°Π½ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ выпуск Π½Π° 2018-10-23)

Π­Ρ‚Π° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Π±Ρ‹Π»Π° автоматичСски ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½Π° ΠΊΠ°ΠΊ ΡƒΡΡ‚Π°Ρ€Π΅Π²ΡˆΠ°Ρ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π² послСднСС врСмя Π½Π΅ Π±Ρ‹Π»ΠΎ активности. Он Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°ΠΊΡ€Ρ‹Ρ‚, Ссли большС Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ активности. Бпасибо Π·Π° ваш Π²ΠΊΠ»Π°Π΄.

Π­Ρ‚ΠΎ всС Π΅Ρ‰Π΅ происходит со ΠΌΠ½ΠΎΠΉ ΠΊΠ°ΠΊ Π² Fedora 30, Ρ‚Π°ΠΊ ΠΈ Π² Windows 10 (Firefox 69). Π― Ρ‚Π°ΠΊΠΆΠ΅ Π΄ΠΎΠ±Π°Π²ΠΈΠ» эту ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ Π² заявку Firefox. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ послСдний ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ ΠΊ Π±ΠΈΠ»Π΅Ρ‚Ρƒ ΠΏΠ΅Ρ€Π΅Π΄ ΠΌΠΎΠΈΠΌ гласит:

ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ°, ΠΏΠΎ-Π²ΠΈΠ΄ΠΈΠΌΠΎΠΌΡƒ, Ρ‚Π°ΠΊΠΆΠ΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ссли пСрСрисовка Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Π΅Ρ‚ΡΡ Β«Π² основном ΠΏΠΎΡ‚ΠΎΠΊΠ΅Β».
ΠŸΡ€ΠΈ пСрСносС пСрСрисовки Π² requestAnimationFrame () это Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ.

Π§Ρ‚ΠΎ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ±ΠΎΠΉΡ‚ΠΈ ΠΎΡˆΠΈΠ±ΠΊΡƒ Π² Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅?

Π˜Π·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ 19.09.2019:
ΠŸΠΎΡ…ΠΎΠΆΠ΅, Ρ‡Ρ‚ΠΎ Π² Firefox 69 ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ΅Π» рСгрСсс, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ эта ошибка снова появилась, я ΠΏΠΎΠ΄Π°Π» ΠΈΠΌ Π½ΠΎΠ²Ρ‹ΠΉ Ρ‚ΠΈΠΊΠ΅Ρ‚: https://bugzilla.mozilla.org/show_bug.cgi?id=1582401

Π‘Ρ‹Π»Π° Π»ΠΈ эта страница ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ?
0 / 5 - 0 Ρ€Π΅ΠΉΡ‚ΠΈΠ½Π³ΠΈ