Trouble-Shooting

innerHTML์—์„œ script ๋กœ๋“œ ์•ˆ ๋˜๋Š” ๋ฌธ์ œ

์ฑ”๐Ÿป 2024. 1. 24. 19:55

โœ”๊ฒฐ๋ก 


๐Ÿšฉ๋“ค์–ด๊ฐ€๋ฉฐ

๐Ÿ‘€๋ฌธ์ œ ์ •์˜

์•„๋ž˜ ์ฝ”๋“œ๋Š” ๋ ˆ์ด์–ด ํŒ์—…์„ ๋„์šฐ๋Š” ์ฝ”๋“œ๋‹ค

html์„ text๋กœ ๋ฐ›์•„์™€์„œ ๋ฏธ๋ฆฌ ์กด์žฌํ•˜๋˜ .popup.wrap์— innerHTML๋กœ HTML text๋ฅผ ์ถ”๊ฐ€ํ•ด ๋ ˆ์ด์–ด ํŒ์—…์„ ๋„์›Œ์ฃผ๋Š” ๋ฐฉ์‹์ธ๋ฐ,

function test() {
    syusyu.common.Ajax.sendPOPRequest("GET", "/dlvAddr", '', res => {
        const $popupWrap = document.querySelector('.popup-wrap');
        $popupWrap.innerHTML = res;
        $popupWrap.classList.toggle('active');
    });
}

dlvAddr.js ํŒŒ์ผ์ด ๋กœ๋“œ๊ฐ€ ๋˜์ง€ ์•Š๋Š”๋‹ค ๐Ÿ˜ข

<script src="<c:url value="${jsUrlFos}/popup/dlvAddr.js"/>" defer></script>
<div class="popup-layer w-510">
    <div class="popup-head">
        <h4>๋ฐฐ์†ก์ง€ ๋ชฉ๋ก</h4>

๐Ÿคฆโ€โ™‚๏ธ๊ด€๋ จ๋œ ์‚ฌ์‹ค ์ˆ˜์ง‘ & โ“์›์ธ ์ถ”๋ก 

์™ธ๋ถ€ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋กœ๋“œํ•˜๋Š” <script> ํƒœ๊ทธ๋ฅผ innerHTML ์†์„ฑ์„ ํ†ตํ•ด ๋™์ ์œผ๋กœ ์ถ”๊ฐ€ํ•˜๋”๋ผ๋„, ๊ทธ ์Šคํฌ๋ฆฝํŠธ๋Š” ์‹คํ–‰๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋Š” ๋ณด์•ˆ์ƒ์˜ ์ด์œ ๋กœ, ์›น ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ œ๊ณตํ•˜๋Š” innerHTML ์†์„ฑ์˜ ๋™์ž‘ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์œ„์˜ ์ฝ”๋“œ์—์„œ <script src="<c:url value="${jsUrlFos}/popup/dlvAddr.js"/>"></script>๋Š” ์‹ค์ œ๋กœ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋กœ๋“œํ•˜๊ฑฐ๋‚˜ ์‹คํ–‰ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋™์ ์œผ๋กœ ์‹คํ–‰ํ•˜๋ ค๋ฉด innerHTML ์†์„ฑ์„ ํ†ตํ•ด ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๋Œ€์‹ , ๋ณ„๋„์˜ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์œ„์—์„œ ์„ค๋ช…๋“œ๋ฆฐ loadScript ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ๊ทธ ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค. ๋˜๋Š” HTML์— ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ง์ ‘ ์‚ฝ์ž…ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿฆพํ•ด๊ฒฐ์ฑ… ์‹œ๋„

innerHTML์—์„œ JQuery .html๋กœ ๋ณ€๊ฒฝํ•ด๋ด„

$(".popup-wrap").html(res);

๊ฒฐ๊ณผ์ ์œผ๋กœ html ๋‚ด๋ถ€์˜ script ์ฝ”๋“œ๋„ ์‹คํ–‰์ด๋˜๊ณ  ์™ธ๋ถ€ js ํŒŒ์ผ๋„ ๋ถˆ๋Ÿฌ๋Š” ์™”์œผ๋‚˜

dlvAddr.js ๋‚ด๋ถ€์˜ DOMContentLoaded ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒ์ด ์•ˆ๋จ..

document.addEventListener("DOMContentLoaded", () => {
    document.querySelector('.popup-wrap .close').addEventListener('click', () => {
        syusyu.common.Popup.close();
    });
});

์•Œ๊ณ ๋ณด๋‹ˆ DOMContentLoaded ์ด๋ฒคํŠธ๋Š” ์›น ํŽ˜์ด์ง€๊ฐ€ ์ฒ˜์Œ ์™„์ „ํžˆ ๋กœ๋“œ๋˜์—ˆ์„ ๋•Œ ํ•œ ๋ฒˆ๋งŒ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ, ํŽ˜์ด์ง€ ๋กœ๋“œ ํ›„์— JavaScript๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋™์ ์œผ๋กœ ์š”์†Œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋”๋ผ๋„ DOMContentLoaded ์ด๋ฒคํŠธ๋Š” ๋‹ค์‹œ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ํ•œ๋‹ค.


โœ”์›์ธ & ํ•ด๊ฒฐ๋ฐฉ๋ฒ•

dlvAddr.js๋ฅผ ์•„๋ž˜์ฒ˜๋Ÿผ ์ˆ˜์ •ํ•ด์ฃผ๋‹ˆ ์ž˜ ๋œ๋‹ค.!

