[    무한스크롤 구현 (스크롤 마지막을 인식하는 이벤트 처리)    ]



페이스북같은 SNS 사이트를 보면, 스크롤이 끝부분에 위치하면 추가적으로 데이터(글)들이 나오는 것을 알 수 있다.


이처럼 처음부터 다 나오는 것이 아니라 스크롤 끝에 갔을 때 특정 작업을 하려면


다음과 같이하면 된다.


$(window).scroll(function() { // 스크롤 이벤트가 발생할 때마다 인식

       // 스크롤이 끝에 닿음을 인식

    if ( $(window).scrollTop() == $(document).height() - $(window).height() ) {

    }

});


이처럼 작업해주면 되는데

이렇게 스크롤이 끝에 닿음을 인식할 때마다, PagingDTO등을 이용해서 다음 페이지 값을 불러오도록 처리해 주는 것과 연게하면


페이징처리를 이용한 무한스크롤을 구현할 수 있다.


위의 코드에서 listAll(page,keywords) 부분이 page를 넘기고 끝에 닿을 때마다 페이지를 ++해서 다음페이지를 불러오도록 하는 부분이다.


listAll 등의 함수에 대해 추가적으로 필요하신 분들은 요청시 코드 드리겠습니다.



[    동적으로 생성된 태그에 이벤트를 걸려면 어떻게 해야할까??    ]




가끔 ajax로 가져온 데이터를 문자열로 조합해서 태그에 append하는 경우 이런경우는 태그가 미리 생성되어 있는 경우가 아니라 동적으로


생성된 경우이다. 이런 경우에 문자열로 만든 태그에다가 id나 class준 다음에 $(선택자).on("click",function(event){}) 방식을 사용해서 이벤트를 걸어도


이벤트가 걸리지 않음을 알 수 있다.


이런 경우 어떻게 해야할까??


이런 경우는 document 객체에서 잡아와서 이벤트를 걸어야한다.


ex) $(document).on("click","선택자",function(event){})


[    클릭시 특정 태그 위치로 스크롤을 이동시키기    ]







[    이벤트 발생시 a 태그의 이동기능을 동작하지 않게하고 처리하기    ]




아주 가끔 a태그를 클릭시 a태그 href 에 지정된 속성으로 이동을 막고, 처리가 필요한 경우에 어떻게하는지에 대한 포스팅입니다.



[    JQuery 애니메이션 관련 정리(fadeIn,fadeOut,hide,show,animate,stop)    ]




[    script 선언의 위치와 수행 순서에 대해서...     ]



<script type="text/javascript">

...

</script>


이런식으로 스크립트를 작성하게 되는데 이때, 이 스크립트 블록을 어디다 수행하는게 좋을까요??


어디든 상관은 없습니다. 하지만 주의해야하는 사항이 몇가지 있죠


예를들어, head 태그 안에서 script를 선언하고 body 안에 선언해 놓은 태그에 대한 작업을 한다고 해봅시다.


그러면 어떻게 될까요? 


해당 script가 수행되는 시점에서 body 태그는 아직 파싱되기 전이기 때문에 script에서 해당 태그가 무엇인지 알 수가 없게 됩니다.


따라서 그냥 null을 가지고 작업을하게되죠...


따라서, body 태그가 다 로딩되고 body 태그 안에서 제일 밑 부분에 작성할 스크립트를 위치시켜주는 것이 best일 것입니다.


<!DOCTYPE html>

<html>

  <head>

    <meta charset="utf-8">

    <title></title>

  </head>

  <body>

    <input type="text" name="" value="" id="in">

    <table>

      <tr>

        <td>dd</td>

      </tr>

    </table>


    <script type="text/javascript">

      document.getElementById("in").value = "modifyValue";

    </script>

// 이처럼 아래쪽에 위치시켜주는 것이 좋습니다. 이걸 만약 head 태그 내에 위치하거나 input 태그 위에 위치시킨다면

// 스크립트가 제대로 수행될 수 없겠죠?

  </body>

</html>

[    3. 일정주기마다 callback 함수를 실행하는 setInterval()에 대해서...    ]



Callback Function

  • 조건을 등록해 두고 그 조건을 만족한 경우, 나중에 호출되는 함수

시간을 기반으로 콜백함수를 호출하는 명령

