gpt4 book ai didi

javascript - jQuery .data() 被覆盖

转载 作者:行者123 更新时间:2023-11-28 08:31:30 25 4
gpt4 key购买 nike

我目前正在编写以下 jQuery 工具提示插件代码。我使用 jQuery 的 .data() 方法存储每个工具提示的配置。但是,当我去检索数据时,它已被来自完全不同的选择器的最近存储的数据覆盖。我无法找出问题所在,因为它之前正在工作,然后突然停止了。要查看的主要区域是 addTooltip()、removeTooltip() 和 displayTooltip()。

示例:

$('#tooltip1').addTooltip('tooltip', { 'direction': 'bottom' });
$('#tooltip2').addTooltip('tooltip', { 'direction': 'left' });

在上面的示例中,我选择了两个完全不同的元素,但是当我显示 #tooltip1 工具提示时,它将使用 #tooltip2 的配置,在本例中为 'direction': 'left'。

感谢任何帮助。

(function($) {

// Used as a template for addTooltip()
var tooltipDefaults = {
'class': null,
'showOn': 'mouseenter',
'hideOn': 'mouseleave',
'direction': 'top',
'offset': 0
}

// Store generated IDs to avoid conflicting IDs
var tooltipIds = new Array();

// Keep track of displayed popups
var displayedTooltips = new Array();

function generateUniqueId()
{
var id;

do {
id = Math.floor(Math.random()*90000) + 10000;
} while ($.inArray(id, tooltipIds) !== -1);

tooltipIds.push(id);
return id;
}

function getUniqueId(id)
{
return parseInt(id.substr(0, 5));
}

function isUniqueId(id)
{
return !NaN(getUniqueId(id));
}

function removeUniqueId(id)
{
var id = getUniqueId(id);

var idIndex = $.inArray(id, tooltipIds);

if (idIndex !== -1) {
tooltipIds.splice(idIndex);
}
}

$.fn.displayTooltip = function()
{
var element = $(this);
var tooltip = $('#' + element.attr('data-tooltip-id'));
var config = element.data('config');

var offset = element.offset();

var left;
var top;

switch (config.direction) {
case 'left':
top = offset.top + "px";
left = offset.left - tooltip.outerWidth() - config.offset + "px";
break;
case 'top':
top = offset.top - element.outerHeight() - config.offset + "px";
left = offset.left + ((element.outerWidth() / 2) - (tooltip.outerWidth() / 2)) + "px";
break;
case 'right':
top = offset.top + "px";
left = offset.left + element.outerWidth() + config.offset + "px";
break;
case 'bottom':
top = offset.top + element.outerHeight() + config.offset + "px";
left = offset.left + ((element.outerWidth() / 2) - (tooltip.outerWidth() / 2)) + "px";
break;
}

tooltip.css({
'position': 'absolute',
'left': left,
'top': top,
'z-index': 5000
});

if (element.isTooltipDisplayed()) {
return;
}

tooltip.show();
displayedTooltips.push(element.attr('id'));
}

$.fn.hideTooltip = function()
{
var element = $(this);

var idIndex = $.inArray(element.attr('id'), displayedTooltips);

if (idIndex !== -1) {
displayedTooltips.splice(idIndex);
}

$('#' + element.attr('data-tooltip-id')).hide();
}

$.fn.addTooltip = function(content, params)
{
var config = $.extend(tooltipDefaults, params);

return this.each(function() {
var element = $(this);

// If the element already has a tooltip change the content inside of it
if (element.hasTooltip()) {
$('#' + element.attr('data-tooltip-id')).html(content);
return;
}

var tooltipId = (element.is('[id]') ? element.attr('id') : generateUniqueId()) + '-tooltip';
element.attr('data-tooltip-id', tooltipId);

var tooltip = $('<div>', {
id: tooltipId,
role: 'tooltip',
class: config.class
}).html(content);

$('body').append(tooltip);

/**
* If showOn and hideOn are the same events bind a toggle
* listener else bind the individual listeners
*/
if (config.showOn === config.hideOn) {
element.on(config.showOn, function() {
if (!element.isTooltipDisplayed()) {
element.displayTooltip();
} else {
element.hideTooltip();
}
});
} else {
element.on(config.showOn, function() {
element.displayTooltip();
}).on(config.hideOn, function() {
element.hideTooltip();
});
}

// Store config for other functions use
element.data('config', config);

// Saftey check incase the element recieved focus from the code running above
element.hideTooltip();
});
}

$.fn.hasTooltip = function()
{
return $(this).is('[data-tooltip-id]');
}

$.fn.isTooltipDisplayed = function()
{
var element = $(this);

if (!element.hasTooltip()) {
return false;
}

return ($.inArray(element.attr('id'), displayedTooltips) === -1) ? false : true;
}

$.fn.removeTooltip= function()
{
return this.each(function() {
var element = $(this);
var tooltipId = element.attr('data-tooltip-id');
var config = element.data('config');

$('#' + tooltipId).remove();

if (isUniqueId(tooltpId)) {
removeUniqueId(tooltipId);
}

element.removeAttr('data-tooltip-id');

if (config.showOn === config.hideOn) {
element.off(config.showOn);
} else {
element.off(config.showOn);
element.off(config.hideOn);
}

element.removeData('config');
});
}

// Reposition tooltip on window resize
$(window).on('resize', function() {
if (displayedTooltips.length < 1) {
return;
}

for (var i = 0; i < displayedTooltips.length; i++) {
$('#' + displayedTooltips[i]).displayTooltip();
console.log(displayedTooltips);
}
});
}(jQuery));

最佳答案

当你这样做时:

element.data('config', config);
每当我们调用时,

config 很容易发生不必要的修改:

 var config = $.extend(tooltipDefaults, params);

示例:http://jsfiddle.net/j8v4s/1/

您可以通过创建一个继承自 tooltipDefaults 的新对象来解决此问题,但在修改时,只有其本身会发生更改。您可以将 tooltipDefaults 对象设置为构造函数,如下所示:

function TooltipDefaults() {
this.class = null;
this.showOn = 'mouseenter';
this.hideOn = 'mouseleave';
this.direction = 'top';
this.offset = 0;
}

现在我们可以这样做:

var config = new TooltipDefaults();
$.extend(config, params);

示例:http://jsfiddle.net/sXSFy/4/

这是您的插件的一个工作示例:http://jsfiddle.net/DWtL5/2/

关于javascript - jQuery .data() 被覆盖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21816040/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com