document.querySelector('.popup-wrap .close').addEventListener('click', () => {
    syusyu.common.Popup.close();
});

๊ฒฐ๊ตญํ•ด๊ฒฐ์ฑ…์€ innerHTML(X) jQuery .html์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด์—ˆ๋‹ค.


์—ฌ๊ธฐ์„œ ๊ถ๊ธˆํ•œ์ 

์•„๋ž˜๋Š” dlvAddr.jsp์ธ๋ฐ 3๋ฒˆ์งธ ์ค„์—์„œ script ํƒœ๊ทธ๋ฅผ ๋งŒ๋‚˜๋ฉด html ์š”์†Œ ๋กœ๋“œ๋ฅผ ๋ฉˆ์ถ”๊ณ  script๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ  ํŒŒ์‹ฑํ•ด์„œ ๋ Œ๋”๋งํ• ๊ฑฐ์•„๋‹ˆ์•ผ ๊ทธ๋ฆฌ๊ณ  ๋‚˜์„œ ์•„๋ž˜ div ํƒœ๊ทธ๊ฐ€ ์ฝํžˆ๊ฒ ์ง€? ๊ทธ๋Ÿฐ๋ฐ dlvAddr.js๋ฅผ ๋ณด๋ฉด ์•„์ง .close๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๊ณ  ์ฝํžˆ์ง€ ์•Š์•˜๋Š”๋ฐ ์–ด๋–ป๊ฒŒ ์ด๋ฒคํŠธ๊ฐ€ ๋“ฑ๋ก๋˜๋Š”๊ฑฐ?

ํ™•์‹คํ•œ ๊ฑด ์•„๋‹ˆ๊ณ  ๋‚ด๊ฐ€ ์ถ”์ธกํ•œ ๊ฑฐ์ง€๋งŒ jQuery์˜ .html์„ ์‚ฌ์šฉํ•ด์„œ html ๋ฌธ์ž์—ด์„ ์ถ”๊ฐ€ํ•˜๋ฉด ํ•ด๋‹น ๋ฌธ์ž์—ด์ด ๋จผ์ € ์ „์ฒด์ ์œผ๋กœ ํŒŒ์‹ฑ๋˜๊ณ , ๊ทธ ๋‹ค์Œ์— <script> ํƒœ๊ทธ ๋‚ด๋ถ€์˜ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์‹คํ–‰๋˜๋Š” ๊ฒƒ ๊ฐ™๋‹คโ€ฆ

๊ทธ๋ž˜์„œ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์‹คํ–‰๋˜๋Š” ์‹œ์ ์—์„œ๋Š” ์ด๋ฏธ โ€˜.closeโ€™ ์š”์†Œ๊ฐ€ DOM์— ์ถ”๊ฐ€๋œ ์ƒํƒœ์ด๊ธฐ ๋•Œ๋ฌธ์—, ํ•ด๋‹น ์š”์†Œ์— ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ๋“ฑ๋กํ•˜๋Š” ๊ฒŒ ๊ฐ€๋Šฅํ•œ ๊ฒƒ ๊ฐ™๋‹ค.

[javaScript]Element.innerHTML๋Š”<script>๋ฅผ ์‹คํ–‰์‹œํ‚ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
innerHTML innerHTML์˜ ๊ฒฝ์šฐ ๊ธฐ๋ณธ์ ์œผ๋กœ ํƒœ๊ทธ๋ฅผ ์ผ๋ฐ˜ text ๋ฌธ์ž๋กœ ์ธ์‹ํ•˜๊ฒŒ๋” ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” https://www.w3.org/TR/2008/WD-html5-20080610/dom.html#innerhtml0 ํ•ด๋‹น ๋งํฌ์—์„œ ๋‚˜์™€ ์žˆ๋“ฏ์ด script elements inserted using innerHTML do not execute when they are inserted. code injection๊ณผ ๊ฐ™์€ ๊ฒฝ์šฐ๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋ผ๋Š”๊ตฐ์š”. ๋”ฐ๋ผ์„œ ajax๋กœ ํŽ˜์ด์ง€๋ฅผ ๋ถ™์ผ ๋•Œ innerHTML์„ ์ œ์™ธํ•˜๊ณ  ๋ฅผ ์ ์šฉ ์‹œํ‚ค๋Š” ๋ฐฉ๋ฒ•์€ ์ด 2๊ฐ€์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. elemental.innerHTML=string ๋Œ€์‹  jQuery์˜ $(elemental).html(string)์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ..
https://jjam89.tistory.com/178

Why doesn't a browser run a <script> in an HTML fragment retrieved via fetch API?
I was experimenting with getting a fragment of HTML using the fetch API, and then adding it to an HTML page. While this works fine for HTML content, I noticed that if I put a &lt;script&gt; tag in ...
https://stackoverflow.com/questions/49867200/why-doesnt-a-browser-run-a-script-in-an-html-fragment-retrieved-via-fetch-api

์‚ฌ์‹ค ์ € ๋ฐฉ์‹์€ html์ด ์ง€์–‘ํ•˜๋Š” ๋ฐฉ์‹์ด๋ผ๊ณ  ํ•œ๋‹ค..

HTML 5
https://www.w3.org/TR/2008/WD-html5-20080610/dom.html#innerhtml0

Uploaded by N2T