Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Замена слова посредством Java-script (https://javascript.ru/forum/misc/2946-zamena-slova-posredstvom-java-script.html)

x-yuri 27.06.2009 18:20

Цитата:

Подскажите, а как заменить строку <font tmp color=red> во всём тексте?
зачем? Откуда берется текст, который нужно заменить?

Цитата:

Нужно взять из него значение и искать его на всей странице, а потом заменить на другое
опять же зачем это нужно?

300 27.06.2009 20:07

Это нужно для поиска и выделения найденных слов. Я написал такой код:

function reset()
{
 for (i=1; i<ta.length; i++)
  {
   ta[i].style.display = ''
  }
 afe = tbl.getElementsByTagName("font")
 if (afe.length != 0)
  {
   for (i=0; i<(afe.length); i++)
       if (afe[0].tmp == "yes") {afe[0].outerHTML = afe[0].innerHTML}
  }
}

 function find()
{
 reset()
 for (i=1; i<ta.length; i++)
  {
   txt = ta[i].innerText.toLowerCase()
   findstr = fnd.value.toLowerCase()
   if (txt.lastIndexOf(findstr) == -1) {ta[i].style.display = 'none'}
  }
 REstr = new RegExp(findstr,"gi")
 tbl.innerHTML = tbl.innerHTML.replace(REstr, '<font style="background-color:white; font-size:30" tmp="yes">' + findstr + '</font>')
}


Но почему-то не работает. Текст для поиска берётся из поля формы. Имя поля - fnd. tbl - это id таблицы. Смысл такой: если в данной строке есть это слово, то оно выделяется, т.е. происходит замена слова на слово с тегами. А если нет - строка скрывается.
Функция reset сбрасывает всё. При замене я вставил параметр tmp в тег font, чтобы по нему определять, какие теги font удалять при сбросе. Сброс сначала ищет все теги font в таблице, а потом удаляет те, у которые tmp=yes.

Но код почему-то не работает. Поправьте, кто знает.

x-yuri 27.06.2009 21:20

1) нету innerText, outerHTML в ff
2) не используй глобальные переменные
3) если создаешь regexp с помощью конструктора - добавляй ограничители (/)
4) при подстановке пользовательских данных в regexp их нужно экранировать
5) я бы не рискнул к таблице innerHTML применять. Лучше к ячейкам. Возможно лучше будет даже пройтись по всем текстовым нодам (смотри скорее с конца). Еще можешь почитать http://webew.ru/articles/598.webew

300 28.06.2009 16:10

1) нету innerText, outerHTML в ff
2) не используй глобальные переменные
3) если создаешь regexp с помощью конструктора - добавляй ограничители (/)
4) при подстановке пользовательских данных в regexp их нужно экранировать
5) я бы не рискнул к таблице innerHTML применять. Лучше к ячейкам. Возможно лучше будет даже пройтись по всем текстовым нодам (смотри скорее с конца). Еще можешь почитать http://webew.ru/articles/598.webew

1) Я работаю в IE. А что же аналогичное для пользователей ff?
3) Так, что ли:
REstr = new RegExp(/findstr/,"gi")
? Так не работает.
5) Спасибо, это сработало!

Riim 28.06.2009 16:24

Цитата:

Сообщение от 300
Я работаю в IE. А что же аналогичное для пользователей ff?

innerHTML

На счет "добавляй ограничители (/)" я тоже не понял.

Kolyaj 29.06.2009 12:23

Цитата:

Сообщение от 300
Я работаю в IE.

А скрипт только для себя пишете? Если нужен только текст, обычно берут innerHTML и удаляют из него теги.

Цитата:

Сообщение от Riim
На счет "добавляй ограничители (/)" я тоже не понял.

С PHP попутал наверно.

x-yuri 30.06.2009 13:48

Цитата:

А что же аналогичное для пользователей ff?
replaceChild (по поводу outerHTML)

Цитата:

С PHP попутал наверно
именно :)

Moor 01.03.2010 00:47

Други, помогите, пожалуйста, ибо я совсем не спец в JS.
На основе найденного здесь примера решил сделать скрипт, уменьшающий надписи на странице. Подгружаю как внешний скрипт, однако не работает. Что неверно в коде?
window.onload=function(){
document.body.innerHTML = document.body.innerHTML.replace(' 000 руб', '<small> 000 руб</small>');
}
Чую, что скорее всего дело в пробелах, однако выразить не могу (С) :)

bioz00 26.07.2010 00:14

Подскажите пожалуйста, как это скрипт заставить работать без учета регистра?

Цитата:

Сообщение от Gvozd (Сообщение 13860)
window.onload=function(){
all_elements=document.getElementsByTagName('*');
for(i=0,s=all_elements.length;i<s;i++)
	if(all_elements[i].tagName!="SCRIPT")
		for(j=0,s_=all_elements[i].childNodes.length;j<s_;j++)
			if(all_elements[i].childNodes[j].nodeType==3)
				all_elements[i].childNodes[j].textContent=all_elements[i].childNodes[j].textContent.replace(/AzriMan/g, 'AndryMan');
}


и еще, как по-грамотному переделать этот код для замены целого ряда слов, где каждое отдельное слово заменяется определенным значением?

рони 26.07.2010 01:39

Цитата:

Сообщение от Gvozd
textContent

наверно лучше использовать data вместо textContent Internet Explorer затыкаеться на textContent.
тогда скрипт для замены целого ряда слов будет примерно так выглядеть
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">

<head>
<meta http-equiv="content-type" content="text/html; charset=windows-1251" />
  <title></title>
<script language="JavaScript" type="text/javascript">
function repl(a) {
    var b = {
        "111": "\u0437\u0430\u043c\u0435\u043d\u0430",
        "222": "\u043f\u0440\u043e\u0448\u043b\u0430",
        "333": "\u0443\u0441\u043f\u0435\u0448\u043d\u043e",
        "4": "!"
    };
    for (var c in b) {
        var d = RegExp(c, "gim");
        a = a.replace(d, b[c])
    }
    return a
};

window.onload = function () {
    all_elements = document.getElementsByTagName("*");
    i = 0;
    for (s = all_elements.length; i < s; i++) if (all_elements[i].tagName != "SCRIPT") {
        j = 0;
        for (s_ = all_elements[i].childNodes.length; j < s_; j++)
        if (all_elements[i].childNodes[j].nodeType == 3)
        all_elements[i].childNodes[j].data = repl(all_elements[i].childNodes[j].data)
    }
};
</script>
</head>
<body>
 <font color="#FF0000">111  222 333 444</font>
</body>
</html>


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