mirror of
https://github.com/flarum/framework.git
synced 2024-12-04 08:13:39 +08:00
135 lines
3.6 KiB
JavaScript
135 lines
3.6 KiB
JavaScript
import jump from 'jump.js';
|
|
import Tooltip from 'tooltip.js';
|
|
|
|
// add $.fn.tooltip
|
|
$.fn.tooltip = function (option) {
|
|
return this.each(function () {
|
|
const $this = $(this);
|
|
let data = $this.data('bs.tooltip');
|
|
const options = typeof option === 'object' && option || {};
|
|
|
|
if ($this.attr('title')) {
|
|
options.title = $this.attr('title');
|
|
$this.removeAttr('title');
|
|
$this.attr('data-original-title', options.title);
|
|
}
|
|
|
|
if (option === 'destroy') option = 'dispose';
|
|
|
|
if (!data && ['dispose', 'hide'].includes(option)) return;
|
|
|
|
if (!data) $this.data('bs.tooltip', (data = new Tooltip(this, options)));
|
|
if (typeof option === 'string' && data[option]) data[option]();
|
|
});
|
|
};
|
|
|
|
// add $.fn.outerWidth and $.fn.outerHeight
|
|
['width', 'height'].forEach(function(dimension) {
|
|
const Dimension = dimension.replace(/./, function (m) {
|
|
return m[0].toUpperCase()
|
|
});
|
|
|
|
$.fn[`outer${Dimension}`] = function(margin) {
|
|
const elem = this;
|
|
|
|
if (elem) {
|
|
const sides = {'width': ['left', 'right'], 'height': ['top', 'bottom']};
|
|
let size = elem[dimension]();
|
|
|
|
sides[dimension].forEach(function(side) {
|
|
if (margin) size += parseInt(elem.css('margin-' + side), 10);
|
|
});
|
|
|
|
return size;
|
|
} else {
|
|
return null;
|
|
}
|
|
};
|
|
});
|
|
|
|
// allow use of $(':input')
|
|
$.expr[':']['input'] = function() {
|
|
if (('disabled' in this) || ['INPUT', 'SELECT', 'TEXTAREA', 'BUTTON'].includes(this.tagName)) return this;
|
|
};
|
|
|
|
// add $().hover() method
|
|
$.fn.hover = function(hover, leave) {
|
|
return this
|
|
.on('mouseenter', hover)
|
|
.on('mouseleave', leave || hover);
|
|
};
|
|
|
|
// add animated scroll
|
|
$.fn.animatedScrollTop = function (to, duration = $.fx.speeds._default, callback) {
|
|
if (typeof to === 'number') to -= (window.scrollY || window.pageYOffset);
|
|
|
|
jump(to, {
|
|
duration: $.fx.speeds[duration] || duration,
|
|
callback
|
|
});
|
|
|
|
return this;
|
|
};
|
|
|
|
// required for compatibility with jquery plugins
|
|
// ex: bootstrap plugins
|
|
$.fn.extend = $.extend.bind($);
|
|
|
|
/**
|
|
* Enable special events on Zepto
|
|
* @license Original Copyright 2013 Enideo. Released under dual MIT and GPL licenses.
|
|
*/
|
|
$.event.special = $.event.special || {};
|
|
|
|
const bindBeforeSpecialEvents = $.fn.bind;
|
|
|
|
$.fn.bind = function(eventName, data, callback) {
|
|
const el = this;
|
|
|
|
if (!callback){
|
|
callback = data;
|
|
data = null;
|
|
}
|
|
|
|
$.each(eventName.split(/\s/), function(i, eventName) {
|
|
eventName = eventName.split(/\./)[0];
|
|
|
|
if(eventName in $.event.special){
|
|
let specialEvent = $.event.special[eventName];
|
|
|
|
/// init enable special events on Zepto
|
|
if(!specialEvent._init) {
|
|
specialEvent._init = true;
|
|
|
|
/// intercept and replace the special event handler to add functionality
|
|
specialEvent.originalHandler = specialEvent.handler;
|
|
specialEvent.handler = function(){
|
|
|
|
/// make event argument writable, like on jQuery
|
|
const args = Array.prototype.slice.call(arguments);
|
|
|
|
args[0] = $.extend({},args[0]);
|
|
|
|
/// define the event handle, $.event.dispatch is only for newer versions of jQuery
|
|
$.event.handle = function(){
|
|
|
|
/// make context of trigger the event element
|
|
const args = Array.prototype.slice.call(arguments);
|
|
const event = args[0];
|
|
const $target = $(event.target);
|
|
|
|
$target.trigger.apply( $target, arguments );
|
|
};
|
|
|
|
specialEvent.originalHandler.apply(this,args);
|
|
}
|
|
}
|
|
|
|
/// setup special events on Zepto
|
|
specialEvent.setup.apply(el, [data]);
|
|
}
|
|
});
|
|
|
|
return bindBeforeSpecialEvents.apply(this, [eventName, callback]);
|
|
};
|