문제

jQuery와 Ajax 장면에 대한 초보자는 여전히 다소 초보자이지만 $ .ajax 요청이 일부 XML 파일 (~ 6KB 이하)을 검색하는 것을 수행하지만 XML 컨텐츠가 해당 페이지에 소비하는 기간 동안 변경되지 않습니다 (이 디자인은 변경할 수 없습니다. 다른 곳에서 읽을 때 XML 파일을 변경하는 데 액세스 할 수 없습니다). 따라서 응답 데이터를 저장하는 글로벌 변수가 있으며이 변수에 대한 후속 조회는이 변수에 대해 수행되므로 여러 요청이 필요하지 않습니다.

XML 파일이 증가 할 수 있다는 사실을 감안할 때 이것이 모범 사례인지 확실하지 않으며 Java 배경에서 나오는 글로벌 공개 변수에 대한 내 생각은 일반적으로 No-No입니다.

따라서 내가 가지고있는 질문은이 작업을 수행하는 더 나은 방법이 있는지 여부와 파일이 어리석은 파일 크기로 확장되면 메모리 문제를 일으키는 지에 대한 질문이 있습니까?

데이터가 XML 객체 내부의 일부 getter/setter 유형 함수로 전달 될 수 있으며, 이는 글로벌 공개 변수 문제를 해결할 수 있지만 여전히 객체 자체에 응답을 저장 해야하는지에 대한 질문을 제기합니다.

예를 들어, 내가 현재하는 일은 다음과 같습니다.

// top of code
var xml;
// get the file
$.ajax({
  type: "GET",
  url: "test.xml",
  dataType: "xml",
  success : function(data) {
    xml = data;
  }
});
// at a later stage do something with the 'xml' object
var foo = $(xml).find('something').attr('somethingElse');
도움이 되었습니까?

해결책

저장하는 것 외에는 그 주위에 아무 방법이 없습니다. 메모리 페이징은 잠재적 인 문제를 줄여야합니다.

'XML'이라는 글로벌 변수를 사용하는 대신 다음과 같은 작업을 수행하는 것이 좋습니다.

var dataStore = (function(){
    var xml;

    $.ajax({
      type: "GET",
      url: "test.xml",
      dataType: "xml",
      success : function(data) {
                    xml = data;
                }
    });

    return {getXml : function()
    {
        if (xml) return xml;
        // else show some error that it isn't loaded yet;
    }};
})();

그런 다음 다음과 같이 액세스하십시오.

$(dataStore.getXml()).find('something').attr('somethingElse');

다른 팁

다음은 작업을 잘 수행하는 기능입니다. 나는 위의 최상의 답을 얻을 수 없었다.

jQuery.extend({
    getValues: function(url) {
        var result = null;
        $.ajax({
            url: url,
            type: 'get',
            dataType: 'xml',
            async: false,
            success: function(data) {
                result = data;
            }
        });
       return result;
    }
});

그런 다음 액세스하려면 다음과 같은 변수를 만듭니다.

var results = $.getValues("url string");

이것은 나를 위해 효과가있었습니다.

var jqxhr = $.ajax({
    type: 'POST',       
    url: "processMe.php",
    data: queryParams,
    dataType: 'html',
    context: document.body,
    global: false,
    async:false,
    success: function(data) {
        return data;
    }
}).responseText;

alert(jqxhr);
// or...
return jqxhr;

주목해야 할 중요 : global: false, async:false 그리고 마지막으로 responseText 묶여 $.ajax 요구.

당신은 이것을 할 필요가 없습니다. 나는 프로젝트와 같은 문제를 일으켰다. 당신이하는 일은 On Success 콜백 내부에서 함수 호출을하여 글로벌 변수를 재설정하는 것입니다. 비동기식 자바 스크립트가 거짓으로 설정된 한 올바르게 작동합니다. 여기 내 코드가 있습니다. 도움이되기를 바랍니다.

var exists;

//function to call inside ajax callback 
function set_exists(x){
    exists = x;
}

$.ajax({
    url: "check_entity_name.php",
    type: "POST",
    async: false, // set to false so order of operations is correct
    data: {entity_name : entity},
    success: function(data){
        if(data == true){
            set_exists(true);
        }
        else{
            set_exists(false);
        }
    }
});
if(exists == true){
    return true;
}
else{
    return false;
}

이것이 당신에게 도움이되기를 바랍니다.

전 세계적으로 액세스 할 수 있으므로 응답 값을 DOM 요소에 저장하는 것이 더 쉬울 수 있습니다.

<input type="hidden" id="your-hidden-control" value="replace-me" />

<script>
    $.getJSON( '/uri/', function( data ) {
        $('#your-hidden-control').val( data );
    } );
</script>

이것은 비동기를 False로 설정할 필요가 없다는 이점이 있습니다. 분명히 이것이 적절한 지 여부는 달성하려는 것에 달려 있습니다.

문제는 "성공"기능 실행과 변수에서 데이터를 꺼내려고하는 시간 간의 서버 지연 만 해당 문제에 대한 로컬 또는 글로벌 범위와 관련이 없을 수 있습니다.

