2009-08-12 62 views
0

我不確定基於ajax響應修改DOM的最佳做法。我會盡量讓代碼進行談話,因爲很難解釋。使用jQuery修改基於AJAX結果的DOM

// 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得到eval'd,這意味着「CB」超出範圍。

什麼我迄今所做的就是創建了幾個輔助函數:

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

然後在服務器的響應我在需要的地方調用getTarget。這似乎是hackish ...任何建議?

回答

2

目前還不清楚你實際上想要做什麼,但我覺得你想看看AJAX調用的成功參數。成功回調函數應該在父範圍內執行,並執行你正在尋找的內容。

查看'成功'this page in the jQuery docs

+0

如果數據類型選項是腳本,那麼響應被全球eval'd - 沒有必要爲成功處理程序。 – user140550 2009-08-12 02:09:19

+0

你的返回腳本是做什麼的?如果可以避免發送腳本,那麼避免發送腳本總是很好的...否則,您可能會將存儲變量放在全局範圍內,但這樣會冒發出併發性問題。 – 2009-08-12 02:16:44

+0

所以服務器應該返回一個html片段,即使該請求是爲JavaScript? – user140550 2009-08-12 02:22:50

0

因此,當用戶選中/取消選中複選框時,您要做的是通過ajax獲取表單以提交內容?由於有多個複選框,您需要找出哪一個觸發了提交,所以您可以將其值更改爲存儲在服務器上的任何值。

如果您每次提交整個表單,爲什麼不用所有的複選框值進行回覆,然後更改其中的每一個?如果沒有,請讓服務器回覆id和複選框的值,然後使用jquery查找帶有該ID的複選框,然後更改它的值。

0

如何:(globalEval功能的jQuery)

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

如果不仔細構建,可能會遇到併發問題。否則不是一個壞主意。 – 2009-08-12 02:17:23

+0

是的,你是對的,但是使用setTarget和getTarget,你也會這樣,所以我假設他不在乎。我會看看我是否有時間去編輯它來解決併發問題。 – Tres 2009-08-12 02:19:03

+0

關於與他的功能存在相同的問題非常真實。 – 2009-08-12 04:03:53