์‹œ๊ฐ„์ด ์ง€๋‚œ ํ›„, ์ฝ”๋“œ๋ฅผ ๋ฆฌํŒฉํ† ๋ง ํ•˜๋Š” ๊ณผ์ •์—์„œ ์ž‘์—… ์ด์œ ์— ๋Œ€ํ•ด ์ฐพ์•„๋ณด๊ธฐ ์œ„ํ•ด TIL ์นดํ…Œ๊ณ ๋ฆฌ๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค!

 

์˜ค๋Š˜์€ Vanilla JavaScript๋กœ ์›น ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋งŒ๋“ค๋˜ ์ค‘ ๋งˆ์šฐ์Šค ๋‹ค์šด(mousedown) ์ด๋ฒคํŠธ์™€ ๋งˆ์šฐ์Šค ์—…(mouseup) ์ด๋ฒคํŠธ, ๊ทธ๋ฆฌ๊ณ  ํด๋ฆญ(click) ์ด๋ฒคํŠธ ๊ฐ„์˜ ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•ด, ๊ฐ ์ด๋ฒคํŠธ์˜ ๋™์ž‘์ด ์„œ๋กœ ๋…๋ฆฝ์ ์œผ๋กœ ์‹คํ–‰๋  ์ˆ˜ ์žˆ๋„๋ก ์กฐ์ •ํ•œ ๋‚ด์šฉ์„ ๊ฐ„๋‹จํžˆ ๊ธฐ๋กํ•˜๋ คํ•ฉ๋‹ˆ๋‹ค.

 

 

eventType์— ์™œ click์ด ์˜ค์ง€ ์•Š์„๊นŒ..?!

๋ฌธ์ œ ์ƒํ™ฉ: ๋‘ ๊ฒฝ์šฐ์˜ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋ง

์‚ฌ์šฉ์ž๊ฐ€ ์ƒํ’ˆ ๋ฒ„ํŠผ์„ ํด๋ฆญํ–ˆ์„ ๋•Œ, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค:

  1. ์ž”์•ก์ด ๋ถ€์กฑํ•œ ๊ฒฝ์šฐ
  2. ์ž”์•ก์ด ์ถฉ๋ถ„ํ•œ ๊ฒฝ์šฐ
  3. ๋งˆ์šฐ์Šค ๋‹ค์šด/์—… ์ด๋ฒคํŠธ์™€ ํด๋ฆญ ์ด๋ฒคํŠธ์˜ ์ƒํ˜ธ์ž‘์šฉ

์ด๋Ÿฌํ•œ ์ƒํ™ฉ์—์„œ ๋งˆ์šฐ์Šค ์—… ์ด๋ฒคํŠธ์˜ ๋™์ž‘์— ๊ฐ€๋ ค์ ธ ํด๋ฆญ ์ด๋ฒคํŠธ๊ฐ€ ๋™์ž‘ํ•˜์ง€ ์•Š๋Š” ์ƒํ™ฉ์ด ๋ฐœ์ƒํ–ˆ์–ด์š”.

 

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•: ์กฐ๊ฑด๋ถ€ ์ด๋ฒคํŠธ ๋“ฑ๋ก

๋จผ์ € ๊ธฐ์กด ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.

  setEvent() {
    const { onSelect, onMouseDown, onMouseUp } = this.props;

    if (onSelect) {
      this.addEvent('click', '.product-button', (e) => {
        const button = e.target.closest('.product-button');
        if (!button) return;
        const productId = Number(button.dataset.id);
        onSelect(productId);
      });
    }

    if (onMouseDown) {
      this.addEvent('mousedown', '.product-button', onMouseDown);
    }

    if (onMouseUp) {
      this.addEvent('mouseup', '.product-button', onMouseUp);
    }
  }

 

๋ณ€๊ฒฝ๋œ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.

setEvent() {
  const { onSelect, onMouseDown, onMouseUp, product } = this.props;

  // ๊ฐ€๊ฒฉ์ด ๋ถ€์กฑํ•  ๋•Œ๋งŒ mousedown/mouseup ์ด๋ฒคํŠธ ๋“ฑ๋ก
  if (onMouseDown && this.state.balance < product.price) {
    this.addEvent('mousedown', '.product-button', () => {
      onMouseDown(product);
    });
    this.addEvent('mouseup', '.product-button', () => {
      onMouseUp();
    });
  } else {
    // ๊ฐ€๊ฒฉ์ด ์ถฉ๋ถ„ํ•˜๊ฑฐ๋‚˜ ์กฐ๊ฑด์— ๋งž์ง€ ์•Š์œผ๋ฉด click ์ด๋ฒคํŠธ๋งŒ ๋“ฑ๋ก
    this.addEvent('click', '.product-button', (e) => {
      const button = e.target.closest('.product-button');
      if (!button) return;
      const productId = Number(button.dataset.id);
      onSelect(productId);
    });
  }
}

 

ํ•ต์‹ฌ ์ ‘๊ทผ ๋ฐฉ์‹

  1. ์กฐ๊ฑด๋ถ€ ์ด๋ฒคํŠธ ๋“ฑ๋ก: ํ˜„์žฌ ์ƒํƒœ์— ๋”ฐ๋ผ ์ ์ ˆํ•œ ์ด๋ฒคํŠธ๋ฅผ ๋™์ ์œผ๋กœ ๋ฐ”์ธ๋”ฉํ•ฉ๋‹ˆ๋‹ค.
  2. ์ด๋ฒคํŠธ ์œ„์ž„: closest() ๋ฉ”์„œ๋“œ๋ฅผ ํ™œ์šฉํ•ด ์ด๋ฒคํŠธ ๋ฒ„๋ธ”๋ง์„ ํšจ์œจ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. (๊ธ€์—๋Š” ์—†์ง€๋งŒ component.js์—์„œ ์ฒ˜๋ฆฌ)
  3. ์ƒํƒœ ๊ธฐ๋ฐ˜ ๋กœ์ง: balance์™€ product.price๋ฅผ ๋น„๊ตํ•˜์—ฌ ์ด๋ฒคํŠธ ํ๋ฆ„์„ ์ œ์–ดํ•ฉ๋‹ˆ๋‹ค.

 

+ Recent posts