This is an quick way of start writing a raw javacript component plugin. And see below how the usage works.
Usage:
This will just show a popup window with a content in it.
var newMessage = new popupMessage ({
content : '<p>Hello World!</p>' ,
});
newMessage . show ();
Sample Plugin:
Javscript plugin for toggle popup div with some dynamic content.
popupMessage.js
/*!
* popupMessage v1.0.0 (http://jeradrutnam.com)
* Copyright 2016 Jerad Rutnam.
* Licensed under the MIT license
*/
( function () {
/**
* @description Constructor
*/
this . popupMessage = function () {
// Global references
this . btnClose = null ;
this . modal = null ;
this . overlay = null ;
// Default options
var defaults = {
className : 'default-class' ,
btnClose : true ,
content : "" ,
overlay : true
}
// Extending default options with the passed in arugments
if ( arguments [ 0 ] && typeof arguments [ 0 ] === "object" ) {
this . options = extendDefaults ( defaults , arguments [ 0 ]);
}
}
/**
* @description Public Methods
*/
popupMessage . prototype . hide = function () {
this . modal . className = this . modal . className . replace ( " popup-message-open" , "" );
this . overlay . className = this . overlay . className . replace ( " popup-message-open" , "" );
}
popupMessage . prototype . show = function () {
create . call ( this );
initializeEvents . call ( this );
window . getComputedStyle ( this . modal ). height ;
this . modal . className = this . modal . className +
( this . modal . offsetHeight > window . innerHeight ?
" popup-message-open popup-message-anchored" : " popup-message-open" );
this . overlay . className = this . overlay . className + " popup-message-open" ;
}
/**
* @description Private Methods
*/
function create () {
var content , contentHolder , docFrag ;
/*
* If content is an HTML string, append the HTML string.
* If content is a domNode, append its content.
*/
if ( typeof this . options . content === "string" ) {
content = this . options . content ;
} else {
content = this . options . content . innerHTML ;
}
// Document Fragment to build with
docFrag = document . createDocumentFragment ();
// Modal element
this . modal = document . createElement ( "div" );
this . modal . className = "popup-message-window " + this . options . className ;
// If btnClose option is true, add a close button
if ( this . options . btnClose === true ) {
this . btnClose = document . createElement ( "button" );
this . btnClose . className = "popup-message-close close-button" ;
this . btnClose . innerHTML = "×" ;
this . modal . appendChild ( this . btnClose );
}
// If overlay is true, add an overlay element
if ( this . options . overlay === true ) {
this . overlay = document . createElement ( "div" );
this . overlay . className = "popup-message-overlay " + this . options . className ;
docFrag . appendChild ( this . overlay );
}
// Create content area and append to modal
contentHolder = document . createElement ( "div" );
contentHolder . className = "popup-message-content" ;
contentHolder . innerHTML = content ;
this . modal . appendChild ( contentHolder );
// Append modal to Document Fragment
docFrag . appendChild ( this . modal );
// Append DocumentFragment to body
document . body . appendChild ( docFrag );
}
function extendDefaults ( source , properties ) {
var property ;
for ( property in properties ) {
if ( properties . hasOwnProperty ( property )) {
source [ property ] = properties [ property ];
}
}
return source ;
}
function initializeEvents () {
if ( this . btnClose ) {
this . btnClose . addEventListener ( 'click' , this . hide . bind ( this ));
}
if ( this . overlay ) {
this . overlay . addEventListener ( 'click' , this . hide . bind ( this ));
}
}
}());
popupMessage.css
for plugin support. This is just an supporting stylings to see how plugin actually works. you can even do this by adding stylings inline. But I always recomend to keep the
styles separately as possible. To easy theming capability.
.popup-message-overlay {
display : none ;
background : #000 ;
position : fixed ;
height : 100% ;
width : 100% ;
top : 0 ;
left : 0 ;
z-index : 100 ;
opacity : 0.4 ;
}
.popup-message-window {
display : none ;
z-index : 101 ;
width : 70% !important ;
background : #313131 ;
padding : 20px ;
top : 50% ;
left : 50% ;
position : fixed ;
margin-left : auto ;
margin-right : auto ;
left : 0 ;
right : 0 ;
}
.popup-message-window button {
border : none ;
color : #313131 ;
position : absolute ;
right : 0 ;
top : 0 ;
height : 20px ;
width : 20px ;
padding : 0 5px ;
line-height : 20px ;
font-size : 20px ;
}
.popup-message-open {
display : block ;
}
Plugin Breakdown:
Let’s go through the popupMessage.js
to see what is in the code & what are each blocks do.
( function () {
}());
Create your contructor
this . popupMessage = function () {
// Global references
this . btnClose = null ;
this . modal = null ;
this . overlay = null ;
// Default options
var defaults = {
className : 'default-class' ,
btnClose : true ,
content : "" ,
overlay : true
}
// Extending default options with the passed in arugments
if ( arguments [ 0 ] && typeof arguments [ 0 ] === "object" ) {
this . options = extendDefaults ( defaults , arguments [ 0 ]);
}
}
Create the public methods
popupMessage . prototype . hide = function () {
this . modal . className = this . modal . className . replace ( " popup-message-open" , "" );
this . overlay . className = this . overlay . className . replace ( " popup-message-open" , "" );
}
popupMessage . prototype . show = function () {
create . call ( this );
initializeEvents . call ( this );
window . getComputedStyle ( this . modal ). height ;
this . modal . className = this . modal . className +
( this . modal . offsetHeight > window . innerHeight ?
" popup-message-open popup-message-anchored" : " popup-message-open" );
this . overlay . className = this . overlay . className + " popup-message-open" ;
}
Create your component initializing method
function create () {
var content , contentHolder , docFrag ;
/*
* If content is an HTML string, append the HTML string.
* If content is a domNode, append its content.
*/
if ( typeof this . options . content === "string" ) {
content = this . options . content ;
} else {
content = this . options . content . innerHTML ;
}
// Document Fragment to build with
docFrag = document . createDocumentFragment ();
// Modal element
this . modal = document . createElement ( "div" );
this . modal . className = "popup-message-window " + this . options . className ;
// If btnClose option is true, add a close button
if ( this . options . btnClose === true ) {
this . btnClose = document . createElement ( "button" );
this . btnClose . className = "popup-message-close close-button" ;
this . btnClose . innerHTML = "×" ;
this . modal . appendChild ( this . btnClose );
}
// If overlay is true, add an overlay element
if ( this . options . overlay === true ) {
this . overlay = document . createElement ( "div" );
this . overlay . className = "popup-message-overlay " + this . options . className ;
docFrag . appendChild ( this . overlay );
}
// Create content area and append to modal
contentHolder = document . createElement ( "div" );
contentHolder . className = "popup-message-content" ;
contentHolder . innerHTML = content ;
this . modal . appendChild ( contentHolder );
// Append modal to Document Fragment
docFrag . appendChild ( this . modal );
// Append DocumentFragment to body
document . body . appendChild ( docFrag );
}
Add additional private methods
// Function to extend defaults
function extendDefaults ( source , properties ) {
var property ;
for ( property in properties ) {
if ( properties . hasOwnProperty ( property )) {
source [ property ] = properties [ property ];
}
}
return source ;
}
// Function to bind event listeners to dynamically created elements
function initializeEvents () {
if ( this . btnClose ) {
this . btnClose . addEventListener ( 'click' , this . hide . bind ( this ));
}
if ( this . overlay ) {
this . overlay . addEventListener ( 'click' , this . hide . bind ( this ));
}
}
And that is it. Happy plugin writing!