2010-04-28 3 views
3

Я пытаюсь сделать функцию возвращать данные из вызова ajax, который я могу использовать. Проблема сама функция вызывается многими объектами, например .:Показывать внутри анонимные функции Javascript

function ajax_submit (obj) 
{ 
    var id = $(obj).attr('id'); 
    var message = escape ($("#"+id+" .s_post").val()); 

    var submit_string = "action=post_message&message="+message; 

    $.ajax({ 
     type: "POST", 
     url: document.location, 
     data: submit_string, 
     success: function(html, obj) { 
      alert (html); 
     } 
    }); 

    return false; 
} 

Это означает, что внутри анонимной «успех» функции У меня нет возможности узнать, что вызывающий OBJ (или идентификатор) на самом деле. Единственный способ, которым я могу это сделать, - прикрепить идентификатор к документу, но это кажется слишком грубым. Есть ли другой способ сделать это?

ответ

7

Вы можете использовать переменные из охватывающей области, метод «закрытие». Итак:

function ajax_submit (obj) 
{ 
    var id = $(obj).attr('id'); 
    var message = escape ($("#"+id+" .s_post").val()); 

    var submit_string = "action=post_message&message="+message; 

    $.ajax({ 
     type: "POST", 
     url: document.location, 
     data: submit_string, 
     success: function(html) { 
      alert(obj.id); // This is the obj argument to ajax_submit(). 
      alert(html); 
     } 
    }); 

    return false; 
} 
+0

Я попробовал это, но это не похоже OBJ был установлен внутри функции успеха. – DCD

+1

В вашем примере есть второй аргумент 'success', называемый' obj', который затеняет оригинал. Вы удалили его, как я сделал в ответ? –

+0

Да, это сработало, thx. – DCD

4

Если вы пытаетесь загрузить HTML на страницу с помощью AJAX вы можете захотеть рассмотреть функцию load().

0

Переменные obj, id и message все доступны в пределах анонимной функции.

Это из-за функции в Javascript называется закрытия, которые я советую вам прочитать о.

Общая суть закрытия в том, что функция всегда будет иметь доступ к переменным, которые присутствовали в объеме она была определена в

Результатом этого является то, что вы можете сделать:.

success: function(html) { 
     alert (id); 
     alert (obj); 
    } 

целый день (но учтите, что параметр obj в функции успеха будет иметь приоритет над obj переменных в вашей функции ajax_submit.)

2

функция в JavaScript становится заключена в области, в которой они определены (это closure). В этом случае новая функция анонимного обратного вызова создается каждый раз, когда вызывается ajax_submit(), поэтому все переменные из родительской области всегда будут доступны.

Ваш код должен работать нормально, как есть. Если вы хотите иметь функцию обратного вызова, он может быть передан в качестве аргумента ajax_submit() и называется так:

… 
success: function(html, obj) { 
    callback(html); 
} 
… 
Смежные вопросы