J'ai créé un plug-in pour intercepter la longueur d'une chaîne. Lorsque le nombre de caractères dépasse le nombre spécifié, les caractères sont interceptés et l'invite de contenu complet s'affiche en suivant la souris.
Cela peut être réalisé en écrivant la fonction seule, mais après avoir utilisé la méthode suivante pour créer un plug-in, j'ai trouvé que le contenu suivi par la souris est le dernier, et le contenu du dernier sera affiché indépendamment de si les caractères sont dépassés, car lorsqu'il y a une partie du contenu Il est chargé dynamiquement, donc la délégation d'événements est utilisée.
(function($, window, document, undefined) {
// 创造一个公共变量来构建一个私有方法
var privateFunction = function() {}
var methods = {
// 字符截取,鼠标触发跟随详情提示框
subString: function (options) {
return this.each(function(index) {
var $this = $(this);
var defaults = {
el: '', // 目标元素
charNum: 22, // 截取字符个数
hasDot: true, // 是否显示省略号
// dotColor: '#666' // 省略号颜色
allTextp: '#allText', // 鼠标跟随完整文本框的p
isPrompt: true // 是否显示提示框
};
var settings = $.extend({}, defaults, options),
allTextp = settings.allTextp.replace(/[#|.]/g, ''),
strText = $(settings.el).eq(index).text(),
chineseRegex = /[^\x00-\xff]/g,
strLength = strText.replace(chineseRegex, '**').length,
newLength = 0,
newStr = '',
singleChar = '';
function _subString(str, len, hasDot) {
for (var i = 0; i < strLength; i++) {
singleChar = str.charAt(i).toString();
singleChar.match(chineseRegex) != null ? newLength += 2 : newLength++;
if (newLength > len) break;
newStr += singleChar;
}
if (hasDot && strLength > len) newStr += '...';
return newStr;
}
// 截取字符串
$this.html(_subString(strText, settings.charNum, settings.hasDot));
// 鼠标跟随是否显示完整文本框
if ( (strLength > settings.charNum) && settings.isPrompt ) {
$(document).on('mouseover', settings.el, function(event) {
if ( settings.allTextp.indexOf('#') != -1 ) $('body').append('<p id="' + allTextp + '" />');
if ( settings.allTextp.indexOf('.') != -1 ) $('body').append('<p class="' + allTextp + '" />');
});
$(document).on('mousemove', settings.el, function(event) {
$(settings.allTextp).text(strText).show().css({
left: event.pageX + 30,
top: event.pageY
});
});
$(document).on('mouseout', settings.el, function(event) {
$(settings.allTextp).remove();
});
// $this.mouseover(function() {
// if ( settings.allTextp.indexOf('#') != -1 ) $('body').append('<p id="' + allTextp + '" />');
// if ( settings.allTextp.indexOf('.') != -1 ) $('body').append('<p class="' + allTextp + '" />');
// });
// $this.mousemove(function(event) {
// $(settings.allTextp).text(strText).show().css({
// left: event.pageX + 30,
// top: event.pageY
// });
// });
// $this.mouseout(function() {
// $(settings.allTextp).remove();
// });
}
});
}
};
$.fn.inCommonUseJsPlugin = function() {
var method = arguments[0];
if(methods[method]) {
method = methods[method];
arguments = Array.prototype.slice.call(arguments, 1);
} else/* if( typeof(method) == 'object' || !method ) {
method = methods.init;
} else */{
$.error( 'Method ' + method + ' does not exist on jQuery.pluginName' );
return this;
}
return method.apply(this, arguments);
}
})(jQuery, window, document);
Mon cerveau était confus pendant les heures de travail. Je suis rentré chez moi et je l'ai réécrit. Ce serait beaucoup plus facile si je changeais de façon de penser.
Lorsqu'il est écrit ainsi,
allTextp
est considéré comme local ou global ? On dit que certains navigateurs plus anciens le considéreront comme global. Dans ce cas, on peut expliquer que le contenu suivi par la souris est toujours le dernier. Du point de vue du code, je ne vois aucun autre problème pouvant provoquer ce phénomène.