Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 25.12.2013, 23:21
Интересующийся
Отправить личное сообщение для MrBoriska Посмотреть профиль Найти все сообщения от MrBoriska
 
Регистрация: 25.12.2013
Сообщений: 12

Написал генератор тегов не могу найти ошибку
В общем для своего сайта нужно написать генератор тегов на чистом яваскрипте или с использованием 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, 25.12.2013 в 23:43.
Ответить с цитированием
  #2 (permalink)  
Старый 25.12.2013, 23:28
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Сообщение от MrBoriska
В общем для своего сайта нужно написать генератор тегов на яваскрипте или с использованием ajax.. но я выбрал js
Научишь использовать ajax без js?
__________________
В личку только с интересными предложениями
Ответить с цитированием
  #3 (permalink)  
Старый 25.12.2013, 23:33
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,068

MrBoriska,
где элементы из 11 строки? и в jquery есть .val()
Ответить с цитированием
  #4 (permalink)  
Старый 25.12.2013, 23:34
Интересующийся
Отправить личное сообщение для MrBoriska Посмотреть профиль Найти все сообщения от MrBoriska
 
Регистрация: 25.12.2013
Сообщений: 12

Сообщение от danik.js Посмотреть сообщение
Научишь использовать ajax без js?
Нелепо придираться к словам, там было пропущено слово "чистом". Я имею ввиду, что без отправки данных в php и взятия их от туда с помощью js, да.
Ответить с цитированием
  #5 (permalink)  
Старый 25.12.2013, 23:38
Интересующийся
Отправить личное сообщение для MrBoriska Посмотреть профиль Найти все сообщения от MrBoriska
 
Регистрация: 25.12.2013
Сообщений: 12

Сообщение от рони Посмотреть сообщение
MrBoriska,
где элементы из 11 строки? и в jquery есть .val()
извиняюсь, забыл прикрепить в html еще и форму с текстом, ну там понятно что она есть)).
Ошибка где то ниже, с проверкой на то, что элемент массива равен какому-нибудь элементу из массива слов исключений.

Спасибо за .val(), я еще не знаю всех функций.
Ответить с цитированием
  #6 (permalink)  
Старый 26.12.2013, 14:31
Интересующийся
Отправить личное сообщение для finestra Посмотреть профиль Найти все сообщения от finestra
 
Регистрация: 28.02.2013
Сообщений: 13

в строке 30 - (DeleteWord = true) - всегда возвращает труэ
и в строке 35 - (DeleteWord = false) - всегда фалсэ
обычно так не делают
условие в строке 35 никогда не выполнится
Ответить с цитированием
  #7 (permalink)  
Старый 26.12.2013, 14:37
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,068

Сообщение от finestra
условие в строке 35 никогда не выполнится
почему?
Ответить с цитированием
  #8 (permalink)  
Старый 26.12.2013, 14:52
Интересующийся
Отправить личное сообщение для finestra Посмотреть профиль Найти все сообщения от finestra
 
Регистрация: 28.02.2013
Сообщений: 13

Сообщение от MrBoriska Посмотреть сообщение
if ((currentWord.length >= minLengthKeyword) && (DeleteWord = false)) {
может имелось в виду if ((currentWord.length >= minLengthKeyword) && (DeleteWord === false)) {
Ответить с цитированием
  #9 (permalink)  
Старый 26.12.2013, 15:19
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,068

finestra,
ок
Ответить с цитированием
  #10 (permalink)  
Старый 26.12.2013, 17:21
Интересующийся
Отправить личное сообщение для MrBoriska Посмотреть профиль Найти все сообщения от MrBoriska
 
Регистрация: 25.12.2013
Сообщений: 12

Спасибо за найденные ошибки) Я еще не очень вник в типы данных, поэтому не знал что проверки нужно делать на тождественности.

Вот исправленный код, который начал выводить теги, как и раньше. Но цикл 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;
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[FF+GM] Проверьте пжл. скрипт(не могу найти ошибку) Benos Firefox/Mozilla 4 30.03.2013 17:46
Не могу найти ошибку nemo4430 Общие вопросы Javascript 6 26.11.2012 23:33
не могу найти ошибку в коде MasterP Общие вопросы Javascript 1 03.07.2011 02:54
Не могу найти ошибку. Hellp jey7 Events/DOM/Window 2 20.06.2010 10:49
Не могу найти ошибку Lewik AJAX и COMET 4 19.07.2009 21:33