테스트 사이트 - 개발 중인 베타 버전입니다

ajax 질문 드립니다. 채택완료

망고프리 3년 전 조회 3,320

안녕하세요.

기존에 잘 되던 소스코드 였는데 어느순간부터 작동을 안하네요.

디버깅을 해봐도 값을 못가져오네요.

환경 : php7, 크롬

 

startRequest('3197','3197','1','1','1','1','0');

호출해서

 

function handleStateChange() {

if(xmlHttp.readyState == 4) {   ==> 정상

   if(xmlHttp.status == 200) {  ==> 정상imgCourse(xmlHttp.responseXML.getElementsByTagName("name"),xmlHttp.responseXML.getElementsByTagName("img_size_width"),xmlHttp.responseXML.getElementsByTagName("img_size_height"));

 

아래 3개의 값을 못가져오네요.

xmlHttp.responseXML.getElementsByTagName("name")

xmlHttp.responseXML.getElementsByTagName("img_size_width")

xmlHttp.responseXML.getElementsByTagName("img_size_height")

 

 

 

ajax_test.php

</p>

<p><script type="text/javascript">

var xmlHttp;</p>

<p>function createXMLHttpRequest() {

    if (window.ActiveXObject) {

        xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");

    } else if (window.XMLHttpRequest) {

        xmlHttp = new XMLHttpRequest();

    }

}

    

function startRequest(uid,vuid,page_num,vs,pv,vcount,vautobetween) {

    //var vautobetween =  frmjump.autobetween.value;

    createXMLHttpRequest();

    xmlHttp.open("POST", "ajax_test_data.php?uid="+uid+"&vuid="+vuid+"&page_num="+page_num+"&vs="+vs+"&pv="+pv+"&vcount="+vcount+"&vautobetween="+vautobetween, true);

    xmlHttp.onreadystatechange = handleStateChange;

    xmlHttp.send(null);

}

    

function handleStateChange() {

    if(xmlHttp.readyState == 4) {

        if(xmlHttp.status == 200) {

            imgCourse(xmlHttp.responseXML.getElementsByTagName("name"),xmlHttp.responseXML.getElementsByTagName("img_size_width"),xmlHttp.responseXML.getElementsByTagName("img_size_height"));

            setPageNum(xmlHttp.responseXML.getElementsByTagName("page"));

        } 

        else {

            alert('데이터 통신 에러');

        }

    }

}</p>

<p>function setPageNum(the_names) {

    var size = the_names.length;

    var txtNode;

    var nextNode = the_names[0].firstChild.data;

    var pv = frmjump.pv.value;

    </p>

<p>    if(pv != 1 ) { 

        nextNode++; 

    }

    frmjump.page_num.value = nextNode; 

}</p>

<p>function imgCourse(the_names,the_img_size_width,the_img_size_height) {

    var size = the_names.length;

    var txtNode;

    var pv = frmjump.pv.value;</p>

<p>    alert(size);</p>

<p>/*

    if(userid[0].firstChild.data == '') {

        alert('사용자 정보가 존재하지 않습니다.\n다시 보기 버튼를 클릭해 주세요.');

        window.close();

        return false;

    }

*/

    if(pv == 1) {

        var nextNode = the_names[0].firstChild.data;

        document.getElementById("comic_img" + pv + "_1").height = "800";

        document.getElementById("comic_img" + pv + "_1").src = nextNode;

    } 

    else 

    {

        for (var i = 0; i < size; i++) {

            var j = i + 1;

            var nextNode            = the_names[i].firstChild.data;

            var img_size_width        = the_img_size_width[i].firstChild.data;

            var img_size_height        = the_img_size_height[i].firstChild.data;</p>

<p>            // 만화 사이즈 조정하기

            //if(img_size_height > 600 && img_size_height < 800) { img_size_height = 800; img_size_width = 600; }

            //else if(img_size_height < 600) { img_size_height = 700; img_size_width = 500; }

            //alert(img_size_height);

            document.getElementById("comic_img" + pv + "_" + j).height    = img_size_height;

            document.getElementById("comic_img" + pv + "_" + j).width    = img_size_width;

            document.getElementById("comic_img" + pv + "_" + j).src        = nextNode;

        }

    } 

}</p>

<p>

startRequest('3197','3197','1','1','1','1','0');

</script>

 

ajax_test_data.php

</p>

<p><?

    $rss_idsu  = '';

    $rss_idsu .= "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>"; 

    $rss_idsu .= "    <response>"; 

    $rss_idsu .= "      <name>aaaaaaaa</name>";

    $rss_idsu .= "      <img_size_width>500</img_size_width>";

    $rss_idsu .= "      <img_size_height>1000</img_size_height>";

    $rss_idsu .= "    <page>50</page>";

    $rss_idsu .= "    </response>"; 

    echo $rss_idsu;

?></p>

<p>

댓글을 작성하려면 로그인이 필요합니다.

답변 2개

채택된 답변
+20 포인트

제 경험상...

XMLHttpRequest() 로 데이터를 로드할 때는 아작스 형태이거나 동기식일 때거나 상관없이

먼저 데이터인 responseText 를 문자열로 불러와서 textarea 안으로 넣어놓고 시작하는 것이

편하더라구요.

다시 말하면 ajax_test_data.php 를 직접 핸들링하는 것이 아니라 ajax_test_data.php 의 전체 문자열을 가져와서 ajax_test.php 안에서 문자열을 파싱하는 것이죠.

 

먼저 ajax_test.php 를 아래처럼 구성합니다.

그럼 textarea 안으로 문자열로 입력됩니다.

</p>

<p><script>

function ajaxData() {

    document.write("<textarea>" + ajaxXhr.responseText + "</textarea>");

}

function ajaxMode() {

    ajaxXhr = new XMLHttpRequest();

    ajaxXhr.open("POST", "ajax_test_data.php");

    ajaxXhr.send();

    ajaxXhr.onreadystatechange = function() {

        if (ajaxXhr.readyState == 4 && ajaxXhr.status == 200) ajaxData();

    }

}

ajaxMode();

</script></p>

<p>

 

문자열을 보면서 상황에 적합한 정규식이나 파싱방법으로 원하는 부분만 변수로 만들어 줍니다.

저는 split() 메소드로 정리를 했습니다. 정리가 끝나면 textarea 는 주석처리하거나 삭제하면 되겠죠.

1번예제

</p>

<p><script>

function ajaxData() {

    //document.write("<textarea>" + ajaxXhr.responseText + "</textarea>");

    myName = ajaxXhr.responseText.split("<name>")[1].split("</name>")[0];

    myWidth = ajaxXhr.responseText.split("<img_size_width>")[1].split("</img_size_width>")[0];

    myHeight = ajaxXhr.responseText.split("<img_size_height>")[1].split("</img_size_height>")[0];

    myPage = ajaxXhr.responseText.split("<page>")[1].split("</page>")[0];

    document.write(myName + "
" + myWidth + "
" + myHeight + "
" + myPage);

}

function ajaxMode() {

    ajaxXhr = new XMLHttpRequest();

    ajaxXhr.open("POST", "ajax_test_data.php");

    ajaxXhr.send();

    ajaxXhr.onreadystatechange = function() {

        if (ajaxXhr.readyState == 4 && ajaxXhr.status == 200) ajaxData();

    }

}

ajaxMode();

</script></p>

<p>

 

2번예제는 my 라는 div 를 감아서 tagName 을 물고 늘어져 원하는 부분만 취한 후 div 를 remove 시켜버리는 방법인데 거의 안 쓰는 방식이고 xml 파일처럼 node 로 이루어져 있는 문서에만 유효한 그냥 저만 사용하는 방식(아마도)입니다.ㅋ

</p>

<p><script>

function ajaxData() {

    document.write("<div id=my>" + ajaxXhr.responseText + "</div>");

    you = my.getElementsByTagName("response")[0].getElementsByTagName("*");

    for (i = 0; i < you.length; i++) document.write(you[i].tagName.toLowerCase() + " : " + you[i].innerText + "
");

    my.remove();

}

function ajaxMode() {

    ajaxXhr = new XMLHttpRequest();

    ajaxXhr.open("POST", "ajax_test_data.php");

    ajaxXhr.send();

    ajaxXhr.onreadystatechange = function() {

        if (ajaxXhr.readyState == 4 && ajaxXhr.status == 200) ajaxData();

    }

}

ajaxMode();

</script></p>

<p>

 

애초에 로드하는 문서의 형태가 배열 오브젝트로 이루어진 JSON 이라면 더 쉽고 많은 방법들이 있습니다만... 아마도 rss 를 가져오는 xml 식이라면 어쨌거나 문자열을 직접 보면서 코딩하는 것이 굉장히 편합니다.

로그인 후 평가할 수 있습니다

답변에 대한 댓글 1개

망고프리
3년 전
답변 감사합니다.
위 소스로 수정해 보겠습니다.

댓글을 작성하려면 로그인이 필요합니다.

티로그
3년 전

post 로 넘기는데 xmlHttp.send(null) 은 이상한 것 아닌가요?

로그인 후 평가할 수 있습니다

답변에 대한 댓글 1개

망고프리
3년 전
// xmlHttp.send(null) 주석처리 해도 값을 못가져오네요

댓글을 작성하려면 로그인이 필요합니다.

답변을 작성하려면 로그인이 필요합니다.

로그인