TIL/기타

jQuery함수 Javascript로 구현하기

에리조나진생 2023. 12. 24. 23:02

모 회사를 지원하면서 과제 전형으로 알고리즘과 페이지 구현, 그리고 밑의 과제를 받았다. 

이 과제를 제일 열심히 했었는데, 그 이유는 이 과제에 있던 한 문장 때문이었다.

'현재 지원자 중 정답자가 없는 문제입니다'

이 문장을 보고 '아 이건 꼭 풀어야겠다'고 생각해서 열심히 풀었던거 같다.

javascript를 배우면서 jquery는 안 배웠는데 이렇게라도 jquery 공부를 해본게 추후에 도움이 되면 좋겠다.

// 여기에 정답을 작성해주세요

class Selector {
  // 생성자에서 인자에 해당하는 요소들을 배열로 element에 저장합니다.
  constructor(args) {
    this.element = document.querySelectorAll(args);
  }
  // 메서드 체이닝이 가능하도록 메서드 실행 후 객체를 반환합니다.
  addClass(args) {
    this.element.forEach((cur) => {
      cur.classList.add(args);
    });
    return this;
  }
  removeClass(args) {
    this.element.forEach((cur) => {
      cur.classList.remove(args);
    });
    return this;
  }
  css(...args) {
    if (typeof args[0] == 'string') { // 문자열로 들어오는 경우입니다.
      this.element.forEach((cur) => {
        cur.style[args[0]] = args[1];
      });
    } else { // object로 들어오는 경우입니다.
      this.element.forEach((cur) => {
        for (let v in args[0]) {
          if (isNaN(args[0][v])) { // (숫자만으로 이뤄지지 않은 경우) = 'px'이 붙은 경우
            cur.style[v] = args[0][v];
          } else {
            cur.style[v] = args[0][v] + 'px';
          }
        }
      });
    }
    return this;
  }
  fadeOut(args) { // duration 기본값 400, easing 기본값 swing(0.5 - Math.cos( p * Math.PI ) / 2)
    this.element.forEach((cur) => {
      cur.style.transition = 'opacity 400ms cubic-bezier(0.420, 0.000, 0.580, 1.000)';
      cur.style.opacity = 0;
      setTimeout((v) => {
        v.style.display = 'none';
      }, 400, cur);
      args();
    });
    return this;
  }
}

// 객체 생성 후 반환합니다.
function $(args) {
  let target = new Selector(args);
  return target;
}




// 아래 코드는 수정하지 않습니다

// 1
$('#target-1').removeClass('border');

// 2
$('#target-1').css('left', '250px');

// 3
$('.target-2').removeClass('border').addClass('blue');

// 4
$('.target-2').css({ 'left': 50, 'margin-top': '-15px' })

// 5
$('#target-3').fadeOut(() => $('#target-4').addClass('green'));

 

해당 과제에 대한 피드백은 다음 면접에서 바로 이뤄졌고, 일단 setTimeout으로 발생하는 문제점에 대해 질문이 들어왔었다. 이벤트루프가 블락되면 저 400ms라는 시간에 맞춰서 작동하지 않는다는 답변이었는데, 난 이때 얼버무리며 제대로 답변을 못드렸다. 다음엔 실수하지 말아야지.

'TIL > 기타' 카테고리의 다른 글

npm install 에러(peerDependencies)  (0) 2024.05.15
Docker 란?  (0) 2024.04.17
API_KEY를 안전하게 관리하는 방법  (0) 2024.01.31