React-dnd: Firefox 손싀 이벀트 문제

에 λ§Œλ“  2018λ…„ 04μ›” 05일  Β·  7μ½”λ©˜νŠΈ  Β·  좜처: react-dnd/react-dnd

Firefox μžμ²΄μ—μ„œ 문제λ₯Ό μΌμœΌν‚€λŠ” κ²ƒμœΌλ‘œ λ³΄μ΄λŠ” 맀우 λΆˆμΎŒν•œ 버그λ₯Ό λ°œκ²¬ν–ˆμŠ΅λ‹ˆλ‹€. 체슀 νŠœν† λ¦¬μ–Ό μ˜ˆμ œμ—μ„œλ„μ΄ 였λ₯˜λ₯Ό μž¬ν˜„ ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 기본적으둜 Firefoxκ°€ dragstartλ₯Ό μ œμ™Έν•œ μ–΄λ–€ 마우슀 μ΄λ²€νŠΈλ„ 보내지 μ•ŠλŠ” μƒνƒœλ‘œ λ“€μ–΄κ°ˆ 수 μžˆμŠ΅λ‹ˆλ‹€.

μž¬ν˜„

λ“œλž˜κ·Έ μ†ŒμŠ€λ₯Ό ν΄λ¦­ν•˜κ³  λ“œλž˜κ·Έλ₯Ό μ‹œμž‘ν•˜κ³  미리보기가 λ‚˜νƒ€λ‚˜κΈ° 전에 마우슀λ₯Ό λ†“μŠ΅λ‹ˆλ‹€. μžμŠ΅μ„œ μ˜ˆμ œμ—μ„œ ν•œ 번 μˆ˜ν–‰ν•˜λ©΄ 놓기 λŒ€μƒμ΄ κ°•μ‘° ν‘œμ‹œλ©λ‹ˆλ‹€. λ•Œλ‘œλŠ” 전체 버그λ₯Ό νŠΈλ¦¬κ±°ν•˜κΈ° μœ„ν•΄ μ¦‰μ‹œ λ‹€μ‹œ μˆ˜ν–‰ν•΄μ•Όν•©λ‹ˆλ‹€.

미리보기가 ν‘œμ‹œλ˜λŠ” 데 μ‹œκ°„μ΄ κ±Έλ¦¬λŠ” 느린 νŽ˜μ΄μ§€μ—μ„œμ΄ μž‘μ—…μ„ μˆ˜ν–‰ν•˜λŠ” 것이 훨씬 μ‰½μŠ΅λ‹ˆλ‹€. 맀우 느린 νŽ˜μ΄μ§€κ°€ μžˆλŠ”λ° λ“œλž˜κ·Έλ₯Ό μ‹œμž‘ν•œ ν›„ 1 μ΄ˆλΌλ„ 클릭을 ν•΄μ œν•˜μ—¬ μž¬ν˜„ ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

쑰짐

버그λ₯Ό νŠΈλ¦¬κ±°ν•˜λ©΄ FirefoxλŠ” 거의 λͺ¨λ“  탭에 dragstart μ΄μ™Έμ˜ λ“œλž˜κ·Έ 이벀트 전솑을 μ€‘μ§€ν•˜λŠ” κ²ƒμ²˜λŸΌ λ³΄μž…λ‹ˆλ‹€. λ•Œλ‘œλŠ” ν•œ νŽ˜μ΄μ§€μ—μ„œ 문제λ₯Ό μΌμœΌν‚¬ 수 있으며 λ‹€λ₯Έ λͺ¨λ“  νƒ­μ—μ„œ λ™μΌν•œ 증상을 λ‚˜νƒ€ λ‚΄κΈ° μ‹œμž‘ν•©λ‹ˆλ‹€.

이 κ³ μž₯ μƒνƒœμ—μ„œ λ²—μ–΄λ‚˜λŠ” 방법은 두 κ°€μ§€λΏμž…λ‹ˆλ‹€. λ¨Όμ € λΈŒλΌμš°μ €λ₯Ό λ‹«μ•˜λ‹€κ°€ λ‹€μ‹œ μ—΄ 수 μžˆμŠ΅λ‹ˆλ‹€. λ‘˜μ§Έ, react-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

Firefox 59.0.2 (64 λΉ„νŠΈ)κ°€ μ„€μΉ˜λœ macOS High Sierra 10.13.3 (17D102)을 μ‚¬μš©ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. 57 μ΄μƒμ˜ λͺ¨λ“  λ²„μ „μ—μ„œ λ°œμƒν•˜λŠ” 것 κ°™μŠ΅λ‹ˆλ‹€. react-dnd 2.6.0 및 2.5.4둜 였λ₯˜λ₯Ό μž¬ν˜„ν–ˆμŠ΅λ‹ˆλ‹€.

이 문제λ₯Ό ν•΄κ²°ν•˜κ±°λ‚˜ Firefox μžμ²΄μ— λ¬Έμ œκ°€μžˆλŠ” 경우 ν•΄κ²° 방법을 μ°ΎκΈ° μœ„ν•΄ ν…ŒμŠ€νŠΈ λ˜λŠ” 디버깅에 도움을 λ“œλ¦¬κ² μŠ΅λ‹ˆλ‹€.

browser bug bug wontfix

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

Mozilla둜 μ—΄λ¦° ν‹°μΌ“ : https://bugzilla.mozilla.org/show_bug.cgi?id=1452131

λͺ¨λ“  7 λŒ“κΈ€

react-dndλ₯Ό μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” 버그λ₯Ό μœ λ°œν•˜λŠ” 더 쒋은 방법을 μ°Ύμ•˜μŠ΅λ‹ˆλ‹€.

νŽ˜μ΄μ§€λ₯Ό κΉ¨κ³  λ‚˜λ©΄ 문제λ₯Ό ν•΄κ²°ν•  μˆ˜μžˆλŠ” μœ μΌν•œ 방법은 react-dnd μ˜ˆμ œμ—μ„œ 체슀 쑰각을 μ΄λ™ν•˜κ±°λ‚˜ Firefoxλ₯Ό λ‹€μ‹œ μ‹œμž‘ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€. react-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 ()μ—μ„œ λ‹€μ‹œ 그리기λ₯Ό λž˜ν•‘ν•˜λ©΄ μ˜ˆμƒλŒ€λ‘œ μž‘λ™ν•©λ‹ˆλ‹€.

라이브러리의 버그λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ ν•  μˆ˜μžˆλŠ” 일이 μžˆμŠ΅λ‹ˆκΉŒ?

2019/09/19 μˆ˜μ • :
Firefox 69μ—μ„œμ΄ 버그λ₯Ό λ‹€μ‹œ μ†Œκ°œν•˜λŠ” νšŒκ·€κ°€μžˆλŠ” 것 κ°™μŠ΅λ‹ˆλ‹€. λ‚˜λŠ” κ·Έλ“€κ³Ό ν•¨κ»˜ μƒˆ 티켓을 μ œμΆœν–ˆμŠ΅λ‹ˆλ‹€ : https://bugzilla.mozilla.org/show_bug.cgi?id=1582401

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