Ajax "성공"기능 화재 전에 변수의 내용을 인쇄하려고 할 가능성이 있습니다.

        function getJson(url) {
            return JSON.parse($.ajax({
                type: 'GET',
                url: url,
                dataType: 'json',
                global: false,
                async: false,
                success: function (data) {
                    return data;
                }
            }).responseText);
        }

        var myJsonObj = getJson('/api/current');

이것은 작동합니다 !!!

     function get(a){
            bodyContent = $.ajax({
                  url: "/rpc.php",
                  global: false,
                  type: "POST",
                  data: a,
                  dataType: "html",
                  async:false
               } 
            ).responseText;
            return bodyContent;

  }

이것도 달렸다. 많은 답변이 있지만, 내가 제공 할 간단한 올바른 하나의 답변. 열쇠는 $ .ajax 전화를 만드는 것입니다.

$.ajax({  
    async: false, ...

나는 jQuery ajax의 결과를 "document.ready"단계에서 내 변수로 가져 오는 데 어려움을 겪었습니다.

페이지가 이미로드 된 후 사용자가 선택 상자의 "onchange"이벤트를 트리거했을 때 jQuery의 ajax는 내 변수에로드되지만 페이지가 처음로드되었을 때 데이터가 변수를 공급하지 않습니다.

나는 많은, 많은, 많은 다른 방법을 시도했지만 결국 찰스 길버트의 방법은 저에게 가장 적합한 방법이었습니다.

Charles Guilbert에게 모자! 그의 대답을 사용하여 페이지가 처음로드 된 경우에도 내 변수에 데이터를 가져올 수 있습니다.

작업 스크립트의 예는 다음과 같습니다.

    jQuery.extend
    (
        {
            getValues: function(url) 
            {
                var result = null;
                $.ajax(
                    {
                        url: url,
                        type: 'get',
                        dataType: 'html',
                        async: false,
                        cache: false,
                        success: function(data) 
                        {
                            result = data;
                        }
                    }
                );
               return result;
            }
        }
    );

    // Option List 1, when "Cats" is selected elsewhere
    optList1_Cats += $.getValues("/MyData.aspx?iListNum=1&sVal=cats");

    // Option List 1, when "Dogs" is selected elsewhere
    optList1_Dogs += $.getValues("/MyData.aspx?iListNum=1&sVal=dogs");

    // Option List 2, when "Cats" is selected elsewhere
    optList2_Cats += $.getValues("/MyData.aspx?iListNum=2&sVal=cats");

    // Option List 2, when "Dogs" is selected elsewhere
    optList2_Dogs += $.getValues("/MyData.aspx?iListNum=2&sVal=dogs");

IMO이 데이터를 글로벌 변수에 저장할 수 있습니다. 그러나 더 독특한 이름을 사용하거나 네임 스페이스를 사용하는 것이 좋습니다.

myComPany = {};

...
mycompany.cachedData = data;

또한 이러한 목적으로 JSON을 사용하는 것이 좋습니다. JSON 형식의 데이터는 일반적으로 XML 형식의 동일한 데이터보다 훨씬 작습니다.

서버에서 큰 XML 파일을 가져 오는 것을 피해야한다고 제안합니다. 변수 "XML"은 은닉처, 데이터 저장소 자체가 아닙니다.

대부분의 시나리오에서는 캐시를 검사하고 원하는 데이터를 얻기 위해 서버에 요청 해야하는지 확인할 수 있습니다. 이렇게하면 앱이 더 가볍고 빠르게됩니다.

건배, JRH.

.Get 응답은 기본적으로 캐시됩니다. 따라서 원하는 결과를 얻기 위해 아무것도 할 필요가 없습니다.

나는 실이 늙었다는 것을 알고 있지만 다른 사람이 이것을 유용 할 것이라고 생각했다. jquey.com에 따르면

var bodyContent = $.ajax({
  url: "script.php",
  global: false,
  type: "POST",
  data: "name=value",
  dataType: "html",
  async:false,
  success: function(msg){
     alert(msg);
  }
}).responseText;

결과를 문자열로 직접 얻는 데 도움이됩니다. 참고 .RESPONSETEXT; 부분.

이전 답변과 유사 :

<script type="text/javascript">

    var wait = false;

    $(function(){
        console.log('Loaded...');
        loadPost(5);
    });

    $(window).scroll(function(){
      if($(window).scrollTop() >= $(document).height() - $(window).height()-100){
        // Get last item
        var last = $('.post_id:last-of-type').val();
        loadPost(1,last);
      }
    });

    function loadPost(qty,offset){
      if(wait !== true){

        wait = true;

        var data = {
          items:qty,
          oset:offset
        }

        $.ajax({
            url:"api.php",
            type:"POST",
            dataType:"json",
            data:data,
            success:function(data){
              //var d = JSON.parse(data);
              console.log(data);
              $.each(data.content, function(index, value){
                $('#content').append('<input class="post_id" type="hidden" value="'+value.id+'">')
                $('#content').append('<h2>'+value.id+'</h2>');
                $('#content').append(value.content+'<hr>');
                $('#content').append('<h3>'+value.date+'</h3>');
              });
              wait = false;
            }
        });
      }
    }
</script>
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top