React-dnd: λ“œλž˜κ·Έ κ°€λŠ₯ν•œ ꡬ성 μš”μ†Œ λ‚΄λΆ€μ˜ μž…λ ₯ 및 ν…μŠ€νŠΈ μ˜μ—­ 문제

에 λ§Œλ“  2015λ…„ 06μ›” 02일  Β·  17μ½”λ©˜νŠΈ  Β·  좜처: react-dnd/react-dnd

λ“œλž˜κ·Έ κ°€λŠ₯ν•œ ꡬ성 μš”μ†Œ 내뢀에 <input> 및 <textarea> μš”μ†Œλ₯Ό 배치 ν•  λ•Œ λͺ‡ 가지 문제λ₯Ό μ‘°μ‚¬ν•©λ‹ˆλ‹€.

  1. cmd+A λ˜λŠ” Ctrl+A λ‹¨μΆ•ν‚€λŠ” μž…λ ₯ λ˜λŠ” ν…μŠ€νŠΈ μ˜μ—­μ—μ„œ μž‘λ™ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€ (κ·ΈλŸ¬λ‚˜ Shift + Arrows ν…μŠ€νŠΈ 선택
  2. ν„°μΉ˜ νŒ¨λ“œ / 마우슀둜 μž…λ ₯ λ˜λŠ” ν…μŠ€νŠΈ μ˜μ—­ μ½˜ν…μΈ λ₯Ό μ„ νƒν•˜λ €κ³ ν•˜λ©΄ λΆ€λͺ¨ μš”μ†Œ λŒκΈ°κ°€ μ‹œμž‘λ©λ‹ˆλ‹€.

λ“œλž˜κ·Έ κ°€λŠ₯ν•œ ꡬ성 μš”μ†ŒλŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

draggable component

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

λ“œλž˜κ·Έ κ°€λŠ₯ν•œ λΆ€λͺ¨ μ»¨ν…Œμ΄λ„ˆ 내에 contentEditable이 μ„€μ •λœ μš”μ†ŒλŠ” ν…μŠ€νŠΈλ₯Ό μ„ νƒν•˜κ±°λ‚˜ μ–΄λ–€ 식 μœΌλ‘œλ“  μƒν˜Έ μž‘μš©ν•  수 μ—†μŠ΅λ‹ˆλ‹€. λͺ‡ 가지 쑰사λ₯Ό ν•œ ν›„ λ‹€μŒ 버그 λ³΄κ³ μ„œλ₯Ό μ°Ύμ•˜μŠ΅λ‹ˆλ‹€. https://bugs.chromium.org/p/chromium/issues/detail?id=170139

이후 Chromeμ—μ„œ 문제λ₯Ό ν•΄κ²° ν•œ κ²ƒμœΌλ‘œ λ³΄μž…λ‹ˆλ‹€. κ·Έλ™μ•ˆ CSS둜 Safari의 λ™μž‘μ„ μˆ˜μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

.contenteditable-element {
  user-select: text;
}

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

이것은 selectstart 이벀트의 λ“±λ‘μœΌλ‘œ 인해 λ°œμƒν•˜λ©° IE ν˜Έν™˜μ„±μ„ μœ„ν•΄μ„œλ§Œ ν•„μš”ν•©λ‹ˆλ‹€.
μ €μ²˜λŸΌ IE ν˜Έν™˜μ„±μ΄ ν•„μš”ν•˜μ§€ μ•Šμ€ 경우 λ‹€μŒκ³Ό 같은 λΉ λ₯Έ μˆ˜μ •μ΄ κ°€λŠ₯ν•©λ‹ˆλ‹€.
https://github.com/dperetti/react-dnd/commit/06f74ef97e07a9a24c10eab8593f3e2121d4f2ed

μ‹ κ³  ν•΄ μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€! 이 문제λ₯Ό ν•΄κ²°ν•˜λŠ” PR을 μˆ˜λ½ν•˜κ²Œλ˜μ–΄ κΈ°μ©λ‹ˆλ‹€.

두 가지 μš”κ΅¬ 사항이 μžˆμŠ΅λ‹ˆλ‹€.

  • μ—¬μ „νžˆ IE μˆ˜μ •μ΄ ν•„μš”ν•©λ‹ˆλ‹€.
  • λ‹€λ₯Έ λΈŒλΌμš°μ €μ— preventDefault() 이 ν•„μš”ν•œμ§€ ν™•μΈν•˜μ‹­μ‹œμ˜€. λ“œλž˜κ·Έν•˜λ €λŠ” λͺ¨λ“  ν…μŠ€νŠΈ 선택을 λ°©ν•΄ν•œλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€. μ‹€μ œλ‘œ λ‹€λ₯Έ λΈŒλΌμš°μ €μ—μ„œ μ›μΉ˜ μ•ŠλŠ” 선택을 λ°©μ§€ν•˜λŠ” 데 λ„μ›€μ΄λœλ‹€λ©΄ e.preventDefault() λ₯Ό e.target.tagName !== 'input' (ν•˜μ§€λ§Œ 더 λ˜‘λ˜‘ν•œ 것)둜 λͺ‡ 개의 체크둜 λ‘˜λŸ¬μ‹ΈλŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€.

<div contentEditable={isEditing} /> 와 λ™μΌν•œ 버그.
λ˜ν•œ νŽΈμ§‘ ν•  수 μ—†μŠ΅λ‹ˆλ‹€. Ctrl+A 및 Shift + Arrows λŠ” μž‘λ™ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

μ•žμœΌλ‘œ 3 μ£Ό μ•ˆμ— λ‚˜λŠ” 바쁠 것이고 이것을 κ³ μΉ  μ‹œκ°„μ΄ μ—†μŠ΅λ‹ˆλ‹€.
λ‚΄κ°€ λ§ν–ˆλ“―μ΄ https://github.com/gaearon/react-dnd/issues/178#issuecomment -108110202에 μ„€λͺ… λœλŒ€λ‘œ μˆ˜μ • 된 PR을 μˆ˜λ½ν•˜κ²Œλ˜μ–΄ κΈ°μ©λ‹ˆλ‹€.

이것을 μ‘°μ‚¬ν•˜κ³ μžˆμ—ˆμŠ΅λ‹ˆλ‹€. 전체 handleSelectStart ν•¨μˆ˜ 본문을 주석 μ²˜λ¦¬ν•˜λ©΄ λͺ¨λ“  것이 μ˜ˆμƒλŒ€λ‘œ μž‘λ™ν•©λ‹ˆλ‹€. IE11μ—μ„œ 이것을 ν…ŒμŠ€νŠΈν–ˆκ³  κ±°κΈ°μ—μ„œλ„ 쒋은 것 κ°™μŠ΅λ‹ˆλ‹€.

@gaearon 이벀트λ₯Ό μ²˜λ¦¬ν•΄μ•Όν•˜λŠ” μ΄μœ μ— λŒ€ν•œ νŠΉμ • μ‚¬μš© 사둀 λ˜λŠ” 섀정이 μžˆλŠ”μ§€ μ•Œκ³  μžˆμŠ΅λ‹ˆκΉŒ? IE10? λ“œλž˜κ·Έ κ°€λŠ₯ν•œ λ…Έλ“œμ—μ„œ textarea / input 와 λ‹€λ₯Έ 섀정이 μžˆμŠ΅λ‹ˆκΉŒ? ν…μŠ€νŠΈ 선택 λ¬Έμ œκ°€ λ°œμƒν•˜μ§€ μ•ŠμœΌλ©° ν•„μš”ν•œ 경우 CSS user-select κ°€ preventDefault μ΄μƒμ—μ„œ μž‘λ™ν•˜λŠ”μ§€ κΆκΈˆν•©λ‹ˆλ‹€.

μ›λž˜ λ¬Έμ œλŠ” https://github.com/gaearon/react-dnd/issues/128 μ΄μ—ˆμŠ΅λ‹ˆλ‹€
문제λ₯Ό ν•΄κ²°ν•˜λŠ” PR을 μ€€λΉ„ ν•  수 μžˆμ§€λ§Œ https://github.com/gaearon/react-dnd/issues/128 도 계속 μž‘λ™ν•œλ‹€λ©΄ 큰 도움이 될 κ²ƒμž…λ‹ˆλ‹€.

λ‚΄κ°€ 쑰사 ν•  수 μžˆλŠ”μ§€ λ³Ό κ²ƒμž…λ‹ˆλ‹€. IE9에 λŒ€ν•œ κ°„λ‹¨ν•œ ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€λ₯Ό μ„€μ •ν•˜λŠ” 방법을 μ°Ύμ•„μ•Όν•©λ‹ˆλ‹€.

# 128이 μˆ˜μ •λ˜κΈ° 전에 IE9μ—μ„œ sortable-simple μ˜ˆμ œκ°€ μ‹€νŒ¨ν–ˆλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€.

@gaearon 예, μ‚¬μš©ν•˜κΈ°μ— 쒋은 μ˜ˆμ˜€μŠ΅λ‹ˆλ‹€. κ°μ‚¬ν•©λ‹ˆλ‹€. λͺ‡ 가지 μ°Έκ³  :

  1. λ‹€λ₯Έ λΈŒλΌμš°μ € (ν…ŒμŠ€νŠΈ 된 μ΅œμ‹  Chrome, Safari, FF 및 IE 11)λŠ” 이에 λŒ€ν•΄ μ‹ κ²½ 쓰지 μ•ŠλŠ” 것 κ°™μŠ΅λ‹ˆλ‹€. 이벀트λ₯Ό 처리 ν•  ν•„μš”κ°€ μ—†μŠ΅λ‹ˆλ‹€.
  2. IE9λŠ” e.target.dragDrop() 호좜 만 _ ν•„μš”ν•œ _ κ²ƒμœΌλ‘œ λ³΄μž…λ‹ˆλ‹€. ν…μŠ€νŠΈ 선택을 ν•΄μ œν•˜λŠ”μ— λ“œλž˜κ·Έ λ…Έλ“œλ₯Ό 포μž₯, 전체 λ“œλž˜κ·Έλ₯Ό μ»€λ²„ν•˜λŠ” 핸듀을 μƒμ„±ν•˜μ—¬ μˆ˜ν–‰ ν•  수 μžˆμŠ΅λ‹ˆλ‹€ connectDragPreview 에 ν•Έλ“€ connectDragSource . 이것은 λΆˆμΎŒν•˜κ²Œ 듀릴 수 μžˆμ§€λ§Œ AFAIKλŠ” κ³΅μ‹μ μœΌλ‘œ IE9λ₯Ό μ§€μ›ν•˜μ§€ μ•ŠμœΌλ―€λ‘œ 특히 ν•΄λ‹Ή λΈŒλΌμš°μ €μ—μ„œ λ‹€λ₯Έ λ¬Έμ œκ°€ λ°œμƒν•  κ°€λŠ₯μ„±μ΄μžˆλŠ” 경우 합리적인 ν•΄κ²° λ°©λ²•μž…λ‹ˆκΉŒ?
  3. 두 번째 점은 λ“œλž˜κ·Έ κ°€λŠ₯ ν•­λͺ© 내에 ν…μŠ€νŠΈ μž…λ ₯μ΄μžˆλŠ” κ²½μš°μ—λ„ μœ μš©ν•©λ‹ˆλ‹€. μ‚¬μš©μžλŠ” 전체 λ…Έλ“œμ— connectDragSource λ₯Ό μ μš©ν•˜λ©΄ 마우슀λ₯Ό λ“œλž˜κ·Έν•˜μ—¬ ν…μŠ€νŠΈλ₯Ό 선택할 수 μ—†μ§€λ§Œ (ν…μŠ€νŠΈλ₯Ό μ„ νƒν•˜λŠ” λŒ€μ‹  λ…Έλ“œλ₯Ό λ“œλž˜κ·Έν•˜λŠ” κ²ƒμœΌλ‘œ 끝남) 전체 λ…Έλ“œμ˜ 크기 인 보이지 μ•ŠλŠ” 핸듀에 μ μš©ν•©λ‹ˆλ‹€. μ•„μ£Ό 잘 μž‘λ™ν•©λ‹ˆλ‹€.

이 문제λ₯Ό μ–΄λ–»κ²Œ μ²˜λ¦¬ν• μ§€ ν™•μ‹  ν•  수 μ—†μŠ΅λ‹ˆλ‹€. UA 검사에 μ˜μ§€ν•˜μ§€ μ•Šκ³ λŠ”μ΄ 문제λ₯Ό 처리 ν•  μˆ˜μžˆλŠ” 쒋은 방법이 μžˆλ‹€λŠ” 것을 μ•Œμ§€ λͺ»ν•˜λ©° λΉ„κ³΅μ‹μ μœΌλ‘œ μ§€μ›λ˜λŠ” λΈŒλΌμš°μ €λ₯Ό μ§€μ›ν•˜λŠ” κΈ°λŠ₯을 μΆ”κ°€ν•˜μ—¬ μœ μ§€ 관리 ꡬ멍을 νŒŒν—€μΉ  μˆ˜μžˆλŠ” 쒋은 λΈŒλΌμš°μ €λ₯Ό νŒŒκ΄΄ν•˜λŠ” κ²ƒμ²˜λŸΌ λ³΄μž…λ‹ˆλ‹€. ν•˜μ§€λ§Œ 그게 제 μ˜κ²¬μž…λ‹ˆλ‹€. μ–΄μ¨Œλ“  λ‹€λ₯Έ λ¬Έμ œλ„ ν•΄κ²°ν•˜λŠ”μ΄ λ¬Έμ œμ— λŒ€ν•œ ν•΄κ²° 방법이 μžˆμŠ΅λ‹ˆλ‹€.

selectstart λŒ€ν•œ 이벀트 λ¦¬μŠ€λ„ˆλ₯Ό μ œκ±°ν•˜λ©΄ contentEditable κ°€ Chromeμ—μ„œ μž‘λ™ν•˜μ§€λ§Œ Safariμ—μ„œλŠ” μž‘λ™ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

https://github.com/gaearon/react-dnd/commit/0a36033693868a7985ea2348105da4fb2cef8a00에 μ˜ν•΄ μˆ˜μ •λ˜μ—ˆμŠ΅λ‹ˆλ‹€

selectstart에 λŒ€ν•œ 이벀트 λ¦¬μŠ€λ„ˆλ₯Ό μ œκ±°ν•˜λ©΄ contentEditable이 Chromeμ—μ„œ μž‘λ™ν•˜μ§€λ§Œ μ—¬μ „νžˆ Safariμ—μ„œλŠ” μž‘λ™ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

이것은 Safari의 HTML5 λ“œλž˜κ·Έ μ•€ λ“œλ‘­ API λ¬Έμ œμž…λ‹ˆλ‹€. μš°λ¦¬κ°€ ν•  μˆ˜μžˆλŠ” 일은 μ—†μŠ΅λ‹ˆλ‹€.

이 λ¬Έμ œμ— λŒ€ν•œ μˆ˜μ • 사항은 [email protected] 에 λ¦΄λ¦¬μŠ€λ˜μ—ˆμŠ΅λ‹ˆλ‹€.
μž‘λ™ν•˜λŠ”μ§€ ν™•μΈν•˜μ‹­μ‹œμ˜€.

Ctrl / Cmd-Aκ°€ λ“œλž˜κ·Έ κ°€λŠ₯ν•œ ꡬ성 μš”μ†Œ λ‚΄ <input> μ—μ„œ μž‘λ™ν•˜λŠ”μ§€ ν™•μΈν–ˆμŠ΅λ‹ˆλ‹€.

ν„°μΉ˜ νŒ¨λ“œ / 마우슀둜 μž…λ ₯ λ˜λŠ” ν…μŠ€νŠΈ μ˜μ—­ μ½˜ν…μΈ λ₯Ό μ„ νƒν•˜λ €κ³ ν•˜λ©΄ λΆ€λͺ¨ μš”μ†Œ λŒκΈ°κ°€ μ‹œμž‘λ©λ‹ˆλ‹€.

이 λ¬Έμ œκ°€ ν•΄κ²°λ˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€. μƒˆ 문제λ₯Ό λ§Œλ“œμ‹œκ² μŠ΅λ‹ˆκΉŒ?

λ“œλž˜κ·Έ κ°€λŠ₯ν•œ λΆ€λͺ¨ μ»¨ν…Œμ΄λ„ˆ 내에 contentEditable이 μ„€μ •λœ μš”μ†ŒλŠ” ν…μŠ€νŠΈλ₯Ό μ„ νƒν•˜κ±°λ‚˜ μ–΄λ–€ 식 μœΌλ‘œλ“  μƒν˜Έ μž‘μš©ν•  수 μ—†μŠ΅λ‹ˆλ‹€. λͺ‡ 가지 쑰사λ₯Ό ν•œ ν›„ λ‹€μŒ 버그 λ³΄κ³ μ„œλ₯Ό μ°Ύμ•˜μŠ΅λ‹ˆλ‹€. https://bugs.chromium.org/p/chromium/issues/detail?id=170139

이후 Chromeμ—μ„œ 문제λ₯Ό ν•΄κ²° ν•œ κ²ƒμœΌλ‘œ λ³΄μž…λ‹ˆλ‹€. κ·Έλ™μ•ˆ CSS둜 Safari의 λ™μž‘μ„ μˆ˜μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

.contenteditable-element {
  user-select: text;
}

@trevorsmith 이것은 μ—¬μ „νžˆ ​​Firefox의 λ™μž‘μ„ μˆ˜μ •ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. Firefox에 λŒ€ν•œ ν•΄κ²° 방법을 μ•Œκ³  μžˆμŠ΅λ‹ˆκΉŒ?

@ rahul1995- 방금 해결책을 μ°Ύμ•˜μŠ΅λ‹ˆλ‹€. λ“œλž˜κ·Έ κ°€λŠ₯ν•œ DOM λ…Έλ“œμ— μ°Έμ‘°λ₯Ό μ €μž₯ν•˜κ³  μ‚¬μš©μžκ°€ μž…λ ₯ / ν…μŠ€νŠΈ μ˜μ—­μ— 집쀑할 λ•Œ draggable 속성을 false .

const Test = () => {
  const ref = useRef(null);
  const [focused, setFocused] = useState(false);
  const [_, drag] = useDrag({ item: { type: 'test' } });

  useEffect(() => {
    if (ref.current) {
      ref.current.setAttribute('draggable', !focused);
    }
  }, [focused]);

  return drag(
    <textarea ref={ref} onFocus={() => setFocused(true)} onBlur={() => setFocused(false)}></textarea>
  );
};

이것은 Firefoxλ₯Όμœ„ν•œ νŠΈλ¦­μ„ ν•  κ²ƒμž…λ‹ˆλ‹€ : wink :

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