router for jquery Initially I am starting this project for providing routes in frontend like other framework(Angularjs,Reactjs, Vue.js) but with a difference. The user will be able to use it with JQuery and other JQuery plugins. It will provide simple, minimal and elegent solution for creating single page app using most loved library that is JQuery. Beside routing,It will provide smooth transitions of pages. For most hybrid app development we need some smooth transition between pages. So no need to use other css library for transitions. Corrently we have four transitions. In future we will add more animation for routes. Fom templating, I am using handlerbar. So for now dependency is JQuery and Handlerbar.js.
Simply Include: routes.css, routes.js with dependancies(JQuery, Handlerbars) to your html
<link rel="stylesheet" type="text/css" href="css/routes.css">
<script type="text/javascript" src="js/jquery-min.js"></script>
<script type="text/javascript" src="js/handlebars-v4.0.10.js"></script>
<script type="text/javascript" src="js/routes.js"></script>
Router initilization is simple, simply define your routes in an array with each object having route name and template id. template will be rendered when given route matches. Simple Example:
$(document).ready(function() {
const newAnimations = [
{
push: 'slide-to-left',
pop: 'slide-to-right'
},
{
push: 'slide-to-top',
pop: 'slide-to-bottom'
},
{
push: 'top-to-bottom',
pop: 'bottom-to-top'
},
{
push: 'right-to-left',
pop: 'left-to-right'
}
];
const cmpFirst = {
name: 'first',
template: '#template-first',
data: {
page_name: "First page",
user_list: json
},
beforeRender: function() {
console.log("in before render");
this.methods.getDataFromServer();
},
afterRender: function() {
console.log("in After render");
console.log(this);
},
renderAlways: false,
methods: {
firstFunction: function() {
console.log("first function found");
},
getDataFromServer: function() {
console.log("in get data from server");
var self = this;
$.ajax({
url: "http://localhost:8080/js/user_json.json",
method: "GET",
success: function(data) {
console.log("in get json success", data);
self.data.user_list = JSON.parse(data);
self.update();
},
error: function(error) {
console.log("in ajax error");
}
})
}
},
events: {
'click, .btn-update': function(el) {
this.data.user_list[1].first_name = "changed first name";
this.methods.firstFunction(); // you can call function using this, this will refer to current router object
this.update(); // need to call update as handlerbar template will update automatically
},
'click, .row': function(el) {
Router.push();
},
}
};
const cmpSecond = {
name: 'second',
template: '#template-second',
renderAlways: false,
autoRender: false,
data: {
name: 'second template',
address: 'second template address'
},
render: function($el, templateElement, data) {
console.log($el, templateElement, data);
var source = $(templateElement).html();
var template = Handlebars.compile(source);
var html = template(data);
$el.html(html);
}
};
var routes = [ cmpFirst, cmpSecond];
Router.init({
routes: routes,
animations: newAnimations[0]
});
});
It is having four routes each route object having two key name and template. this template will be rendered when route matches with route object name. You need to create your html template corresponding these routes. Like first route refers template #template-first so we need to define html template in our html code as like below.
<template id="template-first">
</template>
Simply put data in {}.
On load of html page your first route template will be render.
Route navigation is super easy. Routes.js provides two functions for moving forward and backward.
push function loads next routes to context and renders template associate with it.
pop current route and loads previous route to context and renders template associate with it.
You can pass pageindex (starting with zero) to visit perticular page wether it is in forward or backward direction. it will also keep your animation by detecting wether it is in forward (like push) or backward direction (like pop).
You can navigate using push, pop and go method by calling them in button click or on click of header navigation icons.
Example:
'click, .next': function() {
Router.push();
},
Animations that you can try:
{
push: 'slide-to-left',
pop: 'slide-to-right'
},
{
push: 'slide-to-top',
pop: 'slide-to-bottom'
},
{
push: 'top-to-bottom',
pop: 'bottom-to-top'
},
{
push: 'right-to-left',
pop: 'left-to-right'
}
name of route
template id for that route
Default : true if you set renderalways to false then first time data will be render for that perticular route not each time you visit that route. If you want to render only first in route you can set this to false
Default: true It gives to facility to manually use render function. if you set false then you can use render function to manually render as you want. If autoRender is true (Default is true ) then you don't need to worry about render you just need to put data in data object of route and it will render automatically.
data to render in route template
function will be called just before data render in template you can use before render function to fetch data from server and update route data. example:
const cmpFirst = {
name: 'first',
template: '#template-first',
data: {
page_name: "First page",
user_list: json
},
beforeRender: function() {
console.log("in before render");
this.methods.getDataFromServer();
},
methods: {
getDataFromServer: function() {
console.log("in get data from server");
var self = this;
$.ajax({
url: "http://localhost:8080/js/user_json.json",
method: "GET",
success: function(data) {
console.log("in get json success", data);
self.data.user_list = JSON.parse(data);
self.update();
},
error: function(error) {
console.log("in ajax error");
}
})
}
},
events: {
}
};
Here I am fetching data from server and updating data in route object. After data is fetched you need to explicitly assign it to route object and call update function of route which will re-render handlerbar template. Because your this.methods.getDataFromServe making ajax call that is asyncronous so render will not wait for that and you need to call update function explicitly in ajax success to update data in template.
Params: ($el, $templateElement, data)
case 1: it will be done automatically if you have not set autoRender to false, default value of autoRender is true that means it will render automatically.
case 2: if you have explicitly set autoRender to false then you can handle render function in your route object. That give a bit more flexibility. this function have three parameters
$el: container element in route template in which you need to populate your html from template
$templateElement: html template element, you can use this to $el with data
data: data of your route object
Ex:
render: function($el, $templateElement, data) {
console.log($el, $templateElement, data);
var source = $templateElement.html();
var template = Handlebars.compile(source);
var html = template(data);
$el.html(html);
}
you can easily compile template and assign it to $el.
function called after template render
object containing methods used in your route Ex:
methods: {
testing: function() {
console.log("testing function");
}
}
List of event used in route. you can define your event like button click and can perform operation on that. Ex:
events: {
'click, .btn-update': function(el) {
this.data.user_list[1].first_name = "changed first name";
this.methods.firstFunction(); // you can call function using this, this will refer to current router object
this.update(); // need to call update as handlerbar template will update automatically
}
}
Array of route objects
Animation object containing push and pop animation name
same as route object
function to show loader before render function
function to call after render function that will hide loader