์น ๊ฐ๋ฐ์ ํ๋ค ๋ณด๋ฉด onclick ์์ฑ์์ JavaScript ๊ฐ์ฒด๋ฅผ ๋๊ฒจ์ผ ํ ๋๊ฐ ์์ต๋๋ค.
ํ์ง๋ง ์ด ๊ณผ์ ์์ ๋ค์๊ณผ ๊ฐ์ ์ค๋ฅ๋ฅผ ์ข
์ข
๋ง๋๊ฒ ๋ฉ๋๋ค:
- Uncaught SyntaxError: Unexpected identifier 'Object'
- Uncaught SyntaxError: Unexpected token 'J'
์ด๋ฒ ๊ธ์์๋ ์ด ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ ์ด์ ์, ์ด๋ฅผ ๊น๋ํ๊ฒ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ์ ์ ๋ฆฌํด๋ณด๊ฒ ์ต๋๋ค.
๋ฌธ์ ์ํฉ
์๋์ ๊ฐ์ด HTML ๋ฒํผ์ ๊ฐ์ฒด๋ฅผ ์ง์ ๋๊ธฐ๋ ค๊ณ ํ์ต๋๋ค.
<button onclick="openProductPopup({name: 'apple'})">ํด๋ฆญ</button>
๊ฒฐ๊ณผ:Uncaught SyntaxError: Unexpected identifier 'Object'
์ ์ด๋ฐ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์๊น์?
๋ฌธ์ ์ ์์ธ
HTML ์์ฑ๊ฐ์ ํญ์ ๋ฌธ์์ด๋ก ํด์๋ฉ๋๋ค.
- HTML์ {} ๊ฐ์ JavaScript ๊ฐ์ฒด ํํ์์ ์ดํดํ์ง ๋ชปํฉ๋๋ค.
- HTML์์๋ ์์ฑ ๊ฐ ์ ์ฒด๊ฐ ๋จ์ํ ๋ฌธ์์ด๋ก ์ฝํ๊ธฐ ๋๋ฌธ์ {}๋ JavaScript ํค์๋๋ ๊ตฌ๋ฌธ ์ค๋ฅ(SyntaxError)๋ฅผ ๋ฐ์์ํต๋๋ค.
์ฆ, ๊ฐ์ฒด๋ฅผ ์ง์ ๋๊ธฐ๋ ค๊ณ ํ๋ฉด ๋ธ๋ผ์ฐ์ ๊ฐ ์ด๋ฅผ ํ์ฑํ ์ ์์ด ์๋ฌ๊ฐ ๋ฐ์ํฉ๋๋ค.
์ฌ๋ฐ๋ฅธ ํด๊ฒฐ ๋ฐฉ๋ฒ
ํต์ฌ์ ๋ค์ ๋ ๊ฐ์ง์ ๋๋ค:
- HTML ์์ฑ ์: ๊ฐ์ฒด๋ฅผ JSON ๋ฌธ์์ด๋ก ๋ณํํด์ ์ฝ์ ํด์ผ ํ๋ค.
- JavaScript ํจ์ ๋ด: ๋ค์ JSON.parse() ํด์ ๊ฐ์ฒด๋ก ๋ณต์ํด์ผ ํ๋ค.
1. ๊ฐ์ฒด๋ฅผ JSON ๋ฌธ์์ด๋ก ๋ณํํ๊ธฐ
HTML ์ฝ๋ ์์ฑ ์ JSON.stringify()๋ฅผ ์ค์ ๋ฐ์ดํฐ์ ์ ์ฉํฉ๋๋ค.
// ๋ฐฉ๋ฒ1
var innerHTML = `<button onclick='openProductPopup(${JSON.stringify(product)})'>ํด๋ฆญ</button>`
// ๋ง์ฝ ๋ฐฉ๋ฒ1์์ ํฐ๋ฐ์ดํ๋ ์์๋ฐ์ดํ ๋๋ฌธ์ ์๋๋ฉด ๋ฐฉ๋ฒ2
var innerHTML = `<button class="product-btn"
onclick="openProductPopup('${JSON.stringify(product).replace(/"/g, '"').replace(/'/g, ''')}')">ํด๋ฆญ</button>`
$('#productList').append(innerHTML);
// replace ํ ์ด์ : HTML์ฉ ์ด์ค์ผ์ดํ์ฒ๋ฆฌํ๊ฒ
// .replace(/"/g, '"') // ํฐ๋ฐ์ดํ๋ฅผ " (HTML ์ํฐํฐ)
// .replace(/'/g, ''') // ์์๋ฐ์ดํ๋ฅผ ' (HTML ์ํฐํฐ)
- ์ด๋ ${JSON.stringify(product)}๋ ์๋ฅผ ๋ค๋ฉดํํ์ JSON ๋ฌธ์์ด๋ก ์ฝ์ ๋ฉ๋๋ค.
-
{"name":"apple","price":1000}
2. JavaScript ํจ์ ๋ด์์ ๋ค์ ๊ฐ์ฒด๋ก ๋ณํํ๊ธฐ
openProductPopup ํจ์์์๋ ๋ฌธ์์ด๋ก ๋์ด์จ ๋ฐ์ดํฐ๋ฅผ JSON.parse()๋ก ๊ฐ์ฒด๋ก ๋ณํํฉ๋๋ค.
function openProductPopup(productData) {
const product = JSON.parse(productData);
console.log(product.name); // "apple"
}
์ด๋ ๊ฒ ํ๋ฉด HTML์์๋ ๋ฌธ์์ด์ ์์ ํ๊ฒ ์ฃผ๊ณ ๋ฐ๊ณ , JavaScript์์๋ ๊ฐ์ฒด์ฒ๋ผ ํธํ๊ฒ ์ฌ์ฉํ ์ ์์ต๋๋ค.
๋ณด๋์ค: ๋ ์์ ํ ๋ฐฉ๋ฒ (์ถ์ฒ)
HTML ์์ฑ์์ ์ง์ ์ฝ๋๋ฅผ ๋ฃ๋ ๋์ , data- ์์ฑ์ ํ์ฉํ๋ ๋ฐฉ๋ฒ๋ ์์ต๋๋ค.
<button data-product='{"name":"apple","price":1000}' onclick="openProductPopup(this)"> ํด๋ฆญ </button>
// var html = `<button class="product-btn" data-product='${JSON.stringify(product)}' onclick="openProductPopup(this)">ํด๋ฆญ</button>`
// $('#productList').append(html);
function openProductPopup(buttonElement) {
const product = JSON.parse(buttonElement.dataset.product);
console.log(product.name); // "apple"
// jQuery
// var data = $(button).data('product');
// ์ ์ด์ฟผ๋ฆฌ์ data๋ฉ์๋๋ ์๋์ผ๋ก JSON.parseํด์ฃผ๊ธฐ ๋๋ฌธ์ ๋ JSON.parseํ๋ฉด ์๋ฌ๋จ
}
์ฅ์ :
- ์ฝ๋๊ฐ ๋ ๊น๋ํด์ง๋๋ค.
- XSS(๊ต์ฐจ ์ฌ์ดํธ ์คํฌ๋ฆฝํ ) ์ทจ์ฝ์ฑ๋ ์ค์ผ ์ ์์ต๋๋ค.
- HTML๊ณผ JavaScript ๋ก์ง์ ๋ ๋ช ํํ ๋ถ๋ฆฌํ ์ ์์ต๋๋ค.
์ ๋ฆฌ
HTML ์์ฑ์ ๋ฌธ์์ด๋ง ๊ฐ๋ฅ | {} ๊ฐ์ ๊ฐ์ฒด๋ฅผ ์ง์ ๋๊ธธ ์ ์์ |
๊ฐ์ฒด๋ฅผ ๋๊ธฐ๋ ค๋ฉด | JSON.stringify()๋ก ๋ฌธ์์ดํ |
๋ค์ ๊ฐ์ฒด๋ก ์ฐ๋ ค๋ฉด | JSON.parse()๋ก ๋ณต๊ตฌ |
๋ ์ข์ ๋ฐฉ๋ฒ | data- ์์ฑ ์ฌ์ฉ ์ถ์ฒ |
๋ง์น๋ฉฐ
onclick ์์ฑ์์ ๊ฐ์ฒด๋ฅผ ๋๊ธธ ๋ ๋ฐ์ํ๋ ๋ฌธ์ ๋ ์๊ฐ๋ณด๋ค ์์ฃผ ๋ง๋ฉ๋๋ค.
์ด๋ฒ ๊ธฐํ์ ๊ตฌ์กฐ์ ์๋ฆฌ๋ฅผ ์ ํํ ์ดํดํ๊ณ ๋์ด๊ฐ๋ฉด,
์์ผ๋ก HTML๊ณผ JavaScript๋ฅผ ์์ด ์ฌ์ฉํ ๋ ํจ์ฌ ๊น๋ํ ์ฝ๋๋ฅผ ์์ฑํ ์ ์์ ๊ฒ์
๋๋ค.
๐ฅ ํจ๊ป ์ฑ์ฅํ๋ ๊ฐ๋ฐ์๊ฐ ๋ฉ์๋ค!
https://m.blog.naver.com/chuyj15/223828976226