Creating Simple Jquery Modal Container Plugins Based On Bootrap And Bootstrap Modal

Much of web applications use modal dialog or pop up message on several page. So de idea is to make creating modal container at once and use it anywhere. It’s easy as just pass the content to the plugins.

Firstly, add required JavaScript and CSS libraries to HTML page.

<!doctype html>
<html>
<head>
   <link rel="stylesheet" href="http://netdna.bootstrapcdn.com/bootstrap/3.0.3/css/bootstrap.min.css" />
   <link rel="stylesheet" href="http://jschr.github.io/bootstrap-modal/css/bootstrap-modal-bs3patch.css" />
   <link rel="stylesheet" href="http://jschr.github.io/bootstrap-modal/css/bootstrap-modal.css" />

   <script src="http://code.jQuery.com/jquery-1.10.1.min.js" type="text/javascript"></script>
   <script src="http://netdna.bootstrapcdn.com/bootstrap/3.0.3/js/bootstrap.min.js" type="text/javascript"></script>
   <script src="http://jschr.github.io/bootstrap-modal/js/bootstrap-modalmanager.js" type="text/javascript"></script>
   <script src="http://jschr.github.io/bootstrap-modal/js/bootstrap-modal.js" type="text/javascript"></script>

   <script src="assets/js/generic-modal-container.js" type="text/javascript"></script>
</head>
...
...
<a href="#" class="show-modal-dialog btn btn-primary">Show Modal</a>
&nbsp;
<a href="#" class="show-nested-modal-dialog btn btn-primary">Show Nested Modal</a>

I use libraries that commonly used over the world.Those are Jquery, Twitter bootstrap, and bootstrap Modal. And I will write my plugins on generic-modal-container.js file. Look at code below for the complete plugins.

(function ($) {
    $.fn.showModal = function (header, content, callback) {
        var HTML = '<div class="modal fade generic-modal">' +
            '  <div class="modal-dialog">' +
            '    <div class="modal-content">' +
            '      <div class="modal-header">' +
            '        <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>' +
            '        <h4 class="modal-title">' + header +
            '        </h4>' +
            '      </div>' +
            '      <div class="modal-body">' + content +
            '      </div>' +
            '      <div class="modal-footer">' +
            '        <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>' +
            '        <button type="button" class="btn btn-primary ok-button-dialog">Ok</button>' +
            '      </div>' +
            '   </div><!-- /.modal-content -->' +
            '  </div><!-- /.modal-dialog -->' +
            '</div><!-- /.modal -->';
        
        var container = $('<div></div>').html(HTML);
        var newInstance = jQuery.extend(true, {}, container);
        newInstance.find('.ok-button-dialog').bind('click', function() {
            callback();
        });
        var modalElement = newInstance.find('.generic-modal');
	modalElement.modal();
        return modalElement;
    }
}(jQuery));

First variable define bootstrap modal, and callback function will called when Ok button clicked. I can add more option to modify button dialog label and show/hide Ok button when used on alert message.

Next, I just call that jquery plugin when I need to show a modal. The contents of modal also can be filled by Ajax request. Here how to use that plugins.

$(document).ready(function() {
    $('body').on('click', '.show-modal-dialog', function() {
        //text content
        var modalTitle = 'This is modal title';
        var message = 'This is text message.';
        var modal = $(this).showModal(modalTitle, message, function() {
            alert('Ok button clicked');
            modal.modal('hide');
        });
    });
});

var n = 0;
$(document).ready(function () {
    $('body').on('click', '.show-nested-modal-dialog', function () {
        //nested modal with html content
        var modalTitle = 'This is modal title';
        var message = '<a href="#" class="show-nested-modal-dialog btn btn-default">Show Modal ' + (++n) + '</a>';
        var modal = $(this).showModal(modalTitle, message, function() {
            var alertModal = $(this).showModal('Alert Message', 'Ok button clicked', function() {
                alertModal.modal('hide');
            });
        });
    });
});

Look at on JSFiddle for demo: http://jsfiddle.net/yFLK6/13/

