2012-12-13 81 views
0

我有以下使用jQuery UI的功能:我可以將變量定義爲參數嗎?

$('.droppable').droppable({ 
    tolerance: 'touch', 
    over: function() { 
     var hasHiddenList = $(this).children('ul.hidden'); 
     if (hasHiddenList.length) 
      hasHiddenList.removeClass('hidden'); 
    }, 
    out: function() { 
     var hasEmptyList = $(this).children('ul.empty'); 
     if (hasEmptyList.length) 
      hasEmptyList.addClass('hidden'); 
    }, 
    drop: function() { 
     var hasEmptyList = $(this).children('ul.empty'); 
     if (hasEmptyList.length) 
      hasEmptyList.removeClass('empty'); 
    } 
}); 

而且我想知道如果我可以定義變量hasHiddenListhasEmptyList回調函數之外,因爲它是在所有這些相同的變量。

+1

你爲什麼不試試? :) –

+1

但你只是做$(本)。兒童( 'ul.hidden')removeClass( '隱藏')。 ...沒有必要進行長度檢查 –

+0

@Robin只是因爲它會是合法代碼並不能使它成爲好設計。 – Alnitak

回答

1

如果你真的想要的變量,有兩種選擇。

顯而易見的一個(帶陷阱)是這樣的:

var hasHiddenList = $('.droppable').children('ul.hidden'); 
var hasEmptyList = $('.droppable').children('ul.empty'); 

$('.droppable').droppable({ 
    tolerance: 'touch', 
    over: function() { 
     if (hasHiddenList.length) 
      hasHiddenList.removeClass('hidden'); 
    }, 
    out: function() { 
     if (hasEmptyList.length) 
      hasEmptyList.addClass('hidden'); 
    }, 
    drop: function() { 
     if (hasEmptyList.length) 
      hasEmptyList.removeClass('empty'); 
    } 
}); 

變量已被提取,代碼少重複。都好。

現在,問題是選擇器只運行一次。回調over,outdrop在每次發生這些事件時被調用,但hasHiddenListhasEmptyList不會被更新;它們在每次調用之間仍然是相同的。可能不是你想要的。

來解決這個問題的方法是改爲使用的變量函數,就像這樣:

var hiddenList = function(target) { 
    return $(target).children('ul.hidden'); 
}; 
var emptyList = function(target) { 
    return $(target).children('ul.empty'); 
}; 

$('.droppable').droppable({ 
    tolerance: 'touch', 
    over: function() { 
     var list = hiddenList(this); 
     if (list.length) 
      list.removeClass('hidden'); 
    }, 
    out: function() { 
     var list = emptyList(this); 
     if (list.length) 
      list.addClass('hidden'); 
    }, 
    drop: function() { 
     var list = emptyList(this); 
     if (list.length) 
      list.removeClass('empty'); 
    } 
}); 

這個抽象瞭如何查詢的執行(你只需要編寫$(target).children('ul.empty');一次,而不是兩次),但在現實中代碼並沒有真正變得更簡單。其實,我甚至會說現在很難跟上它。另一方面,如果你使用相同的選擇器甚至超過兩次,可以說五次,那麼這可能實際上是有用的。

此外,請注意,我已經從變量名稱中刪除了「has」,因爲「has」使得它聽起來像是布爾值,但它們不是。它們是元素列表。

+0

非常感謝您的詳細答案:)在這種情況下,我將使用第一個版本沒有變量,但我想知道如何傳遞這樣的變量 – ilyo

+1

當然,我明白:) – Jakob

5
更好

的是,你甚至不需要的if語句和變量:

$('.droppable').droppable({ 
    tolerance: 'touch', 
    over: function() { 
     $(this).children('ul.hidden').removeClass('hidden'); 
    }, 
    out: function() { 
     $(this).children('ul.empty').addClass('hidden'); 
    }, 
    drop: function() { 
     $(this).children('ul.empty').removeClass('empty'); 
    } 
}); 
+1

更重要的是,甚至不需要變量! – Alnitak

+0

@Jakob如果我知道這些選擇器可能會空回來,做整個if檢查不是更好的做法嗎? – ilyo

+0

我很抱歉,但這不是我問的答案。如果我想保留這些變量,那麼可以在回調函數外聲明它們是什麼? – ilyo

相關問題