This will allow you to define and use custom attributes in the DOM.
If you are used to using any modern front end frameworks, you are probably also used to doing things like:
<div ng-click='someMethod'> // Angular
<div rv-on-click='someMethod'> // Rivets
<div on-click='someMethod'> // Riot.js
This library makes custom attribute binding super easy without having to use some massive lame framework.
You can define your own with a simple attribute binding API.
npm install --save-dev simple-custom-attributes
- Require it in, and run the
register
method passing a dom element and a scope object.Then when you are done, youvar simpleCustomAttributes = require('simple-custom-attributes'); simpleCustomAttributes.register(object, rootElement);
unregister
.simpleCustomAttributes.unregister(object, rootElement);
This will register all custom attributes in the root element. No need to do it one at a time like I have done in the examples below.
Note: The this
scope of the method (if you are passing a method to the binding) is the object you registered.
Lets say you have a off-canvas menu and you wanted to make a swipe gesture close it. You would add a on-swipe-right
attribute passing a method you want to call when the swipe right is complete.
The DOM.
<div class='off-canvas-nav-thing' on-swipe-right='closeNav'>
// Nav HTML HERE
</div>
The view
var simpleCustomAttributes = require('simple-custom-attributes'),
view = {
closeNav : function() {
// code to close the nav.
// Note: `this` in here === the `view`
}
};
simpleCustomAttributes.register(view, document.querySelector('.off-canvas-nav-thing'));
When the user swipes right, it will call that closeNav
function.
Lets say you had a element that has some fat paragraph of text in it and you wanted to clamp that to 3 lines.
The DOM.
<div class='some-fat-text-in-here' line-clamp='model.linesToClampTheFatText'>
400 lines of lorem ipsum.
</div>
The View.
var simpleCustomAttributes = require('simple-custom-attributes'),
model = {
linesToClampTheFatText : 3
};
simpleCustomAttributes.register(view, document.querySelector('.some-fat-text-in-here'));
After the registration is complete, that pile of text will be truncated to 3 lines.
The DOM.
<div class='clicky-mc-click-face' on-click='yeahBuddy'>
</div>
The View.
var simpleCustomAttributes = require('simple-custom-attributes'),
view = {
yeahBuddy : function() {
}
};
simpleCustomAttributes.register(view, document.querySelector('.clicky-mc-click-face'));
Will call the yeahBuddy
method when the element is clicked.
Each custom attribute must have the following methods.
{
bind : function(el, value) {
// el === The element in question.
// value === could be a function, a value, anything really. Depends on what you passed the binding.
// NOTE: The scope of this closure is the bound object. so, `this` === the view you are binding
// You add event listeners, do work etc here.
},
unbind : function(el, value) {
// undo everything you did in the previous method.
}
}
To include this custom attribute into the library, either make a pull request. OR. Call the addAttribute
method.
When you call addAttribute
you will pass a string corresponding with the attribute name and a object containing the above mentioned properties. (you can also use this to override existing attributes.)
If I wanted to define a on-input
handler for an input element.
Like so:
var simpleCustomAttributes = require('simple-custom-attributes');
simpleCustomAttributes.addAttribute('on-input', {
bind : function(el, value) {
el.addEventListener('input', value, false);
},
unbind : function(el, value) {
el.removeEventListener('input', value, false);
}
})
Right now, we included the following into the library cause I use them all the time:
They are in the repo, but you will need to call addAttribute
on the instance to actually use them.
var customAttributes = require('simple-custom-attributes');
customAttributes.addAttribute('line-clamp', require('simple-custom-attributes/attributes/line-clamp'));
<div line-clamp='4'>
This text will be clamped to 4 lines with an ellipsis at the end.
</div>
var customAttributes = require('simple-custom-attributes');
customAttributes.addAttribute('on-mouse-in', require('simple-custom-attributes/attributes/on-mouse-in'));
<div on-mouse-in='someMethod'></div>
var customAttributes = require('simple-custom-attributes');
customAttributes.addAttribute('on-mouse-out', require('simple-custom-attributes/attributes/on-mouse-out'));
<div on-mouse-out='someMethod'></div>
var customAttributes = require('simple-custom-attributes');
customAttributes.addAttribute('on-swipe-left', require('simple-custom-attributes/attributes/on-swipe-left'));
<div on-swipe-left='someMethod'></div>
var customAttributes = require('simple-custom-attributes');
customAttributes.addAttribute('on-swipe-right', require('simple-custom-attributes/attributes/on-swipe-right'));
<div on-swipe-right='someMethod'></div>
var customAttributes = require('simple-custom-attributes');
customAttributes.addAttribute('on-click', require('simple-custom-attributes/attributes/on-click'));
<div on-click='someMethod'></div>
var customAttributes = require('simple-custom-attributes');
customAttributes.addAttribute('on-event', require('simple-custom-attributes/attributes/on-event'));
<div on-event='{ mouseover : handleMouseOver, mouseout : handleMouseOut }'></div>
var customAttributes = require('simple-custom-attributes');
customAttributes.addAttribute('on-click-and-hold', require('simple-custom-attributes/attributes/on-click-and-hold'));
<div on-click-and-hold='someMethod'></div>
var customAttributes = require('simple-custom-attributes');
customAttributes.addAttribute('on-enter-viewport', require('simple-custom-attributes/attributes/on-enter-viewport'));
<div on-enter-viewport='someMethod'></div> // Note: SomeMethod will be called with the % the element is in the viewport.
var customAttributes = require('simple-custom-attributes');
customAttributes.addAttribute('on-exit-viewport', require('simple-custom-attributes/attributes/on-exit-viewport'));
<div on-exit-viewport='someMethod'></div>
var customAttributes = require('simple-custom-attributes');
customAttributes.addAttribute('inner-html', require('simple-custom-attributes/attributes/inner-html'));
<div inner-html='someHtmlString'></div>
var customAttributes = require('simple-custom-attributes');
customAttributes.addAttribute('on-progress', require('simple-custom-attributes/attributes/on-progress'));
<video on-progress='someMethod'>
Let me know how it goes!!!