json 데이터 ajax로 받아오기 (prototype) Javascript

이번엔 자바스크립트의 프레임워크인 프로토타입에서의 JSON 데이터 AJAX로 받아오는 것을 구현해봅니다.

* prototype.js는 http://www.prototypejs.org/download 에서 받으셔서 디렉토리에 넣으시면 됩니다.


1. http://marobiana.egloos.com/65298 에서 php배열을 json데이터로 변환한 것을 참고 하세요. (파일이름 : json.php)

여기서 아래 코드를 추가합니다.

$i = $_GET['i'];    // 누른버튼이 어떤 버튼인지 식별하기 위해 url로 받아온 값을 $i에 저장

if(is_array($data[$i])){       // $data 배열에 $i 를 키로 넣었을때 그 배열이 존재 하는지 알아봄. 없다면 잘못된 값. (age나 blood_type만 있어야겠지요)
    die(json_encode($data[$i]));
}


2. HTML 코드 작성(파일이름 : prototype_json.html)

<center>
<div id="wrap">
    <div id="tab_title">
        <form name="info" id="infom" action="#">
            <input type="button" id="age" value="나이" />
            <input type="button" id="blood_type" value="혈액형" />
        </form>
    </div>
<!-- 클릭한 것에 따라 AJAX에서 받아온 데이터가 아래에 보여지고 content 디비전이 나타나게 됨-->

    <div id="content" style="display:none;">
    <!--내용 들어갈 곳-->
        <table border=1>
            <tr>
                <td>첫번째 사람</td>
                <td id='val1'></td></tr>  <!-- innerHTML(프로토타입의 update함수)를 통해 Ajax로받은 데이터가 들어간다-->
            <tr>
                <td>두번째 사람</td>
                <td id='val2'></td><!-- innerHTML(프로토타입의 update함수)를 통해 Ajax로받은 데이터가 들어간다-->
            </tr>
        </table>
    </div>
</div>
</center>


일반 스크립트에서 구현된 Ajax에서는 onclick 이벤트로 ajax를 호출하지만
이번엔 옵저버를 사용해서 그 부분은 빼버렸습니다.


3. 자바스크립트 코드를 prototype_json.html 에 추가합니다.

<script type="text/javascript" src="prototype.js"></script> 
<script type="text/javascript"> 
Event.observe(window , 'load' , init); 


function init() {  
    $('age').observe('click' , function(event){getData('age')});  
    $('blood_type').observe('click' , function(event) {getData('blood_type')}); 

/*     클릭 이벤트 검사할 항목이 많다면 다음과 같은 방법도 있습니다. (init 함수 안의 내용)   */
    document.observe('click', function(event) {
        var element = Event.element(event);
        getData(element.identify());
    });

    문서 전체에 클릭 이벤트가 일어나는지 observe를 합니다. 
    클릭이 일어나면 그 이벤트가 일어난 element를 element변수에 저장합니다.
    그 element객체의 아이디를 getData의 파라미터로 넘깁니다.


function getData(param) {  
    new Ajax.Request(  
    'json.php', // json이 있는 위치
        { 
           method:'get',
           parameters: {i:param},   
/*
콜론이라는 점에 유의하세요. 
param은 age또는 blood_type이 될것입니다.
?i=age  또는 ?i=blood_type 으로 사용되는걸 프로토타입에선 parameters로 제공하는것입니다
json.php에서 get으로 받아 사용하게 될겁니다.
*/

           onSuccess: function(jsonData) {  
           var result = jsonData.responseText.evalJSON(true); // 객체로 만든다
           
           var j=1;
           for(var i in result){
                var obj = document.getElementById("content"); // table 감싼 div를 보일지 말지
                obj.style.display ="";
                $('val'+j).update(result[i]);
                j++;
           }   
        }});  

</script>




Event.observe(window , 'load' , init); 

prototype에서 제공하는 옵저브 함수입니다. observe의 뜻은 '관찰하다'이지요.
이 함수를 통해서 로드 됐을 때 페이지 전체를 관찰합니다.
그리고 init 함수를 호출 합니다.


 $('age').observe('click' , function(event){getData('age')});  

프로토타입에서 $('아이디')를 하면 그 아이디를 객체로 가져오게 됩니다.

*****만약 해당아이디에 무슨 값이 있는지를 가져오고 싶다면...
(예를 들면 input type이 text인것의 사용자가 입력한 값을 가져오고 싶다면)
$F('아이디') 를 하면 됩니다.

아무튼 age라는 아이디를 가진 버튼에 클릭 이벤트가 주어지면 getData라는 함수를 콜하고 age를 파라미터로 넘깁니다.

age를 왜 넘길까요???
어떤 부분에서 클릭이 일어났는지를 알아야 그 부분에 대한 데이터를 받아오겠죠.
json.php에서 get으로 어디에서 클릭이 일어났는지 받게 되는데요.
그 값이 바로 getData의 파라미터인 것입니다.


new Ajax.Request(
    method: '
get' 또는 'post',
    parameters:
{저장될 곳:값},
     onLoading: function() { },
     onFailure: function() { },
     onComplete: function() { },
    onSuccess: function(data){

        // 리턴값으로 받아진 내용을 가지고 여기서 구현한다
        var result = data.responseText;
    }
)

method는 프로토타입에서 기본적으로 post방식으로 제공됩니다.
get인 경우 꼭 명시를 해주어야하고, post일 경우 생략 가능합니다.


onLoading은 Ajax통신을 시작할 때 함수 내용이 실행되며,
onSuccess는 통신이 성공되면 실행합니다.
onFailure는 통신이 실패했을때 실행하구요.
onComplete는 통신의 성공여부에 상관 없이 통신이 끝났을 때 실행하게 됩니다.

필요한 경우에 따라 적절히 사용하세요~
더 많은 옵션이 있지만 잘 안쓰는것 같으므로...
여기서는 onComplete를 사용해도 됩니다.

php에서 보내준 문자열을 eval함수를 통해 객체화 시킵니다.
그냥 자바스크립트에서는  var result = eval("(" + xmlHttp.responseText + ")");  이렇게 사용했었는데
프로토타입에서는 var result = jsonData.responseText.evalJSON(true); 이렇게 쓰네요.
자세히 뜻은 모르겠지만 json에 대해 적절히 처리를 해주는듯 합니다.



$('val'+j).update(result[i]);

이부분은 innerHTML과 같습니다.
아이디가 'val1' 또는 'val2'인 곳에 result[i] 값을 넣어주는것이죠.



트랙백

이 글과 관련된 글 쓰기 (트랙백 보내기)
TrackbackURL : http://marobiana.egloos.com/tb/65939 [도움말]

덧글

댓글 입력 영역