2011-10-16 66 views
0

可以說我有以下的jQuery插件(這僅僅是一個例子來演示點):參考當前上下文設置的jQuery插件選項時,

(function ($) { 
    $.fn.colourise = function (options) { 
     var settings = $.extend({ 
      color: "black" 
     }, options); 

     return this.each(function() { 
      $(this).css("color", options.color); 
     }); 
    }; 
})(jQuery); 

,我想申請到下面的標記:

<div data-color="red"> 
    This text should be red.  
</div> 
<div data-color="blue"> 
    This text should be blue 
</div> 
<div data-color="green"> 
    This text should be green 
</div> 

如果我想作爲插件的選項之一傳遞的值取決於元素,我該如何應用它?目前,我只能通過這樣做來獲得這個工作:

$(function() { 
    // This feels a bit wrong to have to use a .each() here, but how else do we do it? 
    $("div").each(function() { 
     $(this).colourise({ 
      color: $(this).data("color") 
     }); 
    }); 
}); 

即,通過使用.each()方法遍歷每個元素並將插件分別應用於每個元素(這使得插件內的this.each()有點多餘)。感覺就像我應該可以這樣做:

$(function() { 
    $("div").colourise({ 
     color: [get context of this "div" somehow].data("color") 
    }); 
}); 

但我不能在這裏使用$(this)或this,因爲它們引用文檔。

對不起,缺少http://jsfiddle.net/,但該網站目前對我來說確實很慢,他們一定會遇到一些問題。

+0

沒有,是沒辦法的......你只能在插件裏面,在'each'循環中測試是否設置了'data-color'屬性並且將它的值略。 –

+0

@FelixKling對不起,我應該補充說實際的插件不是我的,所以我不能更改插件代碼。我需要通過選項傳遞值。 – magritte

+0

啊好吧....那麼我不認爲有任何方式,如果插件不允許回調,如@Esailija顯示。 –

回答

1

.each正是你所需要的。

當您在沒有.each回調的多元素集上調用該方法時,您正在爲該集中的每個元素創建一個在插件中使用的單個選項對象。

如果不爲每個元素設置單獨的對象,則無法對每個元素進行更改。

+0

現在我想到了,這是有道理的,我們只是針對一組匹配元素執行插件函數。謝謝SLaks。 – magritte

1

做一個回調來檢索顏色像這樣

function getColor(){ 
return $.data(this, "color"); 
} 

Colourise有回調的選項

$(function() { 
    $("div").colourise({ 
    color: getColor 
    }); 
}); 

檢查顏色的選擇是一個可調用的函數

(function ($) { 
    $.fn.colourise = function (options) { 
    var settings = $.extend({ 
     color: "black" 
    }, options); 

    return this.each(function() { 
    var color = options.color; 

    color = typeof color =="function" ? color.call(this) : color; 
     $(this).css("color", color); 
    }); 
    }; 
})(jQuery); 
+0

感謝這Esailija,但我不能改變插件,因爲它不是我的。我看了一下,看起來並不像他們支持回調。其他情況下,請+1提供有用的答案:-) – magritte