Quick Sample To Use jQuery Global AJAX Events

Sometime we write AJAX based application which has many ajax call. If an AJAX called, we add loading image indicator to show that request being processed. For simply way we use AJAX beforeSend() and complete() events for show and hide loading image indicator. See code below:

// call an AJAX request
$.ajax({
	url: 'sample/url/target.php',
	beforeSend: function() {
		//call loading image indicator here
		showImageLoading();
	},
	success: function(result) {
		// do when success AJAX called successfully
	},
	complete: function() {
		//call function to hide loading image indicator here
		hideImageLoading();
	}
});

// call an another AJAX request
$.ajax({
	url: 'sample/url/another_target.php',
	beforeSend: function() {
		//call loading image indicator here
		showImageLoading();
	},
	success: function(result) {
		// do when success AJAX called successfully
	},
	complete: function() {
		//call function to hide loading image indicator here
		hideImageLoading();
	}
});

When we write much of AJAX call, we waste our time to write beforeSend() and complete() events for each AJAX calls. It’s also affect on total lines of code.

The better solution, we can use AJAX global events which always called when an AJAX request fired. Let’s try to modify code above:

// This event is triggered if an Ajax request is started
// and no other Ajax requests are currently running.
$(document).ajaxStart(function() {
	$(this).showLoading();
});

// This global event is triggered if there are no more
// Ajax requests being processed.
$(document).ajaxStop(function() {
	$(this).hideLoading();
});

// call an AJAX request
$.ajax({
	url: 'sample/url/target.php',
	success: function(result) {
		// do when success AJAX called successfully
	}
});

// call an another AJAX request
$.ajax({
	url: 'sample/url/another_target.php',
	success: function(result) {
		// do when success AJAX called successfully
	}
});

That’s, we just define global AJAX events once, and call many AJAX request. We can also disable global event for a particular AJAX request by passing global option to false on an AJAX request like below:

$.ajax({
	global: false,
	success: function(result) {
		// do when success AJAX called successfully
	}
});

The complete list of global and local jQuery AJAX events can be found at http://api.jquery.com/Ajax_Events/

Create Simple Jquery Plugin To Add An Arrow On Active Menu

Sometime I need to put an arrow on active menu visited by website user or visitor on simple way as image below.

menu

Firstly, prepare HTML image for arrow and a list of menus

...
...
<img class="up_arrow" src="images/up_arrow.png" />
<div class="menu left">
    <a href="#" class="active">About Us</a>
    <a href="#">The Dream</a>
    <a href="#">Events</a>
    <a href="#">Contact Us</a>
    <a href="#">Affiliates</a>
</div>
...
...

set absolute and hide the image on CSS file for first load

.up_arrow {
    position: absolute;
    display: none;
}

add javascript and write it as jquery plugin

(function($) {
    $.fn.putMenuArrow = function() {
        $('.up_arrow').css({
            'display': 'block',
            'position': 'absolute',
            'left': ($(this).offset().left + $(this).outerWidth() / 2) - 17, // 17 is width of arrow image
            'top': $(this).offset().top - 19 //19 is height of arrow image
        });
    }
}(jQuery));


// call putMenuArrow plugin
$(document).ready(function() {
    $('.menu a.active').putMenuArrow();

    $('.menu a').click(function(e) {
        e.preventDefault();
        $('.menu a').removeClass('active');
        $(this).addClass('active');
        $(this).putMenuArrow();
    });
});

The complete demo can be found at:

Manipulasi Gambar Dengan HTML5 Canvas Dan Javascript

Seorang kolega menanyakan tentang image manipulation lewat browser dan HTML5. Setelah browsing dapat list berikut:

  1. CamanJS
  2. vintageJS
  3. PaintbrushJS

Ya tiga itu kayaknya cocok untuk di recomendasikan. Mungkin suatu saat saya akan membuatkan tutorial dan demo untuk salah satu dari list di atas. Atau mungkin tiga-tiganya? who know, atau mungkin tidak sama sekali, wkwkwk.