Skip to content

Instantly share code, notes, and snippets.

@brianfeister
Created April 11, 2013 17:35
Show Gist options
  • Save brianfeister/5365439 to your computer and use it in GitHub Desktop.
Save brianfeister/5365439 to your computer and use it in GitHub Desktop.
Handle various uses of constrained popover plugin
define( [
"jquery"
],
function( $ ) {
"use strict"; // jshint ;_;
/**
* Handler for popover trigger: mouseenter.
*
* @param {object} e JS event object
*/
var handle_popover_over = function( e ) {
var $this = $( this ),
$pop_content = $this.next( '.ai1ec-popup' ),
el_content_data, el_classes_data, popover_placement;
// If no popover found, quit.
if ( $pop_content.length == 0 ) {
return;
}
el_content_data = $pop_content.html();
el_classes_data = $pop_content.attr( 'class' );
var el_classes_array = el_classes_data.split( " " );
$.each( el_classes_array, function( key, value ) {
if( /^ai1ec-popover-pl-/.test( value ) ) {
popover_placement = value.replace( /^ai1ec-popover-pl-/, '' );
} else {
popover_placement = 'left';
}
} );
$this.constrained_popover( {
content: el_content_data,
title: '',
placement: popover_placement,
trigger: 'manual',
html: true,
template: '<div class="popover ' + el_classes_data +
'"><div class="arrow"></div><div class="popover-inner">' +
'<div class="popover-content"><p></p></div></div></div>',
container: '.ai1ec-popover-boundary'
}).constrained_popover( 'show' );
}
/**
* Handler for popover trigger: mouseleave. Remove popup if entering an
* element that is not the popup.
*
* @param {object} e JS event object
*/
var handle_popover_out = function( e ) {
var $el = $( e.toElement );
// If an ancestor of element being entered is not a popup, hide popover.
if ( $el.closest( '.ai1ec-popup' ).length == 0 ) {
$( this ).constrained_popover( 'hide' );
}
}
/**
* Handler for popover; remove the popover on mouseleave of itself. Hide popup
* if entering an element that is not a tooltip.
* Also remove any visible tooltip if removing popup.
*
* @param {object} e JS event object
*/
var handle_popover_self_out = function( e ) {
var $el = $( e.toElement );
// If an ancestor of element being entered is not a tooltip, hide popover.
if ( $el.closest( '.tooltip' ).length == 0 ) {
$( this ).remove();
$( 'body > .tooltip' ).remove();
}
};
/**
* Manually handle tooltip mouseenter.
*
* @param {object} e JS event object
*/
var handle_tooltip_over = function( e ) {
$( this ).tooltip( {
'trigger' : 'manual'
} ).tooltip( 'show' );
}
/**
* Manually handle tooltip mouseleave. Do not hide if entering tooltip or
* tooltip triggering action.
*
* @param {object} e JS event object
*/
var handle_tooltip_out = function( e ) {
var $el = $( e.toElement );
if ( $el.closest( '.tooltip' ).length == 0 ) {
$( this ).tooltip( 'hide' );
}
}
/**
* Handler for tooltip; remove the tooltip on mouseleave of itself, unless
* moving onto the tooltip trigger action. If moving onto an element that is
* not in a popup, hide any visible popup.
*
* @param {object} e JS event object
*/
var handle_tooltip_self_out = function( e ) {
var $el = $( e.toElement );
// If an ancestor of element being entered is not a tooltip trigger action,
// hide tooltip.
if ( $el.closest( '.ai1ec-tooltip-trigger' ).length == 0 ) {
$( this ).remove();
}
// If an ancestor of element being entered is not a popup, hide any popup.
if ( $el.closest( '.ai1ec-popup' ).length == 0 ) {
$( 'body > .ai1ec-popup' ).remove();
}
};
return {
handle_popover_over : handle_popover_over,
handle_popover_out : handle_popover_out,
handle_popover_self_out : handle_popover_self_out,
handle_tooltip_over : handle_tooltip_over,
handle_tooltip_out : handle_tooltip_out,
handle_tooltip_self_out : handle_tooltip_self_out
};
} );
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment