2012-12-24 2 views
9

내 배경은 C++ 및 .NET 프로그래밍과 같은 전통적인 컴파일 된 객체 지향 언어로되어 있으며 이제는 새 프로젝트를 위해 약간의 JavaScript를 사용하고 있습니다. 나는 AJAX로 도박을하고 있었고 브라우저가 객체를 관리하는 방법에 대해 혼란 스러웠습니다.자바에서 xmlhttprequest 객체를 생성, 병합 및 파괴하는 방법

  1. 버튼 텍스트 1 업데이트 TextArea1 : -

    [편집 # 2] 액티브 콘텐츠 스크립트의 변화

    나는 <textarea>XMLHttpRequest 개체를 사용하여 각 업데이트 세 개의 버튼과 연습 페이지가 콘텐츠는 입니다. slowtime.php

  2. 버튼 2는 텍스트 콘텐츠가 slowtime.php에서 업데이트됩니다 fasttime.php

에서 텍스트 내용과

  • 버튼 3 업데이트 TextArea3 어디 slowtime.phpfasttime.php이 타임 스탬프 텍스트/HTML 페이지를 반환 간단한 스크립트가 있습니다 : 하나 페이지가로드되고 시간이 경과하면 하나가됩니다.

    각 버튼은 한 번에 하나씩 클릭하면 올바르게 작동합니다. 첫 번째 요청이 완료되기 전에 단추 2를 누른 다음 단추 3을 누르면 업데이트가 예상대로 작동합니다.

    첫 번째 요청이 완료되기 전에 단추 1을 클릭 한 다음 단추 2를 클릭하면 TextArea1 및 TextArea2에 올바른 값이 전달됩니다. 그러나 onreadystatechange 이벤트 호출은 동시에 발생합니다. 즉, 첫 번째 응답은 늦게 처리되고 두 번째 응답이 도착하면 처리됩니다.

    샘플 코드

    웹 사이트

    <!DOCTYPE html> 
    <html> 
    <head> 
    <script> 
    function loadXMLDoc(url,target) 
    { 
    var xmlhttp; 
    xmlhttp=new XMLHttpRequest(); 
    
    xmlhttp.onreadystatechange=function() 
        { 
        if (xmlhttp.readyState==4 && xmlhttp.status==200) 
        { 
        document.getElementById(target).value=xmlhttp.responseText; 
        } 
        } 
    xmlhttp.open("POST",url,true); 
    xmlhttp.send(); 
    } 
    </script> 
    </head> 
    
    <body> 
    <form> 
    
    <input type="button" value="Button 1" onClick="loadXMLDoc('slowtime.php','TextArea1')"/> 
    <input type="button" value="Button 2" onClick="loadXMLDoc('slowtime.php','TextArea2')"/> 
    <input type="button" value="Button 3" onClick="loadXMLDoc('fasttime.php','TextArea3')"/> 
    
    <div><textarea id="TextArea1"></textarea></div> 
    <div><textarea id="TextArea2"></textarea></div> 
    <div><textarea id="TextArea3"></textarea></div> 
    
    </form> 
    </body> 
    </html> 
    

    PHP 코드 (slowtime.php)

    <?php 
        echo date('h:i:s') . "\n"; 
        sleep(5); 
        echo date('h:i:s') . "\n"; 
    ?> 
    

    질문 [수정]

    브라우저가 XMLHttpRequest 개체를 어떻게 관리합니까? 버튼 2와 3을 누르면 각 프레스가 새로운 오브젝트를 인스턴스화하고 이들 각각은 독립적 인 이벤트 핸들러를 가짐을 나타냅니다. 객체가 초기 함수 호출을 지나서 살아남은 경우 (이벤트 핸들러가 살아남으므로) 언제 메모리에서 삭제되었거나 파괴 되었습니까?

    XMLHttpRequests이 별도의 개체 인 경우 동일한 URL에 대한 두 번째 요청을 보내면 첫 번째 요청의 응답 시간에 어떻게 영향을 줍니까? 이것이 서버 측 문제일까요?

  • +0

    'xmlhttp.onreadystatechange' 함수에서'xmlhttp.responseText' 대신'this.responseText'를 사용해야합니까? –

    +1

    @ JoshuaD.Boyd'xmlhttp' 변수가'loadXMLDoc' 내부의 로컬 범위에 있기 때문에 다른 일을해서는 안됩니다. – Tyilo

    +0

    'onreadystatechange' 함수에서'xmlhttp'에 대한 모든 참조가'onreadystatechange' 함수로 변경되고 또한 동일한 동작을합니다. – nicholas

    답변

    2

    XMLHttpRequest에 대한 컨텍스트는 delete가 객체에서 명시 적으로 호출되지 않으면 삭제되지 않습니다. 이 경우 : xmlhttp. 응용 프로그램을 마르고 깨끗하게 실행하려면 var을 어떻게 든 추적하고 정리해야합니다. Javascript는 원래 웹 페이지 용으로 설계되었으므로 직접 방지하지 않는 한 사물을 야생처럼 보이게 만듭니다.

    그렇지 않으면 개체가 다른 기능에서 더 이상 사용할 수 없거나 콜백이 남아 있으면 브라우저의 가비지 수집기가 해당 개체를 제거 할 수 있습니다.

    동시에 발생하는 이벤트에 대한 문제는 스스로 문제를 재현 할 수 없기 때문에 PHP 구성에 문제가 있다고 생각합니다. 서버가 여러 스크립트를 동시에 실행할 수 없도록 할 수 있습니까?

    여기에 약간의 변화의 부부와 함께, 내 서버에 예입니다 http://www.seijinohki.net/test.php

    +0

    다른 테스트 서버에 코드를 게시 해 주셔서 감사합니다. Chrome 또는 Safari에서 사이트를 테스트 할 때 위의 rambo와 동일한 결과를 얻습니다. 두 텍스트 영역 모두 동일한 값을 얻습니다. 한편, 파이어 폭스, IE9, 실크는 그렇지 않습니다. Maxthon 모바일 브라우저에서 페이지가 전혀 작동하지 않습니다. – nicholas

    +0

    많은 시간이 지났음에도 불구하고, 요청에 대한 컨텍스트를 직접 처리하므로이 응답을 대답으로 받아들입니다.흥미로운 토론과 적어도 현재는 웹 개발/브라우저/등등이 스크립트를 실행하는 방법에있어 여전히 획일 화되어 있다는 것을 보여줄 것입니다. – nicholas

    1

    이 브라우저 문제입니다.

    • 크롬 23 & 26이 방식으로 작동합니다.
    • 오페라 12 나던
    • IE 9 나던
    • 파이어 폭스 (17) 나던 slowtime.php?1slowtime.php?2 다음 더 이상이 방식으로 동작 크롬 예 :

    당신이 URL을 고유하게하는 경우.

    btw- 내 테스트에서 크롬은 첫 번째 요청의 값과 동일한 값을 가진 두 텍스트 영역을 모두 업데이트합니다. 첫 번째 요청이 완료되면 업데이트되고 둘째 완료되지 않습니다. 이것은 분명히 잘못 되었기 때문에 분명히 버그입니다. 웹 서버 로그를 통해 두 번째 요청이 전송되지 않음을 확인했습니다.

    +0

    kokorohakai의 서버에서 Chrome 또는 Safari로 테스트하면 결과 - 두 텍스트 영역 모두 동일한 값을 가지며 첫 번째 요청과 함께 시간이 정해집니다. 한편 내 테스트 서버 (localhost)에서 두 번째 값을 얻었고 두 번째 값은 두 번째 값과 일치했다. 따라서 대답은 매우 복잡하고 실제로 브라우저와 서버 동작을 기반으로합니다. – nicholas

    +0

    @nicholas는 로컬 서버 로그에 두 가지 요청을 표시합니까? 여전히 크롬이 내 테스트에서 하나의 요청 만 보냈다는 사실은 버그가 있음을 나타냅니다 (또는 이상한 기능). – goat

    관련 문제