[Vanilla JS] VanillaJS로 구현한 AJAX 작성일 2020-06-11 | In Frontend 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118export const parseJSXstr = (parent, JSXstr) => { const processedJSXstr = preprocessJSXstr(JSXstr) const result = generateObject(processedJSXstr, 0) const generatedJSXobj = result.JSXobj parseJSXobj(parent, generatedJSXobj) } const parseJSXobj = (parent, JSXobj) => { const ignorePropertyList = ["type", "children"] const $element = document.createElement(JSXobj.type) // Handle properties that need to be added to the element for (let prop in JSXobj){ if(!ignorePropertyList.includes(prop)) $element[matchPropName(prop)] = JSXobj[prop] } // Handle children elements if("children" in JSXobj){ JSXobj.children.forEach((childElem, index) => { parseJSXobj($element, childElem) }) } parent.appendChild($element) } const stripString = (str) => { return str.replace(/^\s+|\s+$/g, ''); }; const matchPropName = (prop) => { const substituteReacttoVanilla = { text: "textContent", onClick: "onclick" } if(prop in substituteReacttoVanilla) return substituteReacttoVanilla[prop] else return prop } const preprocessJSXstr = (JSXstr) => { const splitStr = JSXstr.split('<') return splitStr .filter(str => { //Handle empty string elements if(!stripString(str)) return false return true }) .map(str => { return stripString(str) }) } const generateObject = (arr, checkIndex) => { let obj = { children: [] } let generatedObj //Found Closing Tag if(arr[checkIndex][0] == '/'){ return { nextCheckIndex: checkIndex + 1, JSXobj: null } } //If not starting with closing tag else { generatedObj = generateObject(arr, checkIndex+1) //loop until my closing tag appears while(true){ //return from children element if(generatedObj.JSXobj != null){ obj.children.push(generatedObj.JSXobj) generatedObj = generateObject(arr, generatedObj.nextCheckIndex) } //return from closing tag else break } } let element = arr[checkIndex] //Cut out onClick function string const searchTermStart = " onClick" const startIndex = element.indexOf(searchTermStart) if(startIndex !== -1){ const searchTermEnd = "}" const endIndex = element.lastIndexOf(searchTermEnd) //Assign onclick const tempFuncStr = element.slice(startIndex,endIndex) const funcStartIndex = tempFuncStr.indexOf("{") obj.onclick = eval(tempFuncStr.slice(funcStartIndex+1, endIndex)) const tempElement = element.slice(0, startIndex) + element.slice(endIndex+1,element.length) element = tempElement } const elementContent = element.split('>') obj.text = elementContent[1] const elementProps = elementContent[0].split(' ') elementProps.forEach((prop, index) => { if(index === 0) obj.type = prop else{ //split prop name and value const splitProp = prop.split('=') const propName = splitProp[0] const propValue = splitProp[1].replace(/"/g,"").replace(/'/g,"") obj[propName] = propValue } }) return { nextCheckIndex: generatedObj.nextCheckIndex, JSXobj: obj } }