Как выполнить обратный вызов jQuery перед данными? - PullRequest
2 голосов
/ 27 августа 2010

У меня есть простое сообщение, в котором выполняются данные, возвращаемые в виде сценария, как:

$.post("/home", { foo: 'bar' }, function(){
    //callback function
}, "script");

Вот что происходит:

  1. Запрос отправляется
  2. Часть кода JS возвращается в качестве ответа и выполняется
  3. Обратный вызов выполняется

Мне нужно, чтобы обратный вызов был выполнен до возвращенного JSвыполнен.Есть ли способ достичь этого?

Спасибо!

Ответы [ 4 ]

3 голосов
/ 27 августа 2010

Вы не можете изменить способ обработки запроса в jQuery.В конце концов, обратный вызов - это обратный вызов, и он выполняется после завершения работы!Однако вы можете установить dataType на "text" и затем проверить свой Javascript.

Пример:

$.post("/home", { foo: 'bar' }, function(data){
   //callback function

   // execute JS
   $.globalEval( data );
}, "text");

** ОБНОВЛЕНИЕ **

Это то, что jQuery делает внутренне (отрезано):

// If the type is "script", eval it in global context
} else if ( type === "script" || !type && ct.indexOf("javascript") >= 0 ) {
   jQuery.globalEval( data );
}

Таким образом, нет угрозы безопасности, если вынуть globalEval из запроса Ajax и выполнить его в функции обратного вызова.

1 голос
/ 27 августа 2010

Используйте $.ajax() и создайте свой собственный тег сценария.

$.ajax({url:"/home",
        data: { foo: 'bar' },
        type: "POST",
        dataType: 'text',     // Return dataType is "text" instead of "script"
        success: function( script ){
           // run your code
           alert('mycode');
           // then create your own script tag
           var tag = document.createElement('script');
           tag.setAttribute('type','text/javascript');
           tag.appendChild(document.createTextNode(script));
           document.getElementsByTagName('head')[0].appendChild(tag);
        }
});
0 голосов
/ 27 августа 2010

Вы можете использовать опцию «BeforeSend», которая выполняется перед отправкой запроса ajax:

$.ajax({

    type: "POST",

    url: "SOMEURL",

    data: { "WHATEVER": whatever },

    beforeSend: function() {

      //DO WHATEVER BEFORE SEND AJAX CALL

    }
.....

});

}

Надеюсь, это поможет.*

Хосе

0 голосов
/ 27 августа 2010

Эта функция $ .post () не выполняет автоматически возвращаемый JS.Это, вероятно, выполняется в функции обратного вызова.

...