Ok, I'm going to need some input on how to fix an issue I've run into
while coding that css extensibility.
Currently the API for that sits in a jQuery.css.callbacks list, to
extend .css to support another obscure css type you'd use:
jQuery.css.callbacks.push(function( style, name, value, force ) {
if( name != 'somePropName' ) return; // abort
if ( value === undefined ) { // get
var realValue = jQuery.rawCSS( ???, name, force );
... do something ...
return realValue; // return the data should not be undefined
} else { // set
... do stuff ...
return style.somePropName = value;
}
});
name is the property name, it should always be passed in the camelCase
format, no float or other normalization should be done other than
camelCasing it.
value is the value to set. If undefined a css get is being called, if
set to any other value a css set was called.
force is only passed for css get, it contains the value for force
which was passed to curCSS and should be passed on to rawCSS.
The issue here is style vs. elem; The callbacks are called in
both .attr and .curCSS, for setting or getting. The .attr only knows
about the style object because the element is not passed to it,
while .curCSS knows about the element passed. For that reason I stuck
with the lowest common denominator and passed the style object in the
api.
However, .rawCSS requires the elem and can't work with the style
object because it needs to do calculation sometimes and that requires
the element object.
I have a few options on how to handle this issue, input on how to fix
it is welcome.
A) Pass elem during get, and style during set.
.attr (set) knows style tag only, .curCSS (get) knows elem. elem is
only needed for getting css so a style tag could be sent instead for
attr.
The disadvantage of this is that the api would become inconsistent, at
the same time it would also make it impossible to properly get other
values of the css, which is something that could potentially be
useful, like to support relative values ;) .css({top:"+=25px"});.
B) Instead of force, pass a getStyle method to the API.
Originally instead of passing the force argument I originally had
moved the rawCSS code into a local closure and passed it to the api.
You'd use ( style, name, value, getStyle ); and call getStyle( name );
to get the style. The elem and force arguments that the raw css stuff
needed were made available through the closure.
Like A) this method is both a little ugly, and still only works during
css getting so you can't get anything while setting.
C) Fix the jQuery API so that when you are setting a css value you
actually know what element you are working on.
Right now the setting of a css value is done inside of jQuery.attr, if
a style is passed instead of a node it sets css values instead.
jQuery.attr is used in this way inside of jQuery.fn.attr
(jQuery.fn.css calls jQuery.fn.attr), jQuery.curCSS (only to get
opacity for IE's filter), and a bit in jQuery.fx;
The jQuery.attr function itself is actually quite separate in it's
code, there is almost no code at all common between working with a
elem attr or a style css, in fact the only common code before
jQuery.attr checks if it's working with an elem or a style and stops
sharing any code is checks for bad input, .support property
normalization, and a check to see if things are being set or got which
is stored in a set boolean.
As well everything calling jQuery.attr for style reasons other than
jQuery.fn.attr is purely for the purpose of style, there is nothing
dependent on what it was passed and they all know about their elem. As
for jQuery.fn.attr it's explicitly doing `jQuery.attr( type ?
elem.style : style, ... );` so it would be fairly trivial to force it
to use a different function for setting css instead of attributes.
The advantages here are that this actually cleans up a bit of
unnecessary style code in attribute setting, and attr setting code
isn't always being called in the backend to handle css setting, as
well this is the only option that allows you to get css values while
you are setting.
The disadvantage is that any plugin directly calling the lower level
jQuery.attr( style, name, value? ); method will not be compatible
anymore and will need to update to something like jQuery.setCSS( elem,
name, value? );
Input on what option is preferred would be appreciated.
--
~Daniel Friesen (Dantman, Nadir-Seen-Fire) [http://nadir-seen-
fire.com]
-Nadir-Point & Wiki-Tools (http://nadir-point.com) (http://wiki-
tools.com)
-MonkeyScript (http://monkeyscript.org)
-Animepedia (http://anime.wikia.com)
-Narutopedia (http://naruto.wikia.com)
-Soul Eater Wiki (http://souleater.wikia.com)
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"jQuery Development" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/jquery-dev?hl=en
-~----------~----~----~----~------~----~------~--~---