The two functions mentioned here, chainify (https://gist.github.com/gists/1466219) and propertize (https://gist.github.com/1466253) work fine on their own but best when used together.
When provided with a constructor such as Element
, Node
, CSSStyleDeclaration
, etc, the function will run through every property. If the property is a function, it will be wrapped in another function which will ensure that the return value is the original object.
This means that you can use the syntax
document.createElement('a')
.setAttribute('data-monkeys', '∞')
.addEventListener('click', function(){ alert('Urk! Alert!')}, false)
Similar to the chainify function, this takes a constructor as its argument. It adds the method .prop to everything which will set the properties provided either as an object or as a propertyName and propertyValue then return the original object to ensure the outcome is still chainable.
myElement
.prop({
'href': 'http://140byt.es/',
'title': 'tiny awsm'
})
.prop('innerHTML', '140byt.es');
When the two are combined, you have a completely chainable DOM manipulation tool.
The idea for the .prop function came from Lea Verou's Chainvas. This should be mostly compatible with the syntax (although possibly less robust). You can do the same chainify/propertize on any of the standard constructors - Element
, Node
, CSSStyleDeclaration
, DOMTokenList
, CanvasRenderingContext2D
to make any API chainable.
Ah, well spotted, thanks.
Thanks to @subzey's clever shuffling, there's enough space to put in a strict
undefined
check and return correctly onnull
or0
. There might still be a clever way to remove thec
variable introduced here but I shan't attempt to figure it out tonight, I don't think.My initial hope of combining chain and prop together looks to be a bit unobtainable. Still, they both function fine on their own.