13.03.2009, 22:36
|
|
Замена слов в тексте
Приветствую,
два дня бьюсь - не могу решить такую задачу:
Есть список слов:
kayword1,keyword2,keyword3
как по окончанию загрузки страницы - заменить в ней все слова из списка(первые N раз) на super_keyword1,super_keyword2 и super_keyword3 соответственно.
Вожусь с var.replace и регулярками,но
основные проблемы две - как заменять слова только в тексте,а не в тегах, т.к. иногда слово display попадается в том же css и такая замена полностью рушит структуру страницы
и как почему-то при замене страничка моргает(хотя может ето именно следствие нарушения ее структуры из-за замены в тегах)
Если кто-то сталкивался с подобной задачей - подскажите плз решением.
Спасибо
|
|
13.03.2009, 23:19
|
|
Интересующийся
|
|
Регистрация: 11.03.2009
Сообщений: 27
|
|
|
|
13.03.2009, 23:21
|
|
Матрос
|
|
Регистрация: 04.04.2008
Сообщений: 6,246
|
|
юзайте поиск получше, прежде чем плодить темы
внизу вашей темы есть список "Похожие темы"
там есть эта тема
там мною выложен код, и в него даже можно добавлять теги-исключения.
и он не заставляет страницу мигать
|
|
14.03.2009, 00:01
|
|
Конечно читал Перед тем как написать довольно долго искал ответ в сети....
При помощи решения, казанного в данном топике (именно вариант через DOM) у меня не получается заменить keyword1 на <b>keyword1</b> или на <a href="">keyword1</a>
т.е. замена происходит так, что теги считаются как текст. И попросту выделить определенный слова жирным не получается :-(
Если подскажете как оптимизировать то решение под эти нужды - было бы здорово.
Спасибо!
|
|
14.03.2009, 01:06
|
|
Матрос
|
|
Регистрация: 04.04.2008
Сообщений: 6,246
|
|
вот намучил кажется:
function replace_all(str1,str2)
{
regexp=new RegExp(str1,"g")
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)
{
if(regexp.test(all_elements[i].childNodes[j].textContent))
{
all_text=all_elements[i].childNodes[j].textContent
text=all_text.substr(0,all_text.indexOf(str1))
left=document.createTextNode(text)
//оборачиваем найденный текст внутрь тега <B>
middle=document.createElement('b');//ТУТ ставится тег в который мы хотим обернуть.
//text=all_text.substr(all_text.indexOf(str1),str1.length)
middle.appendChild(document.createTextNode(str2))
//-------------------------------------------------------------------------------------------
text=all_text.substring(all_text.indexOf(str1)+str1.length,all_text.length)
right=document.createTextNode(text)
all_elements[i].childNodes[j].textContent=""
all_elements[i].insertBefore(left,all_elements[i].childNodes[j])
all_elements[i].insertBefore(middle,all_elements[i].childNodes[j])
all_elements[i].insertBefore(right,all_elements[i].childNodes[j])
}
}
}
window.onload=function(){
replace_all("AzriMan"," AndryMan ");
}
HTML для тестирования
<html>
<head>
</head>
<body>
qwe<br/>
azriMan<br/>
qwe<br/>
<table border="1">
<tr>
<td>a_AzriMan_x</td><td>AzriMa_n</td>
</tr>
<tr>
<td>AzriM_an</td><td>AzriMa_n</td>
</tr>
</table>b_AzriMan_y<br/>
</body>
</html>
единственный минус, если в пределах одной текстовой ноды несколько совпадений, обрабатывается только первое.
сейчас впадлу переписывать.постарайтесь сами сделать это(например можно в цикл обернуть)
альтернативное, более простое, решение задачи-изменение innerHTML вышестоящего элемента.но при этом страница будет "скакать"
скрипт оформлен подж оборачивание в <b>
|
|
14.03.2009, 01:09
|
|
Матрос
|
|
Регистрация: 04.04.2008
Сообщений: 6,246
|
|
Блин.
пришло еще одно решение попроще и поуниверсальней.
генерим временный элемент.
его innerHTML элементарными текстовыми заменами заменами присваиваем все что надо.
затем чистим исходный текстовый нод в документе, и преед ним по очереди аттачим ноды временного элемента.
короче, я сказал несоклько вараинтов и код.пробуйте, творите дальше
|
|
18.03.2009, 11:31
|
|
pri ispolzovanii koda na bolshih stranicah proishodit peremeshivanija teksta:-(
k primeru pri zamene slova "objects" fraza:
In addition to the built-in JavaScript objects, you can also access and manipulate all of the HTML DOM objects with JavaScript.
prevrashaetsa v:
, you can also access and manipulate all of the HTML DOM objects with JavaScript. objects In addition to the built-in JavaScript
i tak dalee :-( inogda eto voobshe srezaet 4ast predlogenija:-(
N strani4kah s o4en prostoj strukturoj - kod rabotaet, a esli eto obi4naja stranica - to ne rabotaet :-(
Proboval na etoj styranice:
http://www.w3schools.com/js/js_obj_htmldom.asp
Prosto sohranil ee na HDD, vstavil script zameni i zapustil v browsere.
dva dnja igralsja - tak i ne smog po4enit :-( moget podskagete kak popravit kod, 4to b on otrabatival korrektno? (moi znanija DOM ne nastolko silni)
spasibo bolshoe!
PS: prostite za translit - net russkoj klaviaturi sej4as:-(
|
|
18.03.2009, 12:21
|
|
Матрос
|
|
Регистрация: 04.04.2008
Сообщений: 6,246
|
|
http://translit.ru вам в помощь.
Сообщение от Dan T
|
при исползовании кода на больших страницах происходит перемешивания текста:-(
к примеру при замене слова "objects" фраза:
In addition to the built-in JavaScript objects, you can also access and manipulate all of the HTML DOM objects with JavaScript.
превращается в:
, you can also access and manipulate all of the HTML DOM objects with JavaScript. objects In addition to the built-in JavaScript
и так далее :-( иногда ето вообше срезает часть предложения:-(
На страничках с очен простой структурой - код работает, а если ето обычная страница - то не работает :-(
Пробовал на етой странице:
http://www.w3schools.com/js/js_obj_htmldom.asp
Просто сохранил ее на HDD, вставил скрипт замены и запустил в браузере.
два дня игрался - так и не смог починить :-( может подскажете как поправить код, что б он отрабатывал корректно? (мои знания ДОМ не настолько силны)
спасибо большое!
ПС: простите за транслит - нет русской клавиатури сей4ас:-(
|
Последний раз редактировалось Gvozd, 18.03.2009 в 12:23.
|
|
18.03.2009, 12:36
|
|
Матрос
|
|
Регистрация: 04.04.2008
Сообщений: 6,246
|
|
я же говорил, что:
Сообщение от Gvozd
|
единственный минус, если в пределах одной текстовой ноды несколько совпадений, обрабатывается только первое.
|
на самом деле, у меня бащка ужде не варила, и я немного неугадал с глюком.но то что он будет я знал
Сообщение от Dan T
|
знания ДОМ не настолько силны)
|
у меня сильны можно подумать?
я сидел с кучей справок и матерился по поводу некросбраузерности некоторых DOM-методов, что весьма усложняло код
Сообщение от Dan T
|
может подскажете как поправить код, что б он отрабатывал корректно?
|
да.
берете текстовую ноду, и обрабатываете все вхождения подстроки.
лучше всего регекспами обработать, разбив строку на куски, и склеив обратно уже силами DOM. обрабатывать все вхождения, а не как я в первый раз халтурить.
в формате форума я вам помог.
дал ссылки.
дал совет
дал код(я редко это делаю.просто задача интересная была)
так, что если вы не хотите/не можете сделать это сами, то дальше я смогу только в формате раздела "работа" вам помочь
|
|
|
|