budtree
budtree
budtree
์ „์ฒด ๋ฐฉ๋ฌธ์ž
์˜ค๋Š˜
์–ด์ œ
  • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ (76)
    • ๐Ÿ’ Computer Science (5)
      • OS (1)
      • Network (1)
      • Database (3)
    • ๐Ÿค study (20)
      • kubernetes๐Ÿ•ธ๏ธ (0)
      • Spring Boot๐Ÿƒ (1)
      • JPA (2)
      • Infra (2)
      • HTML | CSS (3)
      • Java (6)
      • Kotlin (3)
      • etc (3)
    • ๐Ÿ’ป Project (3)
      • memoir & diary ๐Ÿ“š (1)
      • class (0)
      • project (2)
    • ๐Ÿ”ฅ Problem Solving (38)
      • programmers (30)
      • SQL (8)
      • BOJ (0)
    • โœจ daily (10)
      • diary (5)
      • exercise (5)
      • travel (0)
      • review (0)

๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

  • ํ™ˆ
  • ํƒœ๊ทธ
  • ๋ฐฉ๋ช…๋ก

๊ณต์ง€์‚ฌํ•ญ

์ธ๊ธฐ ๊ธ€

ํƒœ๊ทธ

  • ๊ฐœ๋ฆฐ์ด
  • ArrayList
  • ์ฝ”๋ฆฐ์ด
  • ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค
  • ๋ธ”๋ž™๋ฉ€ํ‹ฐ์ง
  • ์ทจ์—…์ค€๋น„
  • ์ฝ”ํ…Œ
  • ์นด์นด์˜ค์ฝ”ํ…Œ
  • ์„œ์šธ๋Œ€์ž…๊ตฌ ํ—ฌ์Šค์žฅ
  • css
  • ์ฝ”๋”ฉํ…Œ์ŠคํŠธ
  • ์›”๊ฐ„์ฝ”๋“œ์ฑŒ๋ฆฐ์ง€
  • 2018 KAKAO BLIND RECRUITMENT
  • ์ž๋ฐ”
  • ์ฝ”ํ‹€๋ฆฐ
  • ํ—ฌ๋ฆฐ์ด
  • pt
  • Summer/Winter Coding
  • ์ผ๊ธฐ
  • ํ”„๋ฆฐ์ด
  • ์นด์นด์˜ค
  • java
  • ์นด์นด์˜ค์ฝ”๋”ฉํ…Œ์ŠคํŠธ
  • kotlin
  • programmers
  • ํ”ผํ‹ฐ
  • HashMap
  • ํ—ฌ์Šค์žฅ
  • ์ทจ์—…
  • ์›”๊ฐ„ ์ฝ”๋“œ ์ฑŒ๋ฆฐ์ง€

์ตœ๊ทผ ๋Œ“๊ธ€

์ตœ๊ทผ ๊ธ€

ํ‹ฐ์Šคํ† ๋ฆฌ

hELLO ยท Designed By ์ •์ƒ์šฐ.
budtree

budtree

[ํ”„๋กœ์ ํŠธ] ๋ฒ„ํŠผ์„ list ํ˜•ํƒœ๋กœ ์ œ์ถœํ•˜๋Š” ๋ฐฉ๋ฒ• | button์„ checkbox ์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•˜๊ธฐ | list ํ˜•ํƒœ form ์ œ์ถœ
๐Ÿ’ป Project/project

[ํ”„๋กœ์ ํŠธ] ๋ฒ„ํŠผ์„ list ํ˜•ํƒœ๋กœ ์ œ์ถœํ•˜๋Š” ๋ฐฉ๋ฒ• | button์„ checkbox ์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•˜๊ธฐ | list ํ˜•ํƒœ form ์ œ์ถœ

2022. 9. 16. 00:46

 

ํ˜„์žฌ ์ƒํ™ฉ

 

๊ฐ ์นดํ…Œ๊ณ ๋ฆฌ์— ๋งž๊ฒŒ ๋ฒ„ํŠผ์ด ๋˜์–ด์žˆ๊ณ  ์นดํ…Œ๊ณ ๋ฆฌ๋ฅผ ํด๋ฆญํ•˜๊ณ  ๊ฒ€์ƒ‰ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ๊ทธ์— ๋งž๋Š” ๊ฒŒ์‹œ๋ฌผ์ด ์•„๋ž˜์— ๋ Œ๋”๋ง๋˜๊ฒŒ ํ•˜๊ณ  ์‹ถ๋‹ค

