2011-09-16 11 views
8

Ho scritto un plugin molto semplice che mi permette di usare il formato 0xffccaa per i colori CSS invece di '#ffccaa' (principalmente per evitare di scrivere virgolette - ma anche per consentire una facile modifica dei colori semplicemente aggiungendo a è un numero intero).Come estendere jQuery.css dal plugin

Sto implementando come $().xcss({}), ma preferirei semplicemente usare $().css({}).

Come è possibile estendere la funzionalità della funzione $.fn.css e ci sono delle insidie ​​a cui è necessario prestare attenzione?

Inoltre, credo che vorrò fare lo stesso per $.animate.

Fiddle: http://jsfiddle.net/hB4R8/

// pugin wrapper 
(function($){ $.fn.xcss = function(opts){ 
    // loop through css color properties 
    $.each(['background', 'backgroundColor','background-color', 'color', 'borderColor','border-color'],function(i,v){ 
     // if set as number (will be integer - not hex at this point) 
     // convert the value to `#ffccaa` format (adds padding if needed) 
     if(typeof opts[v] === 'number') 
      opts[v] = ('00000'+opts[v].toString(16)).replace(/.*([a-f\d]{6})$/,'#$1') 
    }) 
    // run css funciton with modified options 
    this.css(opts) 
    // allow chaining 
    return this 
} })(jQuery) 

// test the plugin 
$('body').xcss({ 
    'background-color': 0xffccFF, 
    color: 0xccffcc, 
    border: '3px solid red', 
    borderColor:0x0ccaa, 
    padding:50 
}).html('<h1>This should be a funny color</h1>') 

risposta

5

Questo sembra funzionare per me: http://jsfiddle.net/frfdj/

(function($) { 
    var _css = $.fn.css; // store method being overridden 
    $.fn.css = function(opts) { 
     $.each(['background', 'backgroundColor', 'background-color', 'color', 'borderColor', 'border-color'], function(i, v) { 
      if (typeof opts[v] === 'number') opts[v] = ('00000' + opts[v].toString(16)).replace(/.*([a-f\d]{6})$/, '#$1') 
     }) 
     return _css.apply(this, [opts]); // call original method 
    } 
})(jQuery) 
+0

Che funziona benissimo. Pensavo di averlo provato prima di postare la domanda, ma quando ho memorizzato $ .fn.css in una variabile, stavo semplicemente memorizzando un riferimento - che è diventato un riferimento alla funzione sovrascritta. Stavo chiamando con 'this._css (opts)' ma ottenendo errori. Non capisco perfettamente cosa sta succedendo con 'apply' ma funziona alla grande - grazie mille. –

+0

sei un guru jquery;) –

+0

Neanche vicino ho paura, ma grazie per le gentili parole. Sono contento che hai risolto il tuo problema. –

2

https://github.com/aheckmann/jquery.hook/blob/master/jquery.hook.js

Sulla base di questo codice per la creazione di ganci per funzioni arbitrarie, si può semplicemente ignorare $ .fn.css con un metodo che fa quello che si vuole prima di chiamare il funzione originale

+0

Una molto interessante risposta/funzione. Ci sono due problemi per me ... 1. è necessario utilizzare un selettore, quindi ho usato '*' per selezionare tutti gli oggetti sulla pagina che sono inefficienti ma, soprattutto 2. funziona solo su elementi già presenti nella pagina , non elementi creati dinamicamente in seguito. Ecco un link al codice che ho usato per farlo funzionare con queste limitazioni: [gist] (https://gist.github.com/1222547). Grazie per un link interessante e una risposta interessante. –

Problemi correlati