[์ด์๋ฆฌํฌํธ] Javascript window๊ฐ ์ ๋ณด ์ ๋ฌ
๐ ํ๋ก์ ํธ ์๋ฐ์
ํ์ฌ ๋๋ NHN academy ๋ฐฑ์๋ ๊ณผ์ ์์ ๊ฐ๋ฐ ๊ต์ก์ ๋ฐ๊ณ ์๋ค. ์ต๊ทผ 1~2๋ฌ๊ฐ์ Java์ ๊ธฐ์ด๋ถํฐ ์์ฉ๊น์ง ์๋นํ ์ง์๋ค์ ๊ต์ก๋ฐ์ ์ ์์๊ณ , ์ด์ ๋ ๋ณธ๊ฒฉ์ ์ธ ํ๋ก์ ํธ๋ฅผ ์ํ ์๋ฐ์ ์ ๋ค์ด๊ฐ๋ค. ๋ฐฑ์๋ ๊ณผ์ ์ด์ง๋ง ์๋ฒ๋ฅผ ๋ง๋ค์๋ค๊ณ ํด์ ๋์ ๋ณด์ด์ง๋ ์๋ ๋ฒ..! ๊ธฐ๋ณธ์ ์ธ ํ๋ก ํธ์๋๋ฅผ ํ ์ ์์ด์ผ ๋ด๊ฐ ๋ง๋ ์๋ฒ๋ฅผ ํ์ธํ ์ ์๊ธฐ์.. ๊ธฐ๋ณธ์ ์ธ ํ๋ก ํธ ๊ณผ์ ์ ์งง๊ฒ ์งํํ๋ค. ๊ทธ ๊ณผ์ ์์ ์๋ ์ด์๋ฅผ ์ ๊ณ ์ ํ๋ค.
๐ค ๋ถ๋ชจ์ฐฝ? ์์์ฐฝ?
์ฝ๋ก๋ 19 ํํฉ ๋ฐ์ดํฐ๋ฅผ ํตํด ์ผ์๋ณ, ๋์๋ณ, ๊ตญ๊ฐ๋ณ๋ก ์ ๋ณด๋ฅผ ์์ฒญํ ํ ๋ฐ์์ ์น์ ์ถ๋ ฅํด์ฃผ๋ฉด ๋๋ค. ๊ทธ ์ค ๋์๋ณ, ๊ตญ๊ฐ๋ณ์ ๋ฉ์ธ์๋ ์ค๋ ๊ธฐ์ค์ ์ต์ข ๋ฐ์ดํฐ๋ง์ ์ถ๋ ฅํ๊ณ , ์ง์ญ์ด๋ ๊ตญ๊ฐ์ ์ด๋ฆ์ ํด๋ฆญํ๋ฉด ๊ฐ๊ฐ์ ์๋ณ ๋ฐ์ดํฐ๊ฐ ์ถ๋ ฅ๋๋ฉด ๋๋ค. ๋จ, ๊ธฐ์กด์ฐฝ์ด ์๋ ์์ฐฝ์์ ์ด์ด์ผํ๋ค.
๋ถ๋ชจ์ฐฝ์ ๋ด๊ฐ ์ ์ฐฝ์ ์ด ์ ์๋ ๋ฒํผ์ ๊ฐ๊ณ ์๋ ์ฐฝ์ด๋ค. ์ฆ, ๋ฉ์ธ ํ์ด์ง๋ค. ๋ถ๋ชจ์ฐฝ์์ ๋์ ์ด๋ฆ์ ํด๋ฆญํ๋ฉด ์ ์ฐฝ์ด ๋จ๊ฒ ๋๋๋ฐ ์ด๊ฒ์ ์์์ฐฝ์ด๋ผ๊ณ ํ๋ค. ์ฌํํผ ๋ถ๋ชจ์ฐฝ์ ์ ๋ณด๋ฅผ ์์์ฐฝ์ ๋ณด๋ด์ค ํ์๊ฐ ์๋๋ฐ, ์ด๋ฒ์ ๊ณต๋ถํ๋ฉด์ ํ๋ก ํธ ๋จ์์๋ ์ ๋ณด๋ฅผ ๊ตํํ ์ ์๋ค๋ ๊ฒ์ ์๊ฒ ๋๋ค.
๐ ์ ๋ณด๋ฅผ ์ ๋ฌํ๊ธฐ
์์์ฐฝ์ ๋ณ์๋ก ์ง์ ํ ํ ๊ฐ ๋๊ธฐ๊ธฐ, window.opener ์ฌ์ฉํ๊ธฐ, postMessage() ํจ์ ์ฌ์ฉํ๊ธฐ ๋ฑ.. ์ ๋ง ๋ค์ํ ๋ฐฉ๋ฒ๋ค์ด ์กด์ฌํ๋ค. ๋ค์ํ ๋ฐฉ๋ฒ๋ค์ ๋ค๋ฅธ ๋ธ๋ก๊ทธ์ ๋ ์ ๋์์์ด์ ๋ค๋ฃฐ ํ์๊ฐ ์๊ธฐ๋ ํ๊ณ , ๋ด๊ฒ ํ์ํ ๋ฐฉ๋ฒ๋ค์ ์๋์๋ค. ๋ฌผ๋ก , postMessage()๋ฅผ ํ์ฉํ ๋ฐฉ๋ฒ์ ์ด๋ ค์๋ณด์ฌ์ ํฌ๊ธฐํ๋ค. ^^;;
๊ทธ๋ ๋ค๋ฉด ๋๋ ์ด๋ป๊ฒ ์ ๋ณด๋ฅผ ๋๊ฒผ๋๋ณด๋ฉด, url ๊ฐ์ผ๋ก ์ ๋ณด๋ฅผ ๋๊ฒผ๋ค. (๋ฌผ๋ก ... ๋๋ ๋ถ๋ชจ์ฐฝ์์ ๋ฐ์ดํฐ๋ฅผ ๋ชจ๋ ์
๋ ฅํ ๋ฐฐ์ด์ ์์์ฐฝ์ ๊ทธ๋๋ก ์ ๋ฌํด์ฃผ๊ณ ์ถ์๋ค... ํ์ง๋ง ์ด๋กํ๊ฒ ๋.. ๊ทธ๊ฑด ์๋๋๋ฐ... ใ
ใ
)
'use strict';
const serviceKey = "์๋น์คํค";
let targetItemList = [];
function getMainItem() {
const promise = new Promise(function(resolve, reject) {
const xhr = new XMLHttpRequest();
const url = `http://openapi.data.go.kr/openapi/service/rest/Covid19/getCovid19SidoInfStateJson`;
let queryParams = "?" + encodeURIComponent("serviceKey") + "=" + serviceKey;
queryParams += '&' + encodeURIComponent('pageNo') + '=' + encodeURIComponent('1'); /**/
queryParams += '&' + encodeURIComponent('numOfRows') + '=' + encodeURIComponent('10'); /**/
queryParams += '&' + encodeURIComponent('startCreateDt') + '=' + encodeURIComponent('20220930'); /**/
queryParams += '&' + encodeURIComponent('endCreateDt') + '=' + encodeURIComponent('20220930'); /**/
let uri = url + queryParams;
xhr.open("GET", uri);
xhr.onreadystatechange = function() {
if (this.readyState == 4) {
resolve(this.responseText);
}
};
xhr.send('');
}).then(function(result) {
let xml = new DOMParser().parseFromString(result, "text/html");
let item = xml.getElementsByTagName("item");
let itemList = [];
for (let i = 0; i < item.length; i++) {
let createDt = item[i].getElementsByTagName("createDt")[0].innerHTML;
let gubun = item[i].getElementsByTagName("gubun")[0].innerHTML;
let defCnt = item[i].getElementsByTagName("defCnt")[0].innerHTML;
let incDec = item[i].getElementsByTagName("incDec")[0].innerHTML;
let element = {
createDt,
gubun,
defCnt,
incDec
}
itemList.push(element);
}
itemList.reverse();
let targetTable = document.getElementById("table_body");
targetTable.innerHTML = "";
for (let i = 0; i < itemList.length; i++) {
let createDt = itemList[i].createDt;
let gubun = itemList[i].gubun;
let defCnt = itemList[i].defCnt;
let incDec = itemList[i].incDec;
const targetRow = document.createElement("tr");
targetRow.setAttribute("id", `targetRow_${i}`);
const regionTd = document.createElement("td");
const stackTd = document.createElement("td");
const newTd = document.createElement("td");
regionTd.setAttribute("id", `region_${i}`);
regionTd.setAttribute("class", "row region_column");
stackTd.setAttribute("id", `stack_${i}`);
stackTd.setAttribute("class", "row stack_column")
newTd.setAttribute("id", `new_${i}`);
newTd.setAttribute("class", "row new_column");
if (gubun == 'ํฉ๊ณ' || gubun == '๊ฒ์ญ') {
regionTd.innerHTML = `<a>${gubun}</a>`;
} else {
regionTd.innerHTML = `<a onclick="openChild('${gubun}')" href="#">${gubun}</a>`;
}
// ํ
์คํธ๋ฅผ ๋๋ฅด๋ฉด ํ
์คํธ๊ฐ์ ์์์ฐฝ์ ๋๊ธด๋ค.
stackTd.innerHTML = `${defCnt}`;
newTd.innerHTML = `${incDec}โฒ`;
targetRow.appendChild(regionTd);
targetRow.appendChild(stackTd);
targetRow.appendChild(newTd);
targetTable.appendChild(targetRow);
}
})
}
window.addEventListener("DOMContentLoaded", function() {
getMainItem();
})
let childPage;
function openChild(value) {
childPage = window.open(`new_tab.html?param=${value}`);
// ์์ฐฝ์ ๋์ฐ๋ ํ์ผ ๊ทธ๋ฆฌ๊ณ ๊ทธ ๋ค์ param์ผ๋ก ์์๋ก url์ ์ถ๊ฐํจ.
}
์์ ๊ฐ์ด ์์์ฐฝ์ ๋์ธ ๋ ์์๋ก url์ ํ๋ผ๋ฏธํฐ ๊ฐ์ ๋๊ธฐ๋๋ก ํ๊ณ , ์ด ํ๋ผ๋ฏธํฐ ๊ฐ์ ์์์ฐฝ์์ ๋ฐ์ ๋๋ decodeURI๋ฅผ ์ฌ์ฉํ๋ค.
'use strict';
const serviceKey = "์๋น์คํค";
//url๋ก ๋์ด์จ value๊ฐ์ ์ธํ
let queryString = decodeURI(this.location).split("?param=");
let value = queryString[1];
console.log(queryString);
console.log(value);
function getItems() {
const promise = new Promise(function(resolve, reject) {
const xhr = new XMLHttpRequest();
const url = `http://openapi.data.go.kr/openapi/service/rest/Covid19/getCovid19SidoInfStateJson`;
let queryParams = "?" + encodeURIComponent("serviceKey") + "=" + serviceKey;
queryParams += '&' + encodeURIComponent('pageNo') + '=' + encodeURIComponent('1'); /**/
queryParams += '&' + encodeURIComponent('numOfRows') + '=' + encodeURIComponent('10'); /**/
queryParams += '&' + encodeURIComponent('startCreateDt') + '=' + encodeURIComponent('20220901'); /**/
queryParams += '&' + encodeURIComponent('endCreateDt') + '=' + encodeURIComponent('20220930'); /**/
let uri = url + queryParams;
xhr.open("GET", uri);
xhr.onreadystatechange = function() {
if (this.readyState == 4) {
resolve(this.responseText);
}
};
xhr.send('');
}).then(function(result) {
let xml = new DOMParser().parseFromString(result, "text/xml");
let item = xml.getElementsByTagName("item");
let itemList = [];
for (let i = 0; i < item.length; i++) {
let createDt = item[i].getElementsByTagName("createDt")[0].innerHTML;
let gubun = item[i].getElementsByTagName("gubun")[0].innerHTML;
let defCnt = item[i].getElementsByTagName("defCnt")[0].innerHTML;
let incDec = item[i].getElementsByTagName("incDec")[0].innerHTML;
let element = {
createDt,
gubun,
defCnt,
incDec
}
itemList.push(element);
}
itemList.reverse();
getDataOfCity(value, itemList);
})
}
window.addEventListener("DOMContentLoaded", function() {
getItems();
})
function getDataOfCity(value, list) {
let testValue = list.filter(function(data) {
if(data.gubun == value) {
return true;
}
})
console.log(testValue);
let targetTable = document.getElementById("table_body");
targetTable.innerHTML = "";
for (let i = 0; i < testValue.length; i++) {
let createDt = testValue[i].createDt;
let name = testValue[i].gubun;
let stack = testValue[i].defCnt;
let newCnt = testValue[i].incDec;
const targetRow = document.createElement("tr");
targetRow.setAttribute("id", `targetRow_${i}`);
targetRow.innerHTML = `
<td class="new_row create_column" id="create_${i}">${createDt}</td>
<td class="new_row region_column" id="region_${i}">
<a href="#">${name}</a>
</td>
<td class="new_row stack_column" id="stack_${i}">${stack}</td>
<td class="new_row new_column" id="new_${i}">${newCnt}โฒ</td>`
targetTable.appendChild(targetRow);
}
}
decodeURI๋ฅผ ํตํด์ ํ์ํ value๊ฐ๋ง ๊ฐ์ ธ์ฌ ์ ์์๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ value๊ฐ์ ํจ์์ ํ๋ผ๋ฏธํฐ๋ก ๋ฃ์ด์ฃผ๋ฉด์ ์์ฑ๋ ๋ฐฐ์ด์ filter ํจ์๋ฅผ ์คํ์์ผ ์ํ๋ ๊ฐ๋ง ์ถ๋ ฅํ ์ ์๋๋ก ํ๋ค.
๋๋ต ํ๋์ ์ ์ด ๋ฌธ์ ๋ก ๊ณ ๋ฏผํ๋ค๊ฐ ๊ฒฐ๊ตญ ์ผ๋งค ๊ฐ์๋ณด์ด๋ ๋ฐฉ๋ฒ์ผ๋ก ์ฒ๋ฆฌํ์ง๋ง ๊ทธ๋๋ ๊ฝค ๊ด์ฐฎ์ ๋ฐฉ๋ฒ ๊ฐ์์ ๊ธฐ๋ก์ ํด๋๋ ค๊ณ ์ด์๋ฆฌํฌํธ๋ฅผ ์์ฑํ๋ค. ๋์ค์ ๋ ํ์ํ ๊ฒฝ์ฐ๊ฐ ๋ฐ์ํ๋ฉด ๊ธฐ์ต์ ๋๋ฌ์ด ์ด ๊ธ์ ์ฐพ์ผ๋ฌ ์์ผ๊ฒ ๋ค. (๋ฌผ๋ก ... ๋ ํ๋ก ํธ์์ ์ด๋ฐ ์ ๋ณด ์ ๋ฌ์ ํ ์ผ์ด ์์๊น ์ถ๊ธฐ๋ ํ๋ค๋ง.. ^^:;)
์ฌํํผ ์ค๋๋ง์ ๊ฝค๋ ์ฌ๋ฐ๋ ์ด์๋ฅผ ๋ง๋ฌ๋ค. ์ด์ ๋ค์๋ ๋ณด์ง ๋ง์ ํ๋ก ํธ ^^ (๋ผ๊ณ ํ ๋ป ใ ใ ๋ชป ํ์์ผ๋ฉด ์ฌ๋ฏธ๋ ์ปค๋ ์ง์ฅ ๊ฐ์๊ฒ ์ง....) - 9rom 20000
ps. ๋ง์ง๋ง์ผ๋ก ์ฌ์ง์ ์ฒจ๋ถํ๋ค.