2009-08-12 3 views
0

Я не уверен в лучшей практике для изменения DOM на основе ответа ajax. Я постараюсь позволить коду говорить, потому что это трудно объяснить.Изменение DOM на основе результата AJAX с помощью jQuery

// page has multiple checkboxes 
$("input[type='checkbox']").live('click', function { 
    var cb = $(this); // for the sake of discussion i need this variable to be in scope 
    $("form").ajaxSubmit({ dataType: "script" }); 
} 

Сервер отправляет ответ обратно, и JS получает Эвальд и это означает, что «Си-Би» выходит за рамки.

Что я сделал до сих пор создать несколько вспомогательных функций:

var target = undefined; 

function setTarget(val) { 
    target = val; 
} 

function getTarget() { 
    return target; 
} 

И что превращает первый фрагмент кода в этом:

// page has multiple checkboxes 
$("input[type='checkbox']").live('click', function { 
    setTarget($(this)); 
    $("form").ajaxSubmit({ dataType: "script" }); 
} 

Затем на ответ сервера I вызовите getTarget, где мне нужно. Это кажется хакерским ... Любые предложения?

ответ

2

Непонятно, что вы на самом деле пытаетесь сделать do, но я чувствую, что вы хотите посмотреть на параметр успеха для этого вызова AJAX. Функция обратного вызова успеха должна выполняться в родительской области и делать то, что вы ищете.

См. «Успех» на this page in the jQuery docs.

+0

Если опция DATATYPE является сценарий, то ответ получает Эвальд глобально (функция globalEval в JQuery) - нет необходимости в обработчик успеха. – user140550

+0

Что делает ваш возвращенный скрипт? всегда полезно избегать отправки сценариев, чтобы их можно было избежать, если их можно избежать ... В противном случае вы могли бы предоставить вашей переменной хранилища глобальную область действия, хотя тогда вы рискуете проблемами параллелизма. –

+0

, так что сервер должен возвращать html-фрагмент, даже если запрос для javascript? – user140550

0

Итак, что вы пытаетесь сделать, это получить форму для отправки контента через ajax всякий раз, когда пользователь проверяет/снимает флажок? И поскольку есть несколько флажков, вам нужно выяснить, какой из них вызвал отправку, так что вы можете изменить его значение на все, что хранится на сервере?

Если вы отправляете всю форму каждый раз, почему бы вам не ответить со всеми значениями флажков, а затем изменить каждый из них? Если нет, попросите сервер ответить с идентификатором и значением флажка, а затем используйте jquery, чтобы установить флажок с этим идентификатором, а затем изменить его значение.

0

Как насчет:

jQuery(function($) { 

    // give it scope here so that the callback can modify it 
    var cb, 
     cbs = $('input[type="checkbox"]'); 

    cbs.live('click', function { 
     // taking away var uses the most recent scope 
     cb = $(this); 

     // disable checkboxes until response comes back so other ones can't be made 
     cbs.attr('disabled', 'true'); // 'true' (html5) or 'disabled' (xhtml) 

     // unless you are using 'script' for something else, it's best to use 
     // a callback instead 
     $('form').ajaxSubmit({ 
      success : function(response) { 
       // now you can modify cb here 
       cb.remove(); // or whatever you want 

       // and re-enable the checkboxes 
       cbs.removeAttr('disabled'); 
      } 
     }); 
    } 

}); 
+0

Может возникнуть проблема параллелизма, если не сконструирован тщательно. В противном случае не плохая мысль. –

+0

Да, вы правы, но с помощью setTarget и getTarget вы тоже, поэтому я предполагал, что ему все равно. Я посмотрю, смогу ли я найти время для его редактирования, чтобы решить проблему параллелизма. – Tres

+0

Очень правдоподобно о той же проблеме, что и его функции. –