Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   indexOf - недочеты в работе (https://javascript.ru/forum/events/14518-indexof-nedochety-v-rabote.html)

Fobius 19.01.2011 18:59

indexOf - недочеты в работе
 
Беру выделеный на странице текст
function getSelText() {
	var txt = "";
	if (window.getSelection) {
		txt = window.getSelection();
	} else if (document.getSelection) {
		txt = document.getSelection();
	} else if (document.selection) {
		txt = document.selection.createRange().text;
	}
	return txt;
    }

Далее собираю весь текст из нужного блока
function getText(n) {
		var strings = [];
		getStrings(n, strings);
		return strings.join("");
		function getStrings(n, strings) {
			if (n.nodeType == 3 )
			strings.push(n.data);
			else if (n.nodeType == 1 ) {
				for(var m = n.firstChild; m != null; m = m.nextSibling) {
					getStrings(m, strings);
				}
			}
		}
	}

Теперь надо узнать, находится ли выделеный текст в нужном мне блоке.
var text = getSelText();
			content = getText( document.getElementById("blockid") );
			if (content.indexOf( text ) != -1) {
                                  alert("OK");
	                }

Все работает нормально. Вот только если выделить текст с переводом строки, тут уже совпадение не получается.
Еще если в FF стоят подряд буква+,+ +буква то тоже совпадений не находит

Смысл происходящего я понимаю: в первом случяе в строке воспринимает перевод как пробел и перевод как \r
n, но решить проблему не придумал как. Второй случай для меня несколько загадочен.

Дайте пинок в нужную сторону пожалуйсто...

Amphiluke 19.01.2011 19:12

Цитата:

Сообщение от Fobius
надо узнать, находится ли выделеный текст в нужном мне блоке.

Вообще-то для FF есть свойство commonAncestorContainer, а для IE — метод parentElement().

Sweet 19.01.2011 19:57

Если немного пошаманить результатом getText(), то с переносами проблем не будет:
var string1 = 'ab\nc', string2 = 'abc';
alert(string1 == string2);
string1 = string1.replace(/[\f\r\n]/g, '');
alert(string1 == string2);

Fobius 20.01.2011 11:25

Попробовал добавить:
.replace(/[\f\r\n]/g, '');

Подействовало только в IE и Opera. В FF ничего не изменилось.
Подумал, решил на всякий случяй еще убрать <br />. Дописал:
.replace(/<\/?[^>]+>/gi, '');

Никакого результата.
Amphiluke,
Да способ может и не самый оптимальный, со временем всеравну буду еще 20 раз переделывать, но сама ситуация меня интересует, неразберусь - будут кошмары сниться))

Fobius 20.01.2011 11:30

У меня выводятся спецсимволы в entity encode, может это что мешает, хоть и мало вероятно.
И никак не могу найти закономерность ошибки в FF - комбинация "буква+пробел+буква" в некоторых местах не выдает совпаденя а в некоторых выдает, и пробелы везде обычные.


Часовой пояс GMT +3, время: 11:28.