바닐라 자바 스크립트에서 라이브러리와 같은 JQuery 만들기
32741 단어 javascript
참고: 라이브러리에는 아래 테스트 케이스를 처리하는 몇 가지 방법만 있습니다.
테스트 케이스 [파일: js/index.js]
$_(() => { // jQuery document ready equivalent
console.log('This is from Dom Content loaded');
$_('h1').css('color', 'red'); // jQuery css()
$_('h2').css({'color': 'green', 'text-decoration': 'underline'});
console.log($_('h1').html()); // jQuery html()
console.log($_('h2').text()); // jQuery text()
$_('#btnAlert').on('click', () => alert('Hai From Button')); // jQuey on()
$_('ul>li').each(function (itx){ // jQuery each()
if(itx%2 === 0) {
$_(this).css('color', 'red');
}
})
});
샘플 라이브러리 구현
const $_ = (argument) => {
};
const getArgumentType = option => typeof option;
const $_ = (argument) => {
const argumentType = getArgumentType(argument);
};
const $_ = (argument) => {
const argumentType = getArgumentType(argument);
if(argumentType === 'function') {
window.addEventListener("DOMContentLoaded", argument);
return;
}
};
const $_ = (argument) => {
const argumentType = getArgumentType(argument);
if(argumentType === 'function') {
...
}
if(argumentType === 'string') {
const elements = document.querySelectorAll(argument);
return elements;
}
};
const $_ = (argument) => {
const argumentType = getArgumentType(argument);
if(argumentType === 'function') {
...
}
if(argumentType === 'string') {
...
}
if(argumentType === 'object' && argument instanceof HTMLElement) {
const elements = [argument];
return elements;
}
};
메서드를 추가할 수 있도록 요소 개체가 배열에 추가됩니다.
const addEventToElements = (elements) => {
addEvents(elements, "css", (...opts) =>
setPropertyCustomLogic(elements, "style", opts, (ele, prop, key, value) => {
ele[prop][key] = value;
})
);
addEvents(elements, "html", () => elements[0].innerHTML);
addEvents(elements, "text", () => elements[0].textContent);
addEvents(elements, "on", (...opts) =>
addListener(elements, opts[0], opts[1])
);
addEvents(elements, "each", (opts) => {
invokeCallbackForElements(elements, opts);
});
};
const $_ = (argument) => {
...
if(argumentType === 'string') {
...
addEventToElements(elements);
...
}else if(argumentType === 'object' && argument instanceof HTMLElement) {
...
addEventToElements(elements);
...
}
};
addEventToElements 메소드는 선택된 요소에서 사용할 수 있도록 테스트 케이스에서 언급된 모든 이벤트를 추가하는 데 사용됩니다. 이 방법은 몇 가지 도우미 기능을 사용합니다. 모든 코드는 아래에 나와 있습니다
라이브러리 함수 코드 [js/lib.js 파일]
const getArgumentType = option => typeof option;
const createObjectFromArray = arr => Object.fromEntries([arr]);
const addListener = (elements, action, listener) => {
elements.forEach(ele => ele.addEventListener(action, listener));
};
const invokeCallbackForElements = (elements, callback) => {
elements.forEach((ele, itx) => {
const fn = callback.bind(ele);
fn(itx);
});
};
const setPropertyCustomLogicForElements = (elements, prop, options, customFn) => {
elements.forEach((ele) => {
for (const key in options) {
customFn(ele, prop, key, options[key]);
}
});
};
const setPropertyCustomLogic = (elements, prop, data, customFn) => {
const dataType = getArgumentType(data[0]);
if (dataType === "string") {
setPropertyCustomLogicForElements(
elements,
prop,
createObjectFromArray([data[0], data[1]]),
customFn
);
} else if (dataType === "object") {
setPropertyCustomLogicForElements(elements, prop, data[0], customFn);
}
};
const addEvents = (ele, prop, callback) => {
ele[prop] = callback;
};
const addEventToElements = (elements) => {
addEvents(elements, "css", (...opts) =>
setPropertyCustomLogic(elements, "style", opts, (ele, prop, key, value) => {
ele[prop][key] = value;
})
);
addEvents(elements, "html", () => elements[0].innerHTML);
addEvents(elements, "text", () => elements[0].textContent);
addEvents(elements, "on", (...opts) =>
addListener(elements, opts[0], opts[1])
);
addEvents(elements, "each", (opts) => {
invokeCallbackForElements(elements, opts);
});
};
const $_ = (argument) => {
const argumentType = getArgumentType(argument);
if(argumentType === 'function') {
window.addEventListener("DOMContentLoaded", argument);
return;
}
if(argumentType === 'string') {
const elements = document.querySelectorAll(argument);
addEventToElements(elements);
return elements;
}else if(argumentType === 'object' && argument instanceof HTMLElement) {
const elements = [argument];
addEventToElements(elements);
return elements;
}
};
lib.js 및 index.js가 index.html에 추가됩니다.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Library - Sample HTML</title>
</head>
<body>
<div id="main">
<h1>header</h1>
<h2>Sub Header</h2>
<button id="btnAlert" type="button">Alert JS</button>
<ul>
<li>1</li>
<li>2</li>
<li>3</li>
<li>4</li>
<li>5</li>
</ul>
</div>
<script src="./js/lib.js"></script>
<script src="./js/index.js"></script>
</body>
</html>
Reference
이 문제에 관하여(바닐라 자바 스크립트에서 라이브러리와 같은 JQuery 만들기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/paprajith/create-a-jquery-like-library-in-vanilla-javascript-3m9d텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)