์—ฌ๊ธฐ์„œ ํŠน์ด์‚ฌํ•ญ์€ ์นดํ…Œ๊ณ ๋ฆฌ ๋ฒ„ํŠผ์€ ์—ฌ๋Ÿฌ๊ฐœ๊ฐ€ ๋ˆŒ๋ฆด ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ!

 

1. ์ฒซ ๋ฒˆ์งธ ๋ฐฉ๋ฒ•

๋‚ด๊ฐ€ ์ƒ๊ฐํ•œ ์ฒซ๋ฒˆ์งธ ๋ฐฉ๋ฒ•์€ ajax๋ฅผ ์ด์šฉํ•ด์„œ ํด๋ฆญ๋œ ์นดํ…Œ๊ณ ๋ฆฌ ๋ฒ„ํŠผ์˜ ๋ฐฐ์—ด์„ ์ €์žฅํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

 

 

list.html์˜ ์ผ๋ถ€์ด๋‹ค. id๋Š” ์นดํ…Œ๊ณ ๋ฆฌ์˜ id๋กœ ์ง€์ •ํ•˜๊ณ , ํด๋ฆญ์‹œ id๋ฅผ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋„˜๊ฒจ์ฃผ๋Š” onClick ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.

 

<!-- list.html์˜ script ์ผ๋ถ€ -->
<div class="gather-category">
    <div th:each="category,index:${categoryList}">
        <label><input type="button" name="category" class="btn btn-outline-info" th:value="${category.tagName}" th:id="${category.id}" onclick="onClick(this.id)"></label>
    </div>
</div>

onClick ํ•จ์ˆ˜๋ถ€๋ถ„์˜ ์ฒ˜๋ฆฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค

 

<!-- list.html์˜ script ์ผ๋ถ€ -->
<script>
    let arr=[];
    function onClick(id) {
        var button = document.getElementById(id);
        button.classList.toggle('active');
        var idx = arr.indexOf(id);
        if(idx > -1) {
            arr.splice(idx, 1);
        } else {
            arr.push(id);
        }
    }


    $(document).on("click", "#searchBtn", function () {
        $.ajax({
            url: "/gathering/search",
            type: "GET",
            contentType: "application/json; charset=UTF-8",
            dataType: "json",
            data: {
                "category": arr,
                "classification": $("#classification option:selected").val(),
                "searchKeyword" :  $("#searchKeyword").val(),
            },
            success: function (data) {
                //console.log(data.resultData);
                arr  = [];
                if (data.result == true) {

                    alert("์„ฑ๊ณต");

                }
            }
        });
    });
</script>

์ด๋ ‡๊ฒŒ arr์ด๋ผ๋Š” ๋ฐฐ์—ด์„ ์„ ์–ธํ•˜๊ณ  ํด๋ฆญ์‹œ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ฐ›์€ id๋ฅผ arr์— ๋„ฃ์–ด์ค€๋‹ค.

 

 

๋ฒ„ํŠผ์ด bootstrap์œผ๋กœ ๊พธ๋ฉฐ์ ธ์žˆ์–ด์„œ ํด๋ฆญํšจ๊ณผ๋ฅผ ์ฃผ๊ธฐ ์œ„ํ•ด์„œ active๋ฅผ ํ† ๊ธ€ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋ฐฐ๊ฒฝ์ƒ‰์„ ์ž…ํ˜”๊ณ , arr ๋ฐฐ์—ด์— ํ•ด๋‹น id๊ฐ’์ด ๋“ค์–ด๊ฐ€์žˆ์œผ๋ฉด ๋„˜์–ด๊ฐ€๊ณ , ์—†๋Š” ๊ฒฝ์šฐ์—” ๋ฐฐ์—ด์— ๋„ฃ์–ด์ค€๋‹ค.

 

 

๋”ฐ๋ผ์„œ ๊ฒ€์ƒ‰ ๋ฒ„ํŠผ์ด ๋ˆŒ๋ ธ์„๋•Œ, ajax๋กœ arr ๋ฐฐ์—ด์„ “category”๋ผ๋Š” ๊ฐ’์œผ๋กœ ๋ณด๋‚ธ๋‹ค!

 

 

์š”์ฒญ์„ ๋ฐ›๋Š” Controller ๋ถ€๋ถ„์ด๋‹ค.

 

//GatheringListController.java

