Написал генератор тегов не могу найти ошибку
В общем для своего сайта нужно написать генератор тегов на чистом яваскрипте или с использованием ajax.. но я выбрал js. Написал, и вроде даже работало, до тех пор пока не прикрутил слова-исключения, с тех пор код не работает, хотя ошибку не выдает. В js я недавно. И мог упустить что то важное, тем более большая часть кода спионерена(уже не помню где)
Собственно форма такая <textarea id="editor" class="text-area" name="mainText">some text</textarea><!-- так же может подключатся редактор и для записи текста будет использоваться форма с классом .wysibb-text-editor(без дублирования в #editor)--> <input id="keywords" type="text" name="tags" value="сюда генератор выводит теги через запятую" /> <input type="button" value="Get keywords!" onclick="countKeywords()"> <input type="text" value="4" id="minLengthKeyword"> <input type="text" value="3" id="minRepeatKeyword"> <input type="text" value="0.8" id="coincidence"> <input type="text" value="тут слова исключения, если они есть" id="noRepeatKeyword"> И сама логика
var keywords1, keywords2 = new Array(), keywords3 = new Array();
function getWords(s) {
return s.replace(/[^а-яА-Яa-zA-Z]+/g, " ").toLowerCase(); // Возвращаем массив только из букв
}
function getKeywords(s) {
var tmp;
tmp = getWords(s);
return tmp.split(" "); // Возвращаем массив тегов
}
function countKeywords () {
var s = $('#editor').attr("value") + $('.wysibb-text-editor').html(); // Получаем текст из которого нужно выделить теги
var noRepeatKeyword = $('#noRepeatKeyword').attr("value"), // Получаем слова-исключания
re = /\s*,\s*/, // убираем пробелы вокруг запятых
NoTags = noRepeatKeyword.split(re);// Выделяем массив слов-исключений
var minLengthKeyword = parseInt(document.getElementById('minLengthKeyword').value), // Минимальная длинна тега
minRepeatKeyword = parseInt(document.getElementById('minRepeatKeyword').value), // Минимальное количество его повторений
coincidence = parseFloat(document.getElementById('coincidence').value); // Коэффицент совпадения
var tmpKeywords1 = getKeywords(s),
tmpKeywords2 = new Array();
for (i=0;i<tmpKeywords1.length;i++) { // Перебираем полученный массив и создаем новый из удовледворяющих условию элементов
var currentWord = tmpKeywords1[i],
DeleteWord = false,
n=0;
while ((n<NoTags.length) && (DeleteWord = true)) {
if (currentWord = NoTags[n]) {DeleteWord = true;} // если элемент из тегов совпадает с одним из исключаений назначаем флаг
n= n+1;
}
if ((currentWord.length >= minLengthKeyword) && (DeleteWord = false)) {
keywords2.push(currentWord); // Добавляем в массив результатов если length >= minLengthKeyword и если это слово не входит в исключения
}
}
for (i=0;i<keywords2.length;i++) { // Перебираем полученный массив и создаем новый из удовледворяющих условию элементов
var currentWord = keywords2[i];
currentWordCore = currentWord.substr(0,Math.round(currentWord.length*coincidence));
var inwords2 = keywords2.grep(currentWordCore);
if (inwords2.length >= minRepeatKeyword && keywords3.grep(currentWordCore).length <1) {
keywords3.push(currentWord);
}
}
document.getElementById('keywords').value = keywords3;
keywords2 = new Array();
keywords3 = new Array();
}
// Создаем и выводим строку тегов
function grep(str) {
var ar = new Array();
var arSub = 0;
for (var i in this) {
if (typeof this[i] == "string" && this[i].indexOf(str) != -1){
ar[arSub] = this[i];
arSub++;
}
}
return ar;
}
Array.prototype.remove=function(s){
for(i=0;i<this .length;i++){
if(s==this[i]) this.splice(i, 1);
}
}
Array.prototype.grep = grep;
|
Цитата:
|
MrBoriska,
где элементы из 11 строки? и в jquery есть .val() |
Цитата:
|
Цитата:
Ошибка где то ниже, с проверкой на то, что элемент массива равен какому-нибудь элементу из массива слов исключений. Спасибо за .val(), я еще не знаю всех функций. |
в строке 30 - (DeleteWord = true) - всегда возвращает труэ
и в строке 35 - (DeleteWord = false) - всегда фалсэ обычно так не делают :nono: условие в строке 35 никогда не выполнится |
Цитата:
|
Цитата:
|
finestra,
ок |
Спасибо за найденные ошибки) Я еще не очень вник в типы данных, поэтому не знал что проверки нужно делать на тождественности.
Вот исправленный код, который начал выводить теги, как и раньше. Но цикл while, который должен сравнить элемент текущей итерации цикла for со всеми элементами массива NoTags[] и при любом совпадении устанавливать флаг DeleteWord = true что завершает цикл while... походу не работает.
var keywords1, keywords2 = new Array(), keywords3 = new Array();
function getWords(s) {
return s.replace(/[^а-яА-Яa-zA-Z]+/g, " ").toLowerCase(); // Возвращаем массив только из букв
}
function getKeywords(s) {
var tmp;
tmp = getWords(s);
return tmp.split(" "); // Возвращаем массив тегов
}
function countKeywords () {
var s = $('#editor').val() + $('.wysibb-text-editor').html(); // Получаем текст из которого нужно выделить теги
var noRepeatKeyword = $('#noRepeatKeyword').val(), // Получаем слова-исключания
re = /\s*,\s*/, // убираем пробелы вокруг запятых
NoTags = noRepeatKeyword.split(re);// Выделяем массив слов-исключений
var minLengthKeyword = parseInt($('#minLengthKeyword').val()), // Минимальная длинна тега
minRepeatKeyword = parseInt($('#minRepeatKeyword').val()), // Минимальное количество его повторений
coincidence = parseFloat($('#coincidence').val()); // Коэффицент совпадения
var tmpKeywords1 = getKeywords(s),
tmpKeywords2 = new Array();
for (i=0;i<tmpKeywords1.length;i++) { // Перебираем полученный массив и создаем новый из удовледворяющих условию элементов
var currentWord = tmpKeywords1[i],
DeleteWord = false,
n=0;
while ((n<NoTags.length) && (DeleteWord === true)) {
if (currentWord = NoTags[n]) {
DeleteWord = true;
} // если элемент из тегов совпадает с одним из исключаений назначаем флаг
n=n+1;
}
if ((currentWord.length >= minLengthKeyword) && (DeleteWord === false)) {
keywords2.push(currentWord); // Добавляем в массив результатов если length >= minLengthKeyword и если это слово не входит в исключения
}
}
for (i=0;i<keywords2.length;i++) { // Перебираем полученный массив и создаем новый из удовледворяющих условию элементов
var currentWord = keywords2[i];
currentWordCore = currentWord.substr(0,Math.round(currentWord.length*coincidence));
var inwords2 = keywords2.grep(currentWordCore);
if (inwords2.length >= minRepeatKeyword && keywords3.grep(currentWordCore).length <1) {
keywords3.push(currentWord);
}
}
document.getElementById('keywords').value = keywords3;
keywords2 = new Array();
keywords3 = new Array();
}
// Создаем и выводим строку тегов
function grep(str) {
var ar = new Array();
var arSub = 0;
for (var i in this) {
if (typeof this[i] == "string" && this[i].indexOf(str) != -1){
ar[arSub] = this[i];
arSub++;
}
}
return ar;
}
Array.prototype.remove=function(s){
for(i=0;i<this .length;i++){
if(s==this[i]) this.splice(i, 1);
}
}
Array.prototype.grep = grep;
|
| Часовой пояс GMT +3, время: 23:11. |