setTimeout( function, time )

  • time 시간이 지난 경우 function 함수를 콜백하는 함수
  • time 은 millisecond (1/1000초) 단위
  • timerId를 반환함

clearTimeout( timerId )

  • setTimeout 함수 호출의 결과로 반환된 timerId를 인자로 받아 예약되어 있던 function호출을 취소
    • 이미 function이 호출된 경우(시간이 지나 이벤트가 발생한 경우)에는 효과 없음

setInterval( function, time )

  • time 시간이 경과할 때마다 function 함수를 콜백하는 함수
  • timerId를 반환함

clearInterval( intervalId )

  • setInterval 함수 호출의 결과로 반환된 intervalId를 인자로 받아 주기적으로 호출되던 function 호출을 취소


다음 예시 사진을 보면, setTimeout을 호출 했을 때 3초뒤에 callback()으로 지정한 함수가 실행된 것을 알 수 있습니다.


이때, 142를 반환했는데 이것은 setTimeout의 id라고 생각하시면 되고 지정한 setTimeout을 해제하기 위해서는 clearTimeout(setTimeout의 id)를 넣어주어야 취소가 가능합니다.


다음으로


setInterval ( 수행할 메서드, 시간) 으로 여기선 5초 마다 콜백 메서드를 수행하도록 되어 있습니다. 이것을 해제하기 위해서는 역시 callback 메서드의 id가 143번 임으로


clearInterval(143)을 통해 해제 시켜 준 것을 알 수 있습니다.


콘솔에서는 id가 몇번인지 알 수 있지만 코드상에서 작성할 때에는 바로바로 확인이 어려움으로


var setIntervalId = setInterval(callback, 5000);

clearInterval(setIntervalId); 처럼 해서 사용하시면 됩니다.



[    2. JQuery로 선택한 태그 요소의 값과 속성을 바까보자    ]



  <body>

    <textarea name="txtarea" rows="8" cols="80">

      <strong>안녕하세요</strong>

    </textarea>

    <input type="text" name="first" value="firstValue" />

    <input type="text" name="second" value="secondValue" style="color:red;">

    <a href="http://www.google.com" id="aTag">구글</a>

    <table id="tableTag">

      <tr class="hello">

        <td>안녕</td>

      </tr>

    </table>


    <script type="text/javascript">

      $(document).ready(function(){

        // 1. 태그 내의 텍스트 가져오기

        var textareaVal = $("textarea[name=txtarea]").text();

        // 텍스트를 가져오기 때문에 <strong> 태그도 문자열로 그대로 가져온다.

        console.log(textareaVal);


        // 2. 태그 내의 텍스트 변경하기

        $("textarea[name=txtarea]").text("값을 변경합니다.");


        // 3. input 태그 내의 value 값 가져오기

        var inputFirstVal = $("input[name=first]").value();

        console.log(inputFirstVal);


        // 4. input 태그 내의 value 값 바꾸기

        $("input[name=first]").value("value 값 바꾸기");


        // 5. textarea 내에 태그를 포함한 문자열을 그대로 집어 넣기

        // text() 와의 차이점은 text는 태그를 포함하는 문자열을 그대로 넣는다.

        // ex) <b>안녕</b> 를 넣으면 textarea에서는 <b>안녕</b>가 출력됨

        // 하지만, 이 곳에서 사용할 html() 은 b태그가 적용된 안녕이 출력되게 됨

        $("textarea[name=txtarea]").html("<b>안녕</b>");


        // 6. 태그의 속성값을 가져오기

        // 아래처럼하면, style이라는 속성의 값을 가져옴

        var styleValue = $("input[name=second]").attr("style");

        // a 태그의 href 속성값을 가져옴

        var hrefVal = $("#aTag").attr("href");


        // 7. 태그의 속성값을 바까보자.

        // name이 second인 input 태그의 style 속성을 바까 글자색을 노랑색으로 바꿈

        $("input[name=second]").attr("style","color:yellow;");

        // a태그의 href 속성값을 naver로 바꿈

        $("#aTag").attr("href","http://www.naver.com");


        // 8. 태그 내에 추가하기

        // 위의 html()이나 text()는 태그 사이에 지정한 걸로 완전히 치완되버리는 것!

        // 하지만, append는 기존에 있던 것에다가 추가되는 개념이다.

        // 예를들어, 지금 table태그 내에 최초에 <tr><td>안녕</td></tr> 이 있는데

        // $("#tableTag").html("<tr><td>추가</td></tr>"); 을 하면 기존의 안녕은 없어지고

        // 추가가 들어갈 것이지만 append를 하면 안녕 바로 아래에 추가가 붙게된다.

        $("#tableTag").append("<tr><td>추가</td></tr>");


        // 9. 위의 append()가 지정한 태그 내부에 하나씩 아래로 붙는다면

        // prepend()는 지정한 태그 내부에서 가장 마지막에 삽입된 녀석의 앞에 붙게 됩니다.

        // 예를들어, table 태그 내에 안녕과 추가가 들어 있는데 prepend로 추가2를 넣으면

        // 추가 뒤에 들어오는게 아니고 안녕 앞에 추가2가 들어오게 됩니다.

        $("#tableTag").prepend("<tr><td>추가2</td></tr>");


        // 10. 지정한 태그 다음 위치에 추가하기

        $("#tableTag").after("<p>table태그 다음에 추가합니다.</p>");


        // 11. 지정한 태그 이전 위치에 추가하기

        $("#tableTag").before("<span>table태그 이전에 추가합니다.</span>");


  // 12. 태그 내부의 지정한 것만 비우기

  $("#tableTag").remove(".hello");


        // 13. 지정한 태그 내부 전부를 비우기

        $("#tableTag").empty(); // 기존에 내부에 있던 tr td 등을 싹 비워버립니다.

      });

    </script>

  </body>