@GetMapping("/search")
    	public ModelAndView searchBoard(ModelAndView mav, @ModelAttribute GatheringListCriteria criteria){
        mav.setViewName("jsonView");

        System.out.println(criteria.toString());
        List<GatheringListDetailDto> gatheringBoardList = gatheringService.listByCriteria(criteria);
        for(GatheringListDetailDto dto : gatheringBoardList) {
            System.out.println(dto.toString());
        }
        mav.addObject("gatheringList", gatheringBoardList);

        return mav;
}

 

๋กœ๊ทธ๋ฅผ ๋ณด๋‹ˆ ๋‚ด๊ฐ€ ์˜๋„ํ–ˆ๋˜ ๋Œ€๋กœ category ๊ฐ’์ด List<Integer>์˜ ํ˜•ํƒœ๋กœ ์ž˜ ๋“ค์–ด๊ฐ€์žˆ์Œ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ ์ด ๋ฐฉ์‹์˜ ๋ฌธ์ œ์ ์ด ์žˆ๋‹ค.

  1. ๊ฐ€๋…์„ฑ์ด ๋„ˆ๋ฌด ๊ตฌ๋ฆฌ๋‹คโญ๏ธ(์ด๊ฒŒ ์ œ์ผ ํ•ต์‹ฌ์ด๋‹ค) 
    → ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ํž˜๋“ค ๊ฒƒ ๊ฐ™๋‹ค.
    ์ง€๊ธˆ ์ด ํฌ์ŠคํŒ…์„ ํ•˜๋ฉด์„œ๋„ ๋‚ด๊ฐ€ ๋ฌด์Šจ ์ฝ”๋“œ๋ฅผ ์งฐ๋Š”์ง€ ๊ธฐ์–ต์ด ์•ˆ๋‚˜์„œ ๊ตฌ๊ธ€๋งํ–ˆ๋‹ค..
  2. ์ง€๊ธˆ ์ด ๋ฐฉ์‹์€ ์„œ๋ฒ„๊ฐ€ ์ฒ˜๋ฆฌํ•œ ๊ฒฐ๊ณผ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค์‹œ ํด๋ผ์ด์–ธํŠธ ์ชฝ์—์„œ ๊ฐ’์„ ์žฌ๋ฐฐ์น˜ํ•ด์ค˜์•ผ ํ•œ๋‹ค.
    form ํ˜•ํƒœ๋กœ ๋ณด๋‚ด๋ฉด ์•Œ์•„์„œ ์ฒ˜๋ฆฌํ•ด์ฃผ๋‹ˆ๊นŒ ์ง€๊ธˆ ๋ฐฉ์‹์ด ํšจ์œจ์ ์ธ ๋ฐฉ์‹์ด ์•„๋‹ˆ๋ผ๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ๋‹ค.

    ๊ฒ€์ƒ‰๋งŒ์„ ์œ„ํ•œ /search ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“œ๋Š”๊ฒƒ๋ณด๋‹ค๋Š” ๊ธฐ์กด์— ์žˆ๋Š” list์—์„œ ํ•„ํ„ฐ๋ง๊ณผ ๊ด€๋ จ๋œ ๋ชจ๋“  ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•˜๋Š”๊ฒƒ์ด ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค.

 

2. ๋‘ ๋ฒˆ์งธ ๋ฐฉ๋ฒ•

์ด ๋ฐฉ๋ฒ•์œผ๋กœ ๊ฐˆ๊ฒƒ ๊ฐ™๋‹ค! ๊ธฐ์กด์˜ ๋ฐฉ์‹์€ ๊ฒฐ๊ณผ๋ฐ์ดํ„ฐ๋ฅผ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ง€์— ๋Œ€ํ•ด์„œ ๊ณ ๋ฏผํ•˜๋‹ค๊ฐ€ ๊ฐ€๋…์„ฑ ์ด์Šˆ๋กœ ๊ณผ๊ฐํ•˜๊ฒŒ ํฌ๊ธฐํ–ˆ๊ณ , form์˜ ํ˜•ํƒœ๋กœ ์ฒ˜๋ฆฌํ•˜๊ธฐ๋กœ ํ–ˆ๋‹ค.

 

 

๊ธฐ์กด์— ๋‚ด๊ฐ€ form ๋ฐฉ์‹์„ ๊ณ ๋ คํ–ˆ๋‹ค๊ฐ€ ํฌ๊ธฐํ•œ ์ด์œ ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

 

 

