Issue

[์ด์Šˆ๋ฆฌํฌํŠธ] Javascript window๊ฐ„ ์ •๋ณด ์ „๋‹ฌ

God Korea 2022. 10. 5. 00:23
728x90

๐Ÿ˜‹ ํ”„๋กœ์ ํŠธ ์›Œ๋ฐ์—…

 ํ˜„์žฌ ๋‚˜๋Š” 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. ๋งˆ์ง€๋ง‰์œผ๋กœ ์‚ฌ์ง„์„ ์ฒจ๋ถ€ํ•œ๋‹ค.

๋ฉ”์ธ
์ด๋ฆ„ ํด๋ฆญ ์‹œ

728x90