</html>



[    Javascript의 브라우저 창 Window 객체(부모창 자식창 값 주고 받기 포함)    ]



window 객체


    • Javascript 실행시 가장 상위에 존재하는 객체

        • 변수를 선언하거나 함수 선언시 window 객체안에 선언됨
        • 크롬에서 F12를 눌러 console탭에서 window 객체를 입력해서 다양한 속성들을 조회해볼 수 있음.
    • 표시된 웹 페이지의 정보에 접근하거나 변경을 할 수 있음

        • window.location : 현재 브라우저 창의 주소를 나타내는 객체
        • window.location.href : 브라우저 창에 입력된 주소, 변경 가능
          • ex) window.location.href = "이동하고자하는 url "
          • ex) window.location.replace = "이동하고자하는 url" 위의 것과 차이점은 이동하고나서 뒤로가기 버튼이 활성화되지 않음.
        • window.open : 새창 띄우기
        • window.navigator : 브라우저 자체에 대한 정보
        • window.screen : 디스플레이의 사이즈
        • window.document : 웹 페이지 문서의 HTML, CSS 등에 대한 접근 가능









    • 2. [ window 객체를 이용해 새창을 띄우고 부모창과 자식창 사이에서 값을 주고 받는 방법 ]


    • var windowObj = window.open("새창에서띄울url","창이름","창의설정(옵션값)"); 처럼하면 현재창에서 새로운 창이 뜨게 됩니다. 이때 기존의 창이 부모창이 되고 새로 뜨게된 창이 자식창이되게되는데

      이때, 부모창과 자식창 사이에서 값을 주고 받기 위해서는 띄운 창의 window 객체를 저장할 변수를 선언해 저장해 놔야합니다.(windowObj)

      그런 다음 부모 창에서는 이 windowObj 변수를 이용해 자식창에 값을 전달할 수 있습니다. 예를들어, 

      windowObj.document.text2.value = "값 입력"; 이런식으로 자식창(새창)의 document 객체에 얼마든지 접근할 수 있습니다. 

      그러면, 반대로 자식창에서 부모창으로 값을 보내기 위해서는 어떤 식으로 해야할까요??

      일단, 부모창에서 자식창을 생성하면 이 자식창은 생성과 동시에 opener 라는 객체를 가지게 되고 이 opener는 바로 부모객체의 window 객체를 가리키게 됩니다. 따라서

      opener.document.parentText.value = document.text2.value; 이런식으로 자식에 있는 값을 부모 창으로 넘기는게 가능합니다.


      먼저, windowOpen1.html 즉, 부모창 예제 코드입니다.




다음으로 windowOpen2.html 즉, 자식창 예제 코드입니다.



위의 예제는 동일 폴더 내에서 테스트한걸로 크롬 보안상 작동하지 않을 수 있지만, 웹 서버에서 할 때는 잘 작동한다는 점 참고해주시기 바랍니다.



+ Recent posts