我有两个文本区域;
文本区域1包含标准文本,
Textarea#2包含音节总数
它们工作正常,但在换行时不对齐。
我觉得这里的代码片段包含了我的问题;
function $count_how_many_syllables($input) {
$("[name=set_" + $input + "]").keyup(function () {
var lines = $("[name=set_" + $input + "]").val().split(/\n/);
var arrayOfLines = [];
for (var i=0; i < lines.length; i++) {
arrayOfLines.push($.trim(lines[i]));
}
var $content;
var $word = 0;
var $syllable_count = "";
var $result = "";
for (var i = 0; i < arrayOfLines.length; i++) {
$content = arrayOfLines[i].toLowerCase();
word = $content.replace(/(?:[^laeiouy]es|ed|[^laeiouy]e)$/, '')
.replace(/^y/, '')
.match(/[aeiouy]/g).length;
if ($content.length < 1) {
$result = $result + "0\n";
} else {
$syllable_count = word.toString();
$result = $result + $syllable_count + "\n";
}
}
$("[name=set_" + $input + "_syllable_count]").val($result);
// set scrolling
$("[name=set_" + $input + "_syllable_count]").scrollTop = $("[name=set_" + $input + "]").scrollTop;
$("[name=set_" + $input + "_syllable_count]").scrollLeft = $("[name=set_" + $input + "]").scrollLeft;
});
}
setInterval(function ($) {
$count_how_many_syllables("a");
},100)(jQuery);
这是一个JsFiddle:http://jsfiddle.net/tq3zzhna/(键入一些内容,您将看到我的问题)
最佳答案
问题是您用来分割行的正则表达式。因为您只是找到每一组行(即非换行符),所以不考虑0个字符的空行。更好的方法是通过换行符split
,因此空行包括:
这与可选的回车和换行符匹配:var arrayOfLines = $("[name=set_" + $input + "]").val().split(/\r?\n/);
一旦修复,另一个问题是您正在检查将包含空行的$content.length < 3
。解决方法是只在$content.length > 0
的情况下查找单词count。
最后,您可以键入没有元音的单词,这些单词当前会破坏音节匹配(match()
返回空值),因此我添加了一些技巧来处理它,您可能可以做得更好:
function $count_how_many_syllables($input) {
$("[name=set_" + $input + "]").keyup(function () {
// split into separate lines
var arrayOfLines = $("[name=set_" + $input + "]").val().split(/\r?\n/);
var $content;
var $word = 0;
var $syllable_count = "";
var $result = "";
for (var i = 0; i < arrayOfLines.length; i++) {
$content = arrayOfLines[i].toLowerCase();
var word = $content.length;
// if we have content, find the syllables
if($content.length > 0) {
word = ($content.replace(/(?:[^laeiouy]es|ed|[^laeiouy]e)$/, '')
.replace(/^y/, '')
.match(/[aeiouy]/g) || 'a').length; // handle word with no vowels
if ($content.length <= 3) {
word = 1;
}
}
if (word !== 0) {
$syllable_count = word.toString();
$result = $result + $syllable_count + "\n";
} else {
$result = $result + "0 \n";
}
}
$("[name=set_" + $input + "_syllable_count]").val($result);
// set scrolling
$("[name=set_" + $input + "_syllable_count]").scrollTop = $("[name=set_" + $input + "]").scrollTop;
$("[name=set_" + $input + "_syllable_count]").scrollLeft = $("[name=set_" + $input + "]").scrollLeft;
});
}
(function ($) {
$count_how_many_syllables("a");
})(jQuery);
http://jsfiddle.net/tq3zzhna/3/