Pergunta

Im ainda um pouco de um novato em jQuery ea cena de ajax, mas eu tenho um pedido de $ .ajax realizando um GET para recuperar alguns arquivos XML (~ 6KB ou menos), no entanto, para a duração do usuário gasta em que página que conteúdo XML não deve / não vai mudar (este projeto eu não posso mudar, eu também não têm acesso para alterar o arquivo XML como eu estou lendo-o de algum outro lugar). Portanto, tenho uma variável global que eu armazenar os dados de resposta em, e qualquer olhar subseqüentes ups sobre os dados são feitos sobre esta variável para que vários pedidos não precisam ser feitas.

Dado o fato de que o arquivo XML pode aumentar, eu não estou certo de que este é a melhor prática, e também vindo de um fundo java meus pensamentos sobre variáveis ??públicas globais são geralmente um não-não.

Assim, a pergunta que eu tenho é se pode haver uma maneira melhor de fazer isso, e uma pergunta sobre se isso faz com que quaisquer problemas de memória se o arquivo se expande para fora para alguns tamanho do arquivo ridículo?

Eu acho que os dados poderiam ser passadas para um algumas funções getter / tipo setter dentro do objeto XML, o que resolveria meus problemas globais variável pública, mas ainda levanta a questão sobre se devo guardar a resposta dentro do próprio objeto.

Por exemplo, o que fazer atualmente é:

// 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');
Foi útil?

Solução

Não há nenhuma maneira em torno dela, exceto para armazená-lo. paginação de memória deve reduzir possíveis problemas de lá.

Gostaria de sugerir em vez de usar uma variável global chamada 'xml', fazer algo mais parecido com isto:

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;
    }};
})();

então acessá-lo com:

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

Outras dicas

Aqui está uma função que faz o trabalho muito bem. Eu não poderia obter a melhor resposta acima para o trabalho.

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

Depois de acessá-lo, criar a variável como assim:

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

Isso funcionou para mim:

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;

importante notar: global: false, async:false e, finalmente, responseText acorrentado ao pedido $.ajax.

Você não tem que fazer nada disso. Corri para o mesmo problema com o meu projeto. o que você faz é fazer uma chamada de função dentro da chamada de retorno em caso de sucesso para redefinir a variável global. Contanto que você tem conjunto javascript assíncrono para false ele irá funcionar corretamente. Aqui está o meu código. Espero que ajude.

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;
}

Espero que isso ajude você.

Você pode achar que é mais fácil armazenar os valores de resposta em um elemento DOM, como eles são globalmente acessível:

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

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

Isto tem a vantagem de não precisar conjunto assíncrono para falso. Claramente, se isso é apropriado depende do que você está tentando alcançar.

seu problema pode não estar relacionado a qualquer âmbito local ou global para que o assunto apenas o atraso do servidor entre a função de "sucesso" execução eo tempo que você está tentando tirar dados de sua variável.

chances são que você está tentando imprimir o conteúdo da variável antes Ajax "sucesso" fogos de função.

        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');

Isso funciona !!!

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

  }

Ran a este também. Muitas respostas, contudo, apenas uma correta simples que eu estou indo para fornecer. A chave é fazer com que o seu $ .ajax call..sync!

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

Eu realmente lutou com a obtenção de resultados de jQuery ajax em meus variáveis ??na fase "document.ready" dos acontecimentos.

ajax do jQuery iria carregar em meus variáveis ??quando um usuário desencadeou um "onchange" caso de uma caixa de seleção depois que a página já carregada, mas os dados não alimentar as variáveis ??quando a página carregado pela primeira vez.

Eu tentei muitos, muitos, muitos métodos diferentes, mas no final, foi o método de Charles Guilbert que funcionou melhor para mim.

Tiremos o chapéu para Charles Guilbert! Usando sua resposta, eu sou capaz de obter dados em meus variáveis, mesmo quando a minha página carrega pela primeira vez.

Aqui está um exemplo do script de trabalho:

    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 você pode armazenar esses dados na variável global. Mas vai ser melhor usar algum nome ou o uso mais original namespace:

MyCompany = {};

...
MyCompany.cachedData = dados;

E também é melhor usar JSON para esses fins, dados em formato JSON é geralmente muito menor do que os mesmos dados em formato XML.

Eu sugiro que buscar grandes arquivos XML a partir do servidor deve ser evitado: a variável "xml" devem usada como um Cache , e não como os dados armazenar em si

.

Na maioria dos cenários, é possível examinar o cache e veja se você precisa fazer uma solicitação ao servidor para obter os dados que você deseja. Isso fará com que a sua aplicação mais leve e mais rápido.

aplausos, JRH.

respostas .GET são armazenados em cache por padrão. Portanto, você realmente precisa fazer nada para obter os resultados desejados.

Eu sei que o fio é antiga, mas eu pensei que alguém pode encontrar este útil. De acordo com o 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;

ajudaria a obter o resultado para uma string diretamente. Observe o .responseText;. parte

Semelhante a resposta anterior:

<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>
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top