๋ฒ„ํŠผ์— ์žˆ๋Š” ๊ฐ’์„ Listํ˜•ํƒœ๋กœ ๋ณด๋‚ด์•ผํ•˜๋Š”๋ฐ ๊ฐ™์€ id๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ list์˜ ํ˜•ํƒœ๋กœ ๋ณด๋‚ด๋Š”๊ฒƒ์ด checkbox ๋ง๊ณ ๋Š” ์•ˆ๋˜๋Š” ๊ฑธ๋กœ ์•Œ๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

 

์•„๋ฌด๋ฆฌ ๊ตฌ๊ธ€๋ง์„ ํ•ด๋ด๋„ ์ž˜ ๋ชจ๋ฅด๊ฒ ์–ด์„œ.. ๊ทธ๋ƒฅ ํด๋ฆญ ์•ก์…˜ ์ฒ˜๋ฆฌํ•  ๊ฒธ ajax๋ฅผ ์“ด๊ฑด๋ฐ checkbox๋ฅผ ํ•œ๋ฒˆ ์ž˜ ์ˆจ๊ฒจ์„œ ์ฒ˜๋ฆฌํ•ด๋ณด์ž๋Š” ํ”ผ๋“œ๋ฐฑ์„ ๋ฐ›์•˜๋‹ค!

 

 

See the Pen [ํฌ์ŠคํŒ…] checkbox๋ฅผ ์ˆจ๊ฒจ์„œ ํด๋ฆญ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌํ•˜๊ธฐ by ๋ฐ•๋‹ค์ • (@lion0913) on CodePen.

 

 

 

๋‚ด๊ฐ€ ์ฐธ๊ณ ํ•œ ๋ฐฉ์‹์ด๋‹ค. ์ด๋ ‡๊ฒŒ ๋ณด๋ฉด ์ดํ•ด๊ฐ€ ํž˜๋“ค ์ˆ˜๋„ ์žˆ์ง€๋งŒ opacity๋ฅผ ์ฃผ์„์ฒ˜๋ฆฌํ•˜๋ฉด

 

 
์ด๋ ‡๊ฒŒ ๋œ๋‹ค. ์ฆ‰, ์ˆจ๊ฒจ์ ธ์žˆ๋Š” ์ฒดํฌ๋ฐ•์Šค๋ฅผ ํด๋ฆญํ•˜๋ฉด ๋ฒ„ํŠผ์˜ ์ƒ‰๊น”์ด ๋ฐ”๋€Œ๋ฉด์„œ ํด๋ฆญ ์ด๋ฒคํŠธ๊ฐ€ ์ฒ˜๋ฆฌ๋˜๋Š” ๊ฒƒ์ด๋‹ค.
 
 
 

์ด๋ ‡๊ฒŒ!

์ด๋ ‡๊ฒŒ ์ฒดํฌ๋ฐ•์Šค๋ฅผ ์ฒ˜๋ฆฌํ•ด์ฃผ๋ฉด form์„ list ํ˜•ํƒœ๋กœ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๊ณ , ๋ฒ„ํŠผ์˜ ๋ชจ์–‘ ๊ทธ๋Œ€๋กœ๋ฅผ ์ฑ™๊ธธ ์ˆ˜ ์žˆ์–ด์„œ ๋‚ด๊ฐ€ ์˜๋„ํ•œ ๊ทธ๋ฆผ๊ณผ ์ผ์น˜ํ•œ๋‹น

 

๊ทธ๋ ‡๋‹ค๋ฉด ์–˜๋ฅผ ์ด์ œ ํ”„๋กœ์ ํŠธ์— ์ ์šฉํ•ด๋ณด์ž!

 

 

๊ณผ๊ฐํ•˜๊ฒŒ ajax ์ฒ˜๋ฆฌ๋ถ€๋ถ„์„ ์‚ญ์ œํ•ด๋ฒ„๋ฆฌ๊ณ  list.html ๋ถ€๋ถ„์„ ์†๋ดค๋‹ค.

<div th:each="category,index:${categoryList}">
    <input type="checkbox" name="category" th:value="${category.id}">
    <div th:text="${category.tagName}" type="button" class="btn btn-outline-info"></div>
</div>

codepen์— ์˜ฌ๋ฆฐ๋Œ€๋กœ input๊ณผ div๋ฅผ ํ•œ์Œ์œผ๋กœ ๋‘๊ณ , input์˜ ํƒ€์ž…์„ checkbox๋กœ ์„ค์ •ํ•ด list ํ˜•ํƒœ๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ–ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด input์ด ์„œ๋ฒ„์—๊ฒŒ ๋„˜๊ฒจ์ค„ ๊ฐ’์ธ id๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

 

๊ฐ™์€ ๋ผ์ธ์— ๋ฒ„ํŠผ์„ ๊พธ๋ฉฐ์ฃผ๊ธฐ์œ„ํ•ด์„œ ๋ฒ„ํŠผ์„ ๋„ฃ๊ณ  ๋ณธ๊ฒฉ์ ์œผ๋กœ css ์ž…ํžˆ๊ธฐ๋ฅผ ์‹œ์ž‘ํ–ˆ๋‹ค..

 

 

codepen์—์„œ์˜ css ์ฝ”๋“œ์™€ ํฌ๊ฒŒ ๋‹ฌ๋ผ์ง„ ์ ์€ ์—†๋‹ค. ์ƒ‰๊น”๊ณผ ํ…Œ๋‘๋ฆฌ ๋‘ฅ๊ธ€๊ธฐ์ •๋„??

.gather-category input[type="checkbox"]:checked + div {
    color:white;
    background-color: #01C9C6;
}

.gather-category > div {
    display: inline-block;
    position: relative;
}

.gather-category > div > input[type="checkbox"] {
    position: absolute;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    opacity: 0;
}

.gather-category > div > div {
    color:#01C9C6;
    font-size: 14px;
    outline-color: #01C9C6;
    margin-right: 15px;
    margin-bottom: 10px;
    padding: 10px 20px;
    border-radius: 25px;
    white-space: nowrap;
}

position์„ relative, absolute ๊ด€๊ณ„๋กœ ๊ฐ๊ฐ ๋‘๋ฉด์„œ, ๋‚ด๋ถ€ ๋ฐ•์Šค๊ฐ€ button ์•ˆ์— ๋“ค์–ด๊ฐ€๊ฒŒ ํ–ˆ๊ณ , checkbox์˜ ํˆฌ๋ช…๋„๋ฅผ ์ตœ๋Œ€๋กœ ํ–ˆ๋‹ค๊ณ  ์š”์•ฝํ•  ์ˆ˜ ์žˆ๋‹ค..ใ…Žใ…Ž (css ์ฝ”๋“œ๊ฐ€ ๋„ˆ๋ฌด ์ง€์ €๋ถ„ํ•œ๋ฐ ๊ฑด๋“œ๋ฆด ์—„๋‘๊ฐ€ ๋‚˜์ง€ ์•Š๋Š”๋‹ค)

 

 

์ด๋ ‡๊ฒŒ ํ•ด์„œ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰์‹œํ‚ค๋ฉด!

 

 

ํด๋ฆญ ์‹œ ์ƒ‰๊น”์ด ์ด๋ ‡๊ฒŒ ์˜ˆ์˜๊ฒŒ ๋“ค์–ด๊ฐ„๋‹ค…ใ…Žใ…Ž ๋„ˆ๋ฌด ๊ท€์—ฝ๋‹ค!

 

 

 

 

 

๊ฒฐ๊ณผํ™”๋ฉด์ด๋‹ค!! ๋ชป์ƒ๊ธด ๊ฒ€์ƒ‰ํ™”๋ฉด ๋ฐฐ์น˜๋Š” ๋ฌด์‹œํ•ด์ฃผ๊ธธ ๋ฐ”๋ž€๋‹ค.. ๊ณง ์˜ˆ์˜๊ฒŒ ๊พธ๋ฉฐ์ค„๊ฑฐ๋‹ค.

 

'๐Ÿ’ป Project > project' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[DB] Mysql ํ•œ๊ธ€๊นจ์ง, Mariadb ํ•œ๊ธ€๊นจ์ง ํ•ด๊ฒฐ๋ฐฉ๋ฒ•  (0) 2022.09.06
    '๐Ÿ’ป Project/project' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
    • [DB] Mysql ํ•œ๊ธ€๊นจ์ง, Mariadb ํ•œ๊ธ€๊นจ์ง ํ•ด๊ฒฐ๋ฐฉ๋ฒ•
    budtree
    budtree
    ๊ฐœ๋ฐœ, ์šด๋™, ์ผ์ƒ๋“ฑ์˜ ๊ธ€์„ ์˜ฌ๋ฆฝ๋‹ˆ๋‹ค.

    ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”