poload
Version:
Bootstrap 3 jQuery popover with ajax dinamic content
102 lines (92 loc) • 3.88 kB
JavaScript
// Uses CommonJS, AMD or browser globals to create a jQuery plugin.
(function (factory) {
if (typeof define === 'function' && define.amd) {
// AMD. Register as an anonymous module.
define(['jquery'], factory);
} else if (typeof module === 'object' && module.exports) {
// Node/CommonJS
module.exports = function( root, jQuery ) {
if ( jQuery === undefined ) {
// require('jQuery') returns a factory that requires window to
// build a jQuery instance, we normalize how we use modules
// that require this pattern but the window provided is a noop
// if it's defined (how jquery works)
if ( typeof window !== 'undefined' ) {
jQuery = require('jquery');
}
else {
jQuery = require('jquery')(root);
}
}
factory(jQuery);
return jQuery;
};
} else {
// Browser globals
factory(jQuery);
}
}(function ($) {
$.fn.enablePoloads = function (fnProcessContent) {
var poLoadTimeout;
var fnLoadPoContent = (e)=>{
var $this = $(e.currentTarget);
//Se já carregou os contents dos popovers não precisa executar novamente!
if ($this.data("bs.popover") != undefined) {
return;
}
poLoadTimeout = setTimeout(()=>{
var load_content = `<i class="fa fa-spinner fa-pulse fa-2x fa-fw"></i><span class="sr-only">Loading...</span>`;
$this.popover({
content: load_content,
html: true,
placement: "left",
container: "body",
trigger: "manual"
}).popover('show');
//Evento para mudança do comportamento padrão para abertura do popover em Hover
$this.on('mouseenter', (e)=>{
poLoadTimeout = setTimeout(()=>{
$this.popover('show');
}, 400);
$this.one('mouseleave', ()=>{
clearTimeout(poLoadTimeout);
})
});
$.ajax({
url: $this.data('poload'),
global: false,
success: (data)=>{
//Chamamos a função de callback passando como parâmetro o retorno do Ajax
$this.attr('data-content', fnProcessContent($this, data));
//Evento para atualização do conteúdo
$this.one('hidden.bs.popover', ()=>{
$this.popover('show');
});
//Esconde para poder atualizar o conteúdo do popover
$this.popover('hide');
}
});
}, 400);
};
//Ativa os popovers
var i;
for (i = 0; i < this.length; i++) {
var element = $(this[i]);
//POPOVERS DINÂMICOS
//Se for um poload ajax checamos o parâmetro URL
if (element.data('poload') != undefined) {
//Atribuimos a função de callback ao evento
element.on('mouseenter', fnLoadPoContent);
//Cancela o Load dos poloads, em um mouseleave muito rapido
element.on('mouseleave', ()=>{
clearTimeout(poLoadTimeout);
});
} else {
//POPOVERS ESTATICOS
//Container body para corrigir o bug no popover dos headers de tabelas
element.popover({container: "body"});
}
}
return true;
};
}));