2011-02-04 318 views
1

我有這個代碼在我的asp.net項目中的一個常見的JavaScript文件。如何讓這個jquery函數更簡潔?

只要將鼠標懸停在受此功能影響的某個按鈕上,jQuery-Lint就會返回「您已經多次使用相同的選擇器」。

//turns all the buttons into jqueryUI buttons 
//#mainBody is on the master page, #childBody is on the modal page. 
$("#mainBody button, #mainBody input:submit, #mainBody input:button, #childBody button, #childBody input:submit, #childBody input:button").livequery(function() { 
    $(this).button().each(function (index) { 
          $(this).ajaxStart(function() { 
            $.data(this, "old_button_val", $(this).val()); 
            $.data(this, "old_button_disabled", $(this).button("option", "disabled")); 
            $(this).button("option", "disabled", true).val("Wait..."); 
           }).ajaxStop(function() { 
            $(this).val($.data(this, "old_button_val")).button("option", "disabled", $.data(this, "old_button_disabled")); 
           }).ajaxError(function() { 
            $(this).val($.data(this, "old_button_val")).button("option", "disabled", $.data(this, "old_button_disabled")); 
           }); 
         }); 
}); 

有人問過類似的問題here

+1

您不需要在這裏使用`.each` – mVChr 2011-02-04 23:51:59

回答

2
// Might be a good idea now to add a class to these element 
// instead of using a long selector like this 
// Additionally, :button already includes <button> elements 
var selector = "#mainBody input:submit, #mainBody input:button, #childBody input:submit, #childBody input:button"; 

$(selector).livequery(function() { 
    // Store a copy of $(this), which we'll reuse... and reuse... and reuse 
    var t = $(this); 

    // Create the callback function shared berween 
    // ajaxStop and ajaxError 
    function ajaxCallback() { 
     t.button('option', { 
      label: t.data("old_button_val"), 
      disabled: t.data('old_button_disabled') 
     }); 
    } 

    t.button() 
     .ajaxStart(function() { 
      // Use $.fn.data instead of $.data 
      t.data({ 
       // Using 'label' instead of 'val' 
       // because <button> elements do not have 'value's 
       "old_button_val", t.button('option', 'label'), 
       "old_button_disabled": t.button("option", "disabled") 
      }).button('option', { 
       disabled: true, 
       label: 'Wait...' 
      }); 
     }).ajaxStop(ajaxCallback).ajaxError(ajaxCallback); 
    }); 
}); 

聲明:未經測試,因此不能保證能正常工作。

+0

注意:您必須使用jQuery 1.4.3或更高版本將鍵/值對對象傳遞給.data!否則,您可能會在此腳本中看到類似「e is undefined」的錯誤。 – 2011-02-23 17:41:16