diff --git a/README.txt b/README.txt index 3036d3d..537e4d3 100644 --- a/README.txt +++ b/README.txt @@ -17,4 +17,47 @@ browser window. It is completely customizable as well via CSS. This TipTip jQuery plug-in is dual licensed under the MIT and GPL licenses: http://www.opensource.org/licenses/mit-license.php -http://www.gnu.org/licenses/gpl.html \ No newline at end of file +http://www.gnu.org/licenses/gpl.html + +------------------------------------------------------------------- + +This is modified version of TipTip + +What's New: + +* All callback functions when called, "this" refers to the element that is applied the TipTip and also receive an argument which is an object with the some useful values. + + { holder: tiptip_holder, content: tiptip_content, arrow: tiptip_arrow, options: opts } + +* The option "content" can also be a callback function that must return a string or HTML. This callback function will be called every time the tooltip is shown. Very useful for ajax generated tooltips. For example: + + $j('#my-element').tipTip({ + + maxWidth: 600, + defaultPosition: 'right', + content: function (e) { + $.ajax({ url: 'myJsonWebService.php', success: function (response) { + e.content.html(response); // the var e is the callback function data (see above) + }); + return 'Please wait...'; // We temporary show a Please wait text until the ajax success callback is called. + } + + }); + +* If "enter" and "exit" callback function return false, then the tooltip won't be shown or hidden respectively. + +* Added option "afterEnter" which is a callback function that is called after a tooltip is shown. + +* Added option "afterExit" which is a callback function that is called after a tooltip is hidden. + +* Fixed option "maxWidth" so that it is applied each time a tooltip is shown. It seems that using the cssClass option (see below) is a better way to do this. + +* Added option "cssClass" which is applied to the tiptip holder before shown. You can apply more than one css classes by seperating them with a space character (see also jQuery.addClass). + +* Added methods to "show", "hide" or "destroy" a TipTip. For example: + + $('#my-element').tipTip({ content: 'Hello world!' }); // We apply a tooltip with the text Hello world! on #my-element $('#my-element').tipTip('show'); // This will programmatically show the applied TipTip without the need to hover over the element. $('#my-element').tipTip('hide'); // we hide it $('#my-element').tipTip('destroy'); // and then we destroy it which means the element #my-element no won't have a TipTip applied. + +* The option "activation" can have the value "manual". In this case no events will be applied to the element and the developer will be responsible to show or not the tooltip. But you can always use the show and hide methods to show or hide the tooltip ;-) + +* Created an alternate look & feel for TipTip, you can use it by setting the option "cssClass" to "alternative". \ No newline at end of file diff --git a/jquery.tipTip.js b/jquery.tipTip.js index 7eacf35..fb75bab 100644 --- a/jquery.tipTip.js +++ b/jquery.tipTip.js @@ -1,191 +1,313 @@ - /* - * TipTip - * Copyright 2010 Drew Wilson - * www.drewwilson.com - * code.drewwilson.com/entry/tiptip-jquery-plugin - * - * Version 1.3 - Updated: Mar. 23, 2010 - * - * This Plug-In will create a custom tooltip to replace the default - * browser tooltip. It is extremely lightweight and very smart in - * that it detects the edges of the browser window and will make sure - * the tooltip stays within the current window size. As a result the - * tooltip will adjust itself to be displayed above, below, to the left - * or to the right depending on what is necessary to stay within the - * browser window. It is completely customizable as well via CSS. - * - * This TipTip jQuery plug-in is dual licensed under the MIT and GPL licenses: - * http://www.opensource.org/licenses/mit-license.php - * http://www.gnu.org/licenses/gpl.html - */ - -(function($){ - $.fn.tipTip = function(options) { - var defaults = { - activation: "hover", - keepAlive: false, - maxWidth: "200px", - edgeOffset: 3, - defaultPosition: "bottom", - delay: 400, - fadeIn: 200, - fadeOut: 200, - attribute: "title", - content: false, // HTML or String to fill TipTIp with - enter: function(){}, - exit: function(){} - }; - var opts = $.extend(defaults, options); - - // Setup tip tip elements and render them to the DOM - if($("#tiptip_holder").length <= 0){ - var tiptip_holder = $('
'); - var tiptip_content = $(''); - var tiptip_arrow = $(''); - $("body").append(tiptip_holder.html(tiptip_content).prepend(tiptip_arrow.html(''))); - } else { - var tiptip_holder = $("#tiptip_holder"); - var tiptip_content = $("#tiptip_content"); - var tiptip_arrow = $("#tiptip_arrow"); - } - - return this.each(function(){ - var org_elem = $(this); - if(opts.content){ - var org_title = opts.content; - } else { - var org_title = org_elem.attr(opts.attribute); - } - if(org_title != ""){ - if(!opts.content){ - org_elem.removeAttr(opts.attribute); //remove original Attribute - } - var timeout = false; - - if(opts.activation == "hover"){ - org_elem.hover(function(){ - active_tiptip(); - }, function(){ - if(!opts.keepAlive){ - deactive_tiptip(); - } - }); - if(opts.keepAlive){ - tiptip_holder.hover(function(){}, function(){ - deactive_tiptip(); - }); - } - } else if(opts.activation == "focus"){ - org_elem.focus(function(){ - active_tiptip(); - }).blur(function(){ - deactive_tiptip(); - }); - } else if(opts.activation == "click"){ - org_elem.click(function(){ - active_tiptip(); - return false; - }).hover(function(){},function(){ - if(!opts.keepAlive){ - deactive_tiptip(); - } - }); - if(opts.keepAlive){ - tiptip_holder.hover(function(){}, function(){ - deactive_tiptip(); - }); - } - } - - function active_tiptip(){ - opts.enter.call(this); - tiptip_content.html(org_title); - tiptip_holder.hide().removeAttr("class").css("margin","0"); - tiptip_arrow.removeAttr("style"); - - var top = parseInt(org_elem.offset()['top']); - var left = parseInt(org_elem.offset()['left']); - var org_width = parseInt(org_elem.outerWidth()); - var org_height = parseInt(org_elem.outerHeight()); - var tip_w = tiptip_holder.outerWidth(); - var tip_h = tiptip_holder.outerHeight(); - var w_compare = Math.round((org_width - tip_w) / 2); - var h_compare = Math.round((org_height - tip_h) / 2); - var marg_left = Math.round(left + w_compare); - var marg_top = Math.round(top + org_height + opts.edgeOffset); - var t_class = ""; - var arrow_top = ""; - var arrow_left = Math.round(tip_w - 12) / 2; - - if(opts.defaultPosition == "bottom"){ - t_class = "_bottom"; - } else if(opts.defaultPosition == "top"){ - t_class = "_top"; - } else if(opts.defaultPosition == "left"){ - t_class = "_left"; - } else if(opts.defaultPosition == "right"){ - t_class = "_right"; - } - - var right_compare = (w_compare + left) < parseInt($(window).scrollLeft()); - var left_compare = (tip_w + left) > parseInt($(window).width()); - - if((right_compare && w_compare < 0) || (t_class == "_right" && !left_compare) || (t_class == "_left" && left < (tip_w + opts.edgeOffset + 5))){ - t_class = "_right"; - arrow_top = Math.round(tip_h - 13) / 2; - arrow_left = -12; - marg_left = Math.round(left + org_width + opts.edgeOffset); - marg_top = Math.round(top + h_compare); - } else if((left_compare && w_compare < 0) || (t_class == "_left" && !right_compare)){ - t_class = "_left"; - arrow_top = Math.round(tip_h - 13) / 2; - arrow_left = Math.round(tip_w); - marg_left = Math.round(left - (tip_w + opts.edgeOffset + 5)); - marg_top = Math.round(top + h_compare); - } - - var top_compare = (top + org_height + opts.edgeOffset + tip_h + 8) > parseInt($(window).height() + $(window).scrollTop()); - var bottom_compare = ((top + org_height) - (opts.edgeOffset + tip_h + 8)) < 0; - - if(top_compare || (t_class == "_bottom" && top_compare) || (t_class == "_top" && !bottom_compare)){ - if(t_class == "_top" || t_class == "_bottom"){ - t_class = "_top"; - } else { - t_class = t_class+"_top"; - } - arrow_top = tip_h; - marg_top = Math.round(top - (tip_h + 5 + opts.edgeOffset)); - } else if(bottom_compare | (t_class == "_top" && bottom_compare) || (t_class == "_bottom" && !top_compare)){ - if(t_class == "_top" || t_class == "_bottom"){ - t_class = "_bottom"; - } else { - t_class = t_class+"_bottom"; - } - arrow_top = -12; - marg_top = Math.round(top + org_height + opts.edgeOffset); - } - - if(t_class == "_right_top" || t_class == "_left_top"){ - marg_top = marg_top + 5; - } else if(t_class == "_right_bottom" || t_class == "_left_bottom"){ - marg_top = marg_top - 5; - } - if(t_class == "_left_top" || t_class == "_left_bottom"){ - marg_left = marg_left + 5; - } - tiptip_arrow.css({"margin-left": arrow_left+"px", "margin-top": arrow_top+"px"}); - tiptip_holder.css({"margin-left": marg_left+"px", "margin-top": marg_top+"px"}).attr("class","tip"+t_class); - - if (timeout){ clearTimeout(timeout); } - timeout = setTimeout(function(){ tiptip_holder.stop(true,true).fadeIn(opts.fadeIn); }, opts.delay); - } - - function deactive_tiptip(){ - opts.exit.call(this); - if (timeout){ clearTimeout(timeout); } - tiptip_holder.fadeOut(opts.fadeOut); - } - } - }); - } -})(jQuery); \ No newline at end of file +/* +* TipTip +* Copyright 2010 Drew Wilson +* www.drewwilson.com +* code.drewwilson.com/entry/tiptip-jquery-plugin +* +* Version 1.3 - Updated: Mar. 23, 2010 +* +* This Plug-In will create a custom tooltip to replace the default +* browser tooltip. It is extremely lightweight and very smart in +* that it detects the edges of the browser window and will make sure +* the tooltip stays within the current window size. As a result the +* tooltip will adjust itself to be displayed above, below, to the left +* or to the right depending on what is necessary to stay within the +* browser window. It is completely customizable as well via CSS. +* +* This TipTip jQuery plug-in is dual licensed under the MIT and GPL licenses: +* http://www.opensource.org/licenses/mit-license.php +* http://www.gnu.org/licenses/gpl.html +*/ + +(function ($) { + $.fn.tipTip = function (options) { + var defaults = { + activation: 'hover', // How to show (and hide) the tooltip. Can be: hover, focus, click and manual. + keepAlive: false, // When true the tooltip won't disapper when the mouse moves away from the element. Instead it will be hidden when it leaves the tooltip. + maxWidth: '200px', // The max-width to set on the tooltip. You may also use the option cssClass to set this. + edgeOffset: 0, // The offset between the tooltip arrow edge and the element that has the tooltip. + defaultPosition: 'bottom', // The position of the tooltip. Can be: top, right, bottom and left. + delay: 400, // The delay in msec to show a tooltip. + fadeIn: 200, // The length in msec of the fade in. + fadeOut: 200, // The length in msec of the fade out. + attribute: 'title', // The attribute to fetch the tooltip text if the option content is false. + content: false, // HTML or String or Function (that returns HTML or String) to fill TipTIp with + enter: function () { }, // Callback function before a tooltip is shown. + afterEnter: function () { }, // Callback function after a tooltip is shown. + exit: function () { }, // Callback function before a tooltip is hidden. + afterExit: function () { }, // Callback function after a tooltip is hidden. + cssClass: '', // CSS class that will be applied on the tooltip before showing only for this instance of tooltip. + detectTextDir: true // When false auto-detection for right-to-left text will be disable (When true affects a bit the performance). + }; + + // Setup tip tip elements and render them to the DOM + if ($('#tiptip_holder').length <= 0) { + var tiptip_inner_arrow = $('