javascript λμ μ΄λ²€νΈ, λΉλκΈ°ν΅μ ajax (2023.05.04)
< λ³΅μ΅ >
jQuery : JS λΌμ΄λΈλ¬λ¦¬
μμ μ κ·Ό → $(cssμ νμ)
κΈ°λ₯ μΆκ° → .λ©μλ()
λ΄μ©λ§ → .text()
νκ·ΈκΉμ§ → .html()
μ€νμΌμ μ΄ → .css()
νμ€μ© μ
λ ₯
$('h1').css('μμ±1','κ°1')
$('h1').css('μμ±2','κ°2')
$('h1').css('μμ±3','κ°3')
chain λ°©μ
$('h1').css('μμ±1','κ°1').css('μμ±2','κ°2').css('μμ±3','κ°3')
κ°μ²΄ λ°©μ
$('h1').css({
'μμ±1' : 'κ°1',
'μμ±2' : 'κ°2',
'μμ±3' : 'κ°3',
})
π λμ μ΄λ²€νΈ λ°μΈλ©
π μ΄λ²€νΈ λ°μ΄λ©
JSμ½λμ jQueryμ½λλ λλΆλΆ μ΄λ²€νΈ(event)μ μν΄ λμν¨
μ΄λ²€νΈλ λνμ μΌλ‘ ν΄λ¦, ν€λ³΄λ μ λ ₯ λ± μ¬μ©μμ μ΄λ€ νμ
β μ΄λ²€νΈ λ°μ΄λ©μ κ³Όμ
1. μ΄λ²€νΈλ₯Ό λ°μ μ€ μμ μ ν
2. μ νν μμκ° μ΄λ€ μ΄λ²€νΈμ λ°μν μ§, μμμ μ΄λ²€νΈλ₯Ό μ°κ²°ν΄μ£Όλ λ°μΈλ© μ§ν
3. μ΄λ²€νΈκ° λ°μνμ λ μ€νλ μ½λ μμ±
π λμ μ΄λ²€νΈ λ°μ΄λ©
λμ μΌλ‘ μμ±λ Element(μ΄λ²€νΈλ‘ μΈνΈ μμ±λ μμ)μ μ΄λ²€νΈλ₯Ό λ°μΈλ©νλ€λ μλ―Έ
β μΌλ° μ΄λ²€νΈμ λμ μ΄λ²€νΈ μ°¨μ΄
μΌλ° μ΄λ²€νΈλ₯Ό μ¬μ©νμ κ²½μ°, μμ±λ λμ μμμμλ μ΄λ²€νΈκ° μλνμ§ μμ
λ°λ©΄, λμ μ΄λ²€νΈλ₯Ό μ¬μ©νμ κ²½μ° μμ±λ λμ μμμμλ μ΄λ²€νΈκ° μλν¨
$(document).on(μ΄λ²€νΈνμ , μ΄λ²€νΈλμ(cssμ νμ), μ΄λ²€νΈνΈλ€λ¬)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>dynamic event</title>
<style>
button{
width: 100px;
height: 60px;
margin: 5px;
border: none;
border-radius: 10px;
font-weight: 600;
font-size: 1.7rem;
}
.clickBtn{
background-color: lightpink;
}
.onBtn{
background-color: lightgreen;
}
</style>
<script src="./js/jquery-3.6.4.min.js"></script>
</head>
<body>
<button class="clickBtn">click</button>
<button class="onBtn">on</button>
<br>
<script>
// λμ μ΄λ²€νΈ
// → λ¬Έμλ₯Ό κ°μ ΈμμΌ ν¨
// $(document).on(μ΄λ²€νΈνμ
, μ΄λ²€νΈλμ(cssμ νμ), μ΄λ²€νΈνΈλ€λ¬)
// Click λ²νΌ ν΄λ¦μ, click λ²νΌ μμ±
$('.clickBtn').click(()=>{
// body νκ·Έμ clickBtn μμ±
$('body').append('<button class="clickBtn">click</button>');
})
// on λ²νΌ ν΄λ¦μ€, on λ²νΌ μμ±
$(document).on('click', '.onBtn', ()=>{
$('body').append('<button class="onBtn">on</button>');
})
</script>
</body>
</html>
π jQuery λ€μν λ©μλ
// μΆκ° μ κ±° κ΄λ ¨
// attr(μΆκ°ν μμ±, μμ±μκ°) : μμ± μΆκ° λ©μλ
// removeAttr(μ κ±°ν μμ±) : μμ± μ κ±° λ©μλ
// removeClass(ν΄λμ€μ΄λ¦) : ν΄λμ€ μμ±κ° μ κ±° λ©μλ
// $(A).appen(B) : Bλ₯Ό Aμμ λ§μ§λ§ μμΉμ μΆκ° λ©μλ
// $(A).prepend(B) : Bλ₯Ό Aμμ 첫λ²μ§Έ μμΉμ μΆκ° λ©μλ
// input κ΄λ ¨ λ©μλ
// val() : input μ
λ ₯ κ° μ κ·Ό (JS : value)
// input μμ κ° λΉμμ£ΌκΈ° → inputλ°νκ°μ²΄.val('')
// λΆλͺ¨ κ΄λ ¨ λ©μλ
// parent() : κ°μ₯ κ°κΉμ΄ λΆλͺ¨ μμ μ ν
// parents() : λͺ¨λ λΆλͺ¨ μμ μ ν
// closest(μνλμμ) : λͺ¨λ λΆλͺ¨ μμ λμμΌλ‘ μνλ μμ κ²μνμ¬ μ κ·Ό
// 1. μ’μμ λ²νΌ ν΄λ¦μ
// λ²νΌ λ΄ λ©μμ§ : μ’μμ → μ’μμ μ·¨μ
// μ«μ : 0 → 1
$(document).on('click', '.likeBtn', (e)=>{
// λ²νΌ λ΄μ© λ°κΎΈκΈ°
$(e.target).text('μ’μμ μ·¨μπ₯');
// μ«μ λ°κΎΈκΈ°
$('span').text('1');
// likeBtn ν΄λμ€ μ κ±°, dislikeBtn ν΄λμ€ μΆκ°
// $(e.target).removeClass('likeBtn');
$(e.target).removeAttr('class');
$(e.target).attr('class', 'dislikeBtn');
})
// 2. μ’μμ μ·¨μ λ²νΌ ν΄λ¦μ
// μ’μμ μ·¨μ → μ’μμ
// 1 → 0 λ³κ²½
$(document).on('click', '.dislikeBtn', (e)=>{
$(e.target).text('μ’μμπ');
$('span').text('0');
// dislikeBtn ν΄λμ€ μ κ±°, likeBtn ν΄λμ€ μΆκ°
$(e.target).removeAttr('class');
$(e.target).attr('class', 'likeBtn');
})
// 3. λκΈ μμ± λ²νΌ ν΄λ¦μ
// λκΈ + μμ λ²νΌ μμ±
$(document).on('click', '.textBtn', ()=>{
let textVal = $('input[type=text]').val();
$('.container').prepend(`
<p>
${textVal}
<button class="removeBtn">μμ ΰ²₯_ΰ²₯</button>
</p>
`)
// input μμ κ° λΉμμ£ΌκΈ°
$('input').val('');
})
// 4. μμ λ²νΌ ν΄λ¦μ
// λκΈ + μμ λ²νΌ μ κ±°
$(document).on('click', 'button[class=removeBtn]', e=>{
// $(e.target).parent().remove();
// $(e.target).parents().remove();
$(e.target).closest('p').remove();
})
β» μΆκ° κ΄λ ¨ λ©μλ append vs prepend μ°¨μ΄
π event.target vs this
β $(this)
μΌμ’ μ λ³μ, μ νμλ‘ this ν€μλλ₯Ό $() ν¨μμ μ λ¬νλ©΄, μ΄λ²€νΈκ° λ°μν μκΈ° μμ μ κ°μ§ν μ μμ
μΌλ°μ μΌλ‘ λμΌν μμ€κ° λ°λ³΅λλ κ³³μ μ¬μ©λ¨
νΈμΆλ HTML κ°μ²΄λ₯Ό μ μ₯ → νμ΄ν ν¨μμμλ μλνμ§ μμ. ν¨μ ννμμμ μ¬μ© κ°λ₯
$('h1').on('mouseover', function(){
$(this).css('color', 'red');
// this : νΈμΆλ HTML κ°μ²΄λ₯Ό μ μ₯
// - νμ΄ν ν¨μμμλ μλνμ§ μμ
})
μμ μ½λμμ thisλ HTMLμ <h1>μ μλ―Έν¨
β event.target
μ€μ μ΄λ²€νΈκ° μμλ target μμ
μ΄λ²€νΈλ₯Ό μ΄λ°μν¨ μμ
νμ΄ν ν¨μμμ μ¬μ© κ°λ₯
$(document).on('click', '.dislikeBtn', (e)=>{
$(e.target).text('μ’μμπ');
$('span').text('0');
// dislikeBtn ν΄λμ€ μ κ±°, likeBtn ν΄λμ€ μΆκ°
$(e.target).removeAttr('class');
$(e.target).attr('class', 'likeBtn');
})
β event.target νΉμ $(this) μ¬μ©νλ μ΄μ
likeBtnμ HTMLμμ μ°Ύμ ν μ€νλ¬Έμμ λ λ€μ HTMLμμ likeBtnμ μ°Ύμμ μ€ν → λΉν¨μ¨μ
νκ² νΉμ this νμ©νμ¬ λ°λ‘ μ κ·Όν μ μλλ‘!!
π ajax λΉλκΈ°ν΅μ λ°©μ
π λκΈ°ν΅μ vs λΉλκΈ°ν΅μ
β λΉλκΈ°(Asynchronous) ν΅μ
μλ²μ μμ²(request)λ₯Ό 보λμ λ μλ΅(response) μνμ μκ΄μμ΄ λ€μ μμ²(request)μ μνν μ μλ ν΅μ λ°©λ²
β λκΈ°(Synchronous) ν΅μ
μλ²μ μμ²(request)λ₯Ό 보λμ λ μλ΅(response)μ΄ λμμμΌ λ€μ μμ²(request)μ μνν μ μλ ν΅μ λ°©λ²
π AJAX (Asynchronous JavaScript and XML)
ν΄λΌμ΄μΈνΈμ μλ²κ° λΉλκΈ°μ μ 보 κ΅νμ΄ κ°λ₯ν ν΅μ κΈ°λ₯
** νλ©΄ μ ν μμ΄
λ°μ΄ν°λ₯Ό μ΄λνκ³ νλ©΄μ ꡬμ±νλλ° μμ΄μ μΉ νλ©΄μ κ°±μ νμ§ μκ³ νμν λ°μ΄ν°λ₯Ό μλ²λ‘ 보λ΄κ³ κ°μ Έμ€λ λ°©λ²
νλ©΄ κ°±μ μ΄ μμ΄μ μ¬μ©μ μ μ₯μμ λ§€μ° νΈλ¦¬νκ³ λΉ λ₯΄κ² μμ μ μ²λ¦¬νλ κ²μ²λΌ λκ»΄μ§κ² ν¨
νμ§λ§, λμ μΌλ‘ νλ©΄μ ꡬμ±νλ λ§νΌ κ°λ°μμ ꡬνμ 볡μ‘ν΄μ§
π λ°μ΄ν° νμ
λ°μ΄ν°λ₯Ό μ μ‘νλ μ μ‘ νμ
β CSV (Comma - Seperated Values)
μΌνλ₯Ό κΈ°μ€μΌλ‘ νλͺ©μ ꡬλΆνμ¬ μ μ₯ν λ°μ΄ν°
β XML(eXtensible Markup Language)
λ€λͺ©μ λ§ν¬μ μΈμ΄λ‘ νκ·Έ λ±μ μ΄μ©νμ¬ λ°μ΄ν°μ ꡬ쑰λ₯Ό μμ±νλ κΈ°μ
ν΄λΉνλ κ° μμͺ½μ νκ·Έλ‘ λ¬Άμ΄μ κ΄λ¦¬νλ―λ‘ κ°λ μ±μ΄ μ’μ λ°μ΄ν° νλ³μ΄ μ¬μ
β JSON(JavaScript Object Notation)
'ν€, κ°' μμΌλ‘ μ΄λ£¨μ΄μ§ λ°μ΄ν° μ€λΈμ νΈλ₯Ό μ λ¬νκΈ° μν κ°λ°©ν νμ€ ν¬λ§·
→ json μλ°μ€ν¬λ¦½νΈ κ°μ²΄νν
λ°λ³΅λλ νκ·Έ ꡬ쑰λ₯Ό μ€μΌ μ μμ΄μ μ©λμ΄ μλ€ (XMLμ λΉν΄)
AJAX λΉλκΈ°ν΅μ νμ€λ°μ΄ν°λ‘ JSON μ¬μ©
π Ajaxλ‘ api κ°μ Έμ€κΈ°
Ajaxλ μ μ΄μΏΌλ¦¬λ‘ μ κ·Όνμ§ μμΌλ©΄ μ½λκ° λ무 볡μ‘ν΄μ§κΈ° λλ¬Έμ μ μ΄μΏΌλ¦¬λ‘ μ¬μ©
API(application programming interface, μ ν리μΌμ΄μ νλ‘κ·Έλλ° μΈν°νμ΄μ€)
μμ© νλ‘κ·Έλ¨μμ μλ‘ λ€λ₯Έ μννΈμ¨μ΄ κ΅¬μ± μμλ₯Ό μ°κ²°νμ¬ μνΈμμ©ν μ μλλ‘ νλ νλ‘κ·Έλλ° μΈν°νμ΄μ€. APIλ μΌλ°μ μΌλ‘ μλ‘ λ€λ₯Έ μμ€ν , νλ«νΌ λλ μΈμ΄ κ°μ ν΅μ μ κ°λ₯νκ² νλ©°, μΉ APIλ μΉ κΈ°μ μ μ¬μ©νμ¬ μ ν리μΌμ΄μ κ°μ μνΈμμ©μ μ©μ΄νκ² ν¨. μλ₯Όλ€μ΄, νμ΄μ€λΆ APIλ₯Ό μ¬μ©νλ©΄ κ°λ°μλ νμ΄μ€λΆ λ°μ΄ν°λ₯Ό λ€λ₯Έ μμ© νλ‘κ·Έλ¨μμ μ¬μ©ν μ μμ. λν, κ΅¬κΈ μ§λ APIλ₯Ό μ¬μ©νλ©΄ λ€λ₯Έ μΉμ¬μ΄νΈμμ Google μ§λλ₯Ό μ½κ² ν΅ν©ν μ μμ.
οΌ μΈν°νμ΄μ€(Interface) : μλ‘ λ€λ₯Έ λ λμμ΄ μνΈμμ©ν μ μλλ‘ μ€κ°μμ μ°κ²°ν΄μ£Όλ μ°κ²°κ³ 리
// ajax -> λΉλκΈ°ν΅μ λ°©λ²
// j쿼리μ μ κ·Ό -> $.
// ajax λ©μλ μ¬μ© -> ajax()
// λ°μ΄ν°λ JSON ννλ‘ -> {key:value, ~}
let movieUrl = 'http://kobis.or.kr/kobisopenapi/webservice/rest/boxoffice/searchDailyBoxOfficeList.json?key=f5eef3421c602c6cb7ea224104795888&targetDt=20230501';
const getAPI = ()=>{
$.ajax({
// μ΄λ λ°μ΄ν°λ₯Ό κ°μ Έμ¬ 건μ§
url : movieUrl,
// μ΄λ€ λ°©μμΌλ‘ ν΅μ ν 건μ§
type : 'get',
// ν΅μ μ±κ³΅ μ μ€ν λ‘μ§
success : (response)=>{
// alert('ν΅μ μ±κ³΅!')
// μμ -> rank
// μνμ λͺ© -> movieNm
// κ°λ΄μΌ -> openDt
let movieList = response.boxOfficeResult.dailyBoxOfficeList;
// ν
μ΄λΈμ΄ μΆλ ₯λ 곡κ°μΈ containerμ 보λ΄μ€ μ½λλ₯Ό λμ ν΄μ μμ±ν΄μ€ λ€μ λ§μ§λ§μ λ£μ΄μ£Όμ!
let tableFoam = `
<table>
<tr>
<th>μμ</td>
<th>μνμ λͺ©</td>
<th>κ°λ΄μΌ</td>
</tr>
`;
for(let i of movieList){
tableFoam += `
<tr>
<td>${i.rank}</td>
<td>${i.movieNm}</td>
<td>${i.openDt}</td>
</tr>`
}
tableFoam += `
</table>
`;
$('.container').html(tableFoam);
},
// ν΅μ μ€ν¨ μ μ€ν λ‘μ§
error : ()=>{
alert('ν΅μ μ€ν¨!');
}
})
}
β API Url κ°μ Έμ€κΈ°