2011-09-16 19 views
8

He escrito un complemento muy simple que me permite usar el formato 0xffccaa para colores css en lugar de '#ffccaa' (sobre todo para evitar escribir comillas, pero también para permitir una fácil modificación de colores simplemente añadiendo es un número entero).Cómo extender jQuery.css desde el complemento

Estoy implementando como $().xcss({}), pero preferiría simplemente usar $().css({}).

¿Cómo puedo extender la funcionalidad de la función $.fn.css, y hay algún error que debo tener en cuenta?

Además, supongo que querré hacer lo mismo con $.animate.

violín: 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>') 

Respuesta

5

Esto parece funcionar para mí: 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

Eso funciona genial. Pensé que había intentado esto antes de publicar la pregunta, pero cuando almacené $ .fn.css en una variable, solo estaba almacenando una referencia, que se convirtió en una referencia a la función sobrescrita. Estaba llamando con 'this._css (opts)' pero obteniendo errores. No entiendo completamente qué está pasando con 'apply', pero funciona muy bien, muchas gracias. –

+0

eres un jquery guru;) –

+0

Ni siquiera cerca Temo, pero gracias por las amables palabras. Me alegra que hayas resuelto tu problema. –

2

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

En base a este código para crear ganchos para funciones arbitrarias, sólo puede anular $ .fn.css con un método que hace lo que quiere antes de llamar al funcion original

+0

Una muy interesante respuesta/función. Hay dos problemas para mí ... 1. ¿Es necesario que use un selector, por lo que utilicé '*' para seleccionar todos los objetos en la página que es ineficiente, pero lo más importante, 2. solo funciona en elementos que ya están en la página , no elementos dinámicamente creados después. Aquí hay un enlace al código que utilicé para que funcione con estas limitaciones: [gist] (https://gist.github.com/1222547). Gracias por un enlace interesante y una respuesta interesante. –

Cuestiones relacionadas