JAVASCRIPT
Ink Core.
All samples are using Ink.requireModules
, please read how to use it at Ink.requireModules section
This module provides the necessary methods to create and load the modules using Ink.
Function name | Description |
---|---|
.bind(fn, context) | Function.prototype.bind alternative/fallback. |
.bindEvent(fn, context) | Function.prototype.bind alternative for event handlers. |
.bindMethod(object, methodName) | Function.prototype.bind alternative for class methods |
.createExt(moduleName, version, dependencies, modFn) | Creates an Ink.Ext module |
.createModule(mod, version, deps, modFn) | Creates a new module. |
.error() | Calls native console.error if available. |
.extendObj(destination, source) | Extends an object with another |
.getModule(mod, [version]) | Loads a module. |
.getModuleScripts() | Builds the markup needed to load the modules. |
.getModulesLoadOrder() | Lists loaded module names. |
.getPath(key, [noLib]) | Get the full path of a module. |
.i(id) | Shorter alias to document.getElementById. |
.loadScript(uri, [contentType]) | Loads a script URL. |
.log() | Calls native console.log if available. |
.namespace(ns, [returnParentAndKey]) | Defines a module namespace. |
.requireModules(deps, cbFn) | Requires modules asynchronously |
.s(selector, [from]) | Selects elements like Ink.ss , but only returns the first element found. |
.setPath(key, rootURI) | Sets the URL path for a namespace. |
.ss(selector, [from]) | Alias for Ink.Dom.Selector |
.warn() | Calls native console.warn if available. |
Property name | Description |
---|---|
.VERSION |
Function.prototype.bind alternative/fallback.
Creates a new function that, when called, has its this keyword set to the provided value, with a given sequence of arguments preceding any provided when the new function is called.
fn
The functioncontext
The value to be passed as the this parameter to the target function when the bound function is called. If used as false, it preserves the original context and just binds the arguments.more...
Additional arguments will be sent to the original function as prefix arguments.How to keep this
in the object context
Code
var MyObj = {
_name: null,
setName: function(name)
{
this._name = name;
},
showNameAfter1Sec: function()
{
// success
setTimeout(Ink.bind(function() {
alert(this._name);
}, this), 1000);
// "this" will be "window", so this._name will be "undefined"
setTimeout(function() {
alert(this._name);
}, 1000);
}
};
MyObj.setName('John');
MyObj.showNameAfter1Sec();
Ink.bind()
can be used to pass more arguments to callback function
Code
var MyObj = {
_name: null,
_age: null,
_setAndAlertInfo: function(name, age)
{
this._name = name;
this._age = age;
alert(this._name +' => '+ this._age);
},
showInfoAfter1Sec: function(name, age)
{
setTimeout(Ink.bind(this._setAndAlertInfo, this, name, age), 1000);
}
};
MyObj.showInfoAfter1Sec('John', 35);
Function.prototype.bind alternative for event handlers.
Same as bind but keeps first argument of the call the original event.
Set context
to false
to preserve the original context of the function and just bind the arguments.
fn
The functioncontext
The value to be passed as the this parameter to the targetmore...
Additional arguments will be sent to the original function as prefix argumentsInk.bindEvent()
is very similar to Ink.bind
but it is used to keep the this
context in event handlers, and event
object is passed to callback as first argument.
Code
<div>
<button id="my_button_a" class="ink-button">Click me A</button>
<button id="my_button_b" class="ink-button">Click me B</button>
</div>
<script>
Ink.requireModules(['Ink.Dom.Event_1'], function(InkEvent) {
var MyObj = {
_propToAlert: 'Hello World',
_handlerBinded: null,
addEvent: function()
{
var elmA = Ink.i('my_button_a');
var elmB = Ink.i('my_button_b');
// create a property binded to can be removed later with InkEvent.stopObserving
this._handlerBinded = Ink.bindEvent(this._doStuffOnClick, this);
InkEvent.observe(elmA, 'click', this._handlerBinded);
// Ink.bindEvent can be used directly in an anonymous function
InkEvent.observe(elmB, 'click', Ink.bindEvent(function(event){
this._doStuffOnClick(event);
}, this));
},
_doStuffOnClick: function(event)
{
alert(this._propToAlert + ' => ' + event.type);
}
};
MyObj.addEvent();
});
</script>
Function.prototype.bind alternative for class methods
See Ink.bind. The difference between bindMethod
and bind
is that bindMethod
fetches a method from an object. It can be useful, for instance, to bind a function which is a property of an object returned by another function.
object
The object that contains the method to bindmethodName
The name of the method that will be boundmore...
Additional arguments will be sent to the new method as prefix arguments.Build a function which calls method remove
of Ink.Dom.Element
on an element
Code
<div id="element">
Text content
</div>
<script>
Ink.requireModules(['Ink.Dom.Element_1'], function(InkElement) {
var elm = Ink.i('element');
var methodBinded = Ink.bindMethod(InkElement, 'remove', elm);
methodBinded();
});
</script>
Comparing with Ink.bind to the same effect. The following two calls are equivalent
Code
Ink.bind(this.doWithSomething, this, 'something');
Ink.bindMethod(this, 'doWithSomething', 'something');
Creates an Ink.Ext module
Does exactly the same as createModule but creates the module in the Ink.Ext namespace
moduleName
Extension nameversion
Extension versiondependencies
Extension dependenciesmodFn
Function returning the extensionWith Ink.createExt()
you can create your own module to Ink. It works like Ink.createModule()
but will expose your module in Ink.Ext
namespace. With this method you can contribute to Ink project with new modules and we will promote your module in our page. Read how to contribute to Ink in our CONTRIBUTING.md. Ink.createExt()
can be used to create your modules to your project.
Here's an example of Ink.Ext.MyAwesomeModule_1
Code
Ink.createExt('MyAwesomeModule', 1, ['Ink.Dom.Event_1'], function(InkEvent) {
var MyAwesomeModule = function() {
this._init();
};
MyAwesomeModule.prototype = {
_init: function()
{
this._doStuff();
},
_doStuff: function()
{
alert('Doing stuff in MyAwesomeModule');
/* ... */
}
};
return MyAwesomeModule;
});
Ink.requireModules(['Ink.Ext.MyAwesomeModule_1'], function(MyAwesomeModule) {
new MyAwesomeModule();
});
How to create an UI extension that works with data-attributes as options. This is a simple extension. A clickable div that expands from init height to max heigh.
Code HTML
<!-- Use option with "data-module_name-" prefix to be compatible with other modules -->
<div id="ext-expands" data-expands-init-height="30" data-expands-max-height="150" style="border:1px solid black;">
Click Me
</div>
Code JavaScript
// Create extension Expands
Ink.createExt('Expands', 1, ['Ink.UI.Common_1', 'Ink.Dom.Event_1'], function(UICommon, InkEvent) {
var Expands = function(selector, options) {
this._init(selector, options);
};
Expands.prototype = {
_init: function(selector)
{
this._rootElm = UICommon.elsOrSelector(selector, 'Ink.Ext.Expands root element')[0] || null;
this._options = UICommon.options({
expandsInitHeight: ['Number', 10], // default value to init height
expandsMaxHeight: ['Number', 100] // default value to max height
}, arguments[1] || {}, this._rootElm);
this._stout = false;
this._currentHeight = 0;
this._addEvent();
},
_addEvent: function()
{
InkEvent.observe(this._rootElm, 'click', Ink.bindEvent(this._onClickElm, this));
},
_onClickElm: function(event)
{
InkEvent.stopDefault(event);
if(this._stout) {
clearTimeout(this._stout);
}
this._currentHeight = this._options.expandsInitHeight;
this._rootElm.style.height = this._currentHeight+'px';
this._expands();
},
_expands: function()
{
if(this._currentHeight >= this._options.expandsMaxHeight) {
this._stout = false;
return;
}
this._currentHeight += 5;
this._rootElm.style.height = this._currentHeight+'px';
this._stout = setTimeout(Ink.bind(this._expands, this), 100);
}
};
return Expands;
});
// Run extension
Ink.requireModules(['Ink.Ext.Expands_1'], function(Expands){
new Expands("#ext-expands");
});
Creates a new module.
Use this to wrap your code and benefit from the module loading used throughout the Ink library
mod
Module name, separated by dots. Like Ink.Dom.Selector, Ink.UI.Modalversion
Version numberdeps
Array of module names which are dependencies of the module being created. The order in which they are passed here will define the order they will be passed to the callback function.modFn
The callback function to be executed when all the dependencies are resolved. The dependencies are passed as arguments, in the same order they were declared. The function itself should return the module.How to create a new Ink's static module ex: Ink.Util.Calculator
version 1 without dependencies
This module is static, that means, all methods will be used as Ink.Util.Calculator_1.method();
Code
Ink.createModule('Ink.Util.Calculator', 1, // define module and version
[], // empty array to define no dependencies
function() { // callback function
var StaticModule = {
_toNumber: function(str) // private method, should be used only internaly
{
return Number(str);
},
add: function(a, b)
{
return this._toNumber(a) + this._toNumber(b);
},
subtract: function(a, b)
{
return this._toNumber(a) - this._toNumber(b);
},
multiply: function(a, b)
{
return this._toNumber(a) * this._toNumber(b);
},
divide: function(a, b)
{
return this._toNumber(a) / this._toNumber(b);
}
};
return StaticModule;
});
// How to use it... see Ink.requireModules to understand how it works
Ink.requireModules(['Ink.Util.Calculator_1'], function(Calculator) {
Calculator.add(7, '5'); // 12
Calculator.subtract(15, 4); // 11
Calculator.multiply(7, 6); // 42
Calculator.divide('a', 'b'); // NaN
});
How to create a new Ink's instantiable module ex: Ink.UI.ElementClickable
version 1 with Ink.Dom.Event_1
and Ink.Dom.Element_1
as dependencies
This module is instantiable, that means, will be used as new Ink.UI.ElementClickable_1();
Code
Ink.createModule('Ink.UI.ElementClickable', 1, // define module and version
['Ink.Dom.Event_1', 'Ink.Dom.Element_1'], // array of dependencies
function(InkEvent, InkElement) { // callback function with dependencies alias. Using Event/Element as alias can conflit with Event/Element JS global objects
var ElementClickable = function(options) {
this._init(options);
};
ElementClickable.prototype = {
_init: function() // by convention, use _init method as constructor name
{
this._options = Ink.extendObj({
label: 'Click me',
target: Ink.s('body')
}, arguments[0] || {});
this._addElementToTarget();
},
_createElement: function()
{
var div = InkElement.create('div', {setTextContent: this._options.label});
return this._addEvent(div);
},
_addEvent: function(elm)
{
InkEvent.observe(elm, 'click', function() {
alert('Click');
});
return elm;
},
_addElementToTarget: function()
{
var elm = this._createElement();
InkElement.insertBottom(elm, this._options.target);
}
};
return ElementClickable;
});
Ink.requireModules(['Ink.UI.ElementClickable_1'], function(ElmClickable) {
new ElmClickable();
new ElmClickable({label: 'Click here please', target: Ink.ss('div')[0]});
});
Calls native console.error if available.
more...
Arguments to be evaluatedInk.error()
is an alias to console.error()
when it is available.
Code
function myFunc(a, b) {
if(!a || !b) {
Ink.error('Missing arguments');
}
/* ... */
}
myFunc('a');
myFunc(null, 'b');
Extends an object with another
Copy all of the properties in one or more source objects over to the destination object, and return the destination object. It's in-order, so the last source will override properties of the same name in previous arguments.
destination
The object that will receive the new/updated propertiessource
The object whose properties will be copied over to the destination objectmore...
Additional source objects. The last source will override properties of the same name in the previous defined sourcesCopy object person1
to person2
Code
var person1 = {
name: 'Charles',
age: 31,
married: true
};
var person2 = Ink.extendObj({}, person1);
/*
person1 will be:
{ name: 'Charles', age: 31, married: true }
person2 will be:
{ name: 'Charles', age: 31, married: true }
*/
Copy object but define default values in new object.
Code
var person1 = {
name: 'Charles',
age: 31,
married: true
};
var person2 = Ink.extendObj({
hasGlasses: true,
married: false
}, person1);
/*
person1 will be:
{ name: 'Charles', age: 31, married: true }
person2 will be:
{ name: 'Charles', age: 31, married: true, hasGlasses: true }
*/
Loads a module.
A synchronous method to get the module from the internal registry.
It assumes the module is defined and loaded already!
mod
Module nameversion
Version number of the moduleBuilds the markup needed to load the modules.
This method builds the script tags needed to load the currently used modules
Lists loaded module names.
The list is ordered by loaded time (oldest module comes first)
Get the full path of a module.
This method looks up the paths given in setPath (and ultimately the default Ink's path).
key
Name of the module you want to get the pathnoLib
Flag to skip appending 'lib.js' to the returned path.Shorter alias to document.getElementById.
Just calls document.getElementById(id)
, unless id
happens to be an element.
If id
is an element, Ink.i
just returns it.
You can use this in situations where you want to accept an element id, but a raw element is also okay.
id
Element IDCode
<div id="element_id_a">A</div>
<div id="element_id_b">B</div>
<script>
var elmA = Ink.i('element_id_a'); // "div" with id "element_id_a"
var elmB = Ink.i(document.getElementById('element_id_b')); // "div" width id "element_id_b"
var elmC = Ink.i('element_id_c'); // null
</script>
Loads a script URL.
This creates a script
tag in the head
of the document.
Reports errors by listening to 'error' and 'readystatechange' events.
uri
Can be an external URL or a module namecontentType
'text/javascript'The `type` attribute of the new script tag.Calls native console.log if available.
more...
Arguments to be evaluatedInk.log()
is an alias to console.log()
when it is available.
Code
var varA = {foo: 'bar'};
var varB = 123;
Ink.log(varA, varB);
Defines a module namespace.
ns
Namespace to define.returnParentAndKey
Flag to change the return value to an array containing the namespace parent and the namespace keyRequires modules asynchronously
Use this to get modules, even if they're not loaded yet
deps
Array of module names. The order in which they are passed here will define the order they will be passed to the callback function.cbFn
The callback function to be executed when all the dependencies are resolved. The dependencies are passed as arguments, in the same order they were declared.Using Ink.requireModules()
in a project is a good practice. All dependencies can be controlled, creating aliases to Inks modules making it more easy to use and all variables will keep in a private project scope instead of global scope.
Here's an example of a MyProject.js
file.
Code
Ink.requireModules( // first line of MyProject.js
[ // dependencies array with all needed modules
'Ink.Dom.Loaded_1',
'Ink.Dom.Event_1',
'Ink.Net.Ajax_1'
],
function(Loaded, InkEvent, Ajax) { // aliases to dependencies modules
/*
* All project code here
*/
var MyProjectConfig = {
app_name: 'My Awesome Project',
ajaxEndpoint: '/ajaxendpoint.php'
};
function aFunction() {
InkEvent.observe(document.body, 'click', onClickBody);
}
function onClickBody() {
new Ajax(MyProjectConfig.ajaxEndpoint, {});
}
Loaded.run(function() { // run on DOMContentLoaded
aFunction();
});
}); // last line of MyProject.js
Selects elements like Ink.ss
, but only returns the first element found.
Using sizzle-specific selectors is NOT encouraged!
selector
CSS3 selector stringfrom
documentContext element. If set to a DOM element, the `selector` will only look for descendants of this DOM Element.Code
<div id="element_id">
<p id="a" class="small">
A text sample with a <span>span</span> and a <a href="#">link</a>.
</p>
<p id="b" class="small">
Another text paragraph.
</p>
</div>
<script>
var elmA = Ink.s('#element_id');
// "div" with id "element_id"
var elmB = Ink.s('#element_id > p');
// <p> with id "a"
var elmC = Ink.s('.noclass');
// null
var elmD = Ink.s('a', Ink.i('#a'));
// <a> found in element with id "a"
</script>
Sets the URL path for a namespace.
Use this to customize where requireModules and createModule will load dependencies from.
This can be useful to set your own CDN for dynamic module loading or simply to change your module folder structure
key
Module or namespacerootURI
Base URL path and schema to be appended to the module or namespaceExample
Ink.setPath('Ink', 'https://my-cdn/Ink/');
Ink.setPath('Lol', 'https://my-cdn/Lol/');
// Loads from https://my-cdn/Ink/Dom/Whatever/lib.js
Ink.requireModules(['Ink.Dom.Whatever'], function () { ... });
// Loads from https://my-cdn/Lol/Whatever/lib.js
Ink.requireModules(['Lol.Whatever'], function () { ... });
Alias for Ink.Dom.Selector
Using sizzle-specific selectors is NOT encouraged!
selector
CSS3 selector stringfrom
documentContext element. If set to a DOM element, the `selector` will only look for descendants of this DOM Element.Code
<div id="element_id">
<p id="a" class="small">
A text sample with a <span>span</span> and a <a href="#">link</a>.
</p>
<p id="b" class="small">
Another text paragraph.
</p>
</div>
<script>
var aElmA = Ink.ss('#element_id');
// [object HTMLDivElement] => array with "div" with id "element_id"
var aElmB = Ink.ss('#element_id > p');
// [[object HTMLParagraphElement],[object HTMLParagraphElement]] with id "a"
var aElmC = Ink.ss('.noclass');
// []
var aElmD = Ink.ss('.small', document.body);
// Found all elements with class .small in document.body context
</script>
Calls native console.warn if available.
more...
Arguments to be evaluatedInk.warn()
is an alias to console.warn()
when it is available.
Code
function myFunc(a, b) {
if(!a || !b) {
Ink.warn('Missing arguments');
}
/* ... */
}
myFunc('a');
myFunc(null, 'b');
{String}