Saya membuat pemalam untuk memintas panjang rentetan Apabila bilangan aksara melebihi nombor yang ditentukan, aksara akan dipintas dan gesaan kandungan lengkap dipaparkan dengan mengikut tetikus.
Ia boleh direalisasikan apabila menulis fungsi sahaja, tetapi selepas menggunakan kaedah berikut untuk membuat pemalam, saya mendapati bahawa kandungan yang diikuti oleh tetikus adalah yang terakhir, dan kandungan yang terakhir akan dipaparkan tanpa mengira sama ada aksara melebihi, kerana apabila terdapat sebahagian daripada kandungan Ia dimuatkan secara dinamik, jadi delegasi acara digunakan.
(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);
Otak saya bercelaru semasa waktu kerja saya pulang ke rumah dan menulisnya lagi. Ia akan menjadi lebih mudah jika saya mengubah pemikiran saya.
Apabila ditulis begini,
allTextp
dianggap tempatan atau global? Dikatakan bahawa beberapa pelayar lama akan menganggapnya global. Dalam kes ini, boleh dijelaskan bahawa kandungan yang diikuti oleh tetikus sentiasa yang terakhir. Dari sudut pandangan kod, saya tidak dapat melihat sebarang masalah lain yang boleh menyebabkan fenomena ini.