Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 13.03.2013, 13:17
Аспирант
Отправить личное сообщение для nule Посмотреть профиль Найти все сообщения от nule
 
Регистрация: 03.11.2011
Сообщений: 42

document.body.innerHTML.replace. Замена нескольких слов
Здравствуйте!
Задача - заменить несколько разных слов на странице.
Для одного слова использовал
document.body.innerHTML = document.body.innerHTML.replace(/Слово1/g, 'Замена1');

Но теперь возникла необходимость заменить также Слово2 на Замена2 и Слово3 на Замена3. Не хотелось бы писать китайский код. Как можно поизящней решить задачу?
Спасибо!
Ответить с цитированием
  #2 (permalink)  
Старый 13.03.2013, 13:28
Профессор
Отправить личное сообщение для tsigel Посмотреть профиль Найти все сообщения от tsigel
 
Регистрация: 12.12.2012
Сообщений: 1,398

var text
var a = ['слово1', 'слово2'...];
var b = ['замена1', 'замена2'...]; 
for (var i in a) {
text = text.replace(/a[i]/g, b[i]);
}
Ответить с цитированием
  #3 (permalink)  
Старый 13.03.2013, 13:54
Аватар для rgl
rgl rgl вне форума
Профессор
Отправить личное сообщение для rgl Посмотреть профиль Найти все сообщения от rgl
 
Регистрация: 28.02.2011
Сообщений: 349

Мой вариант может показаться сложнее, но думаю что на больших текстах он будет работать быстрее, т.к. по тексту будет проходить один раз:
var text
var a = ['слово1', 'слово2'...];
var b = ['замена1', 'замена2'...];
var allReplaces = {};
for( var i = 0; i < a.length; ++i )
  allReplaces[ a[i] ] = b[i];
text = text.replace( RegExp( a.join("|"), "g" ), function(x) { return allReplaces[x]; } );
Ответить с цитированием
  #4 (permalink)  
Старый 13.03.2013, 13:56
Аспирант
Отправить личное сообщение для nule Посмотреть профиль Найти все сообщения от nule
 
Регистрация: 03.11.2011
Сообщений: 42

tsigel, в этом случае заменяются буквы ai. Т.е. a[i] воспринимается как ai, а не как элемент массива
Ответить с цитированием
  #5 (permalink)  
Старый 13.03.2013, 14:00
Аватар для rgl
rgl rgl вне форума
Профессор
Отправить личное сообщение для rgl Посмотреть профиль Найти все сообщения от rgl
 
Регистрация: 28.02.2011
Сообщений: 349

tsigel,
в вашем примере пятая строка должна быть
text = text.replace( RegExp( a[i], "g" ), b[i]);
Ответить с цитированием
  #6 (permalink)  
Старый 13.03.2013, 14:13
без статуса
Отправить личное сообщение для Deff Посмотреть профиль Найти все сообщения от Deff
 
Регистрация: 25.05.2012
Сообщений: 8,219

Ксать все события, привязанные на элементы - теряем, если привязка не в самом теге
Ответить с цитированием
  #7 (permalink)  
Старый 13.03.2013, 14:58
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,068

nule,
Вариант...
<!DOCTYPE HTML>
<html>
<head>
 <meta charset="utf-8" />
  <script src="http://code.jquery.com/jquery-latest.js"></script>
  <script type="text/javascript">
$.fn.replaceText = function (e, f, g) {
       return this.each(function () {
           var a = this.firstChild,
               c, b, d = [];
           if (a) {
               do 3 === a.nodeType && (c = a.nodeValue, b = c.replace(e, f), b !== c && (!g && /</.test(b) ? ($(a).before(b), d.push(a)) : a.nodeValue = b));
               while (a = a.nextSibling)
           }
           d.length && $(d).remove()
       })
   };
$(window).load(function () {
$('a').click(function(e){ alert('test') });
var a = ['слово1', 'слово2'];
var b = ['замена1', 'замена2'];
for( var i = 0; i < a.length; i++ )
$("body *").replaceText(new RegExp( a[i], "g" ), b[i]);
    });
  </script>
<title></title>
</head>
<body>
<p><a href="#">слово1 test слово1</a></p>
<b><a href="#">слово2</a></b>
<p><a href="#">слово1</a></p>
<i><b><a href="#">слово2</a></b></i>
</body>
</html>
Ответить с цитированием
  #8 (permalink)  
Старый 13.03.2013, 15:28
Аспирант
Отправить личное сообщение для nule Посмотреть профиль Найти все сообщения от nule
 
Регистрация: 03.11.2011
Сообщений: 42

Всем спасибо! Использовал вариант tsigel с исправлением от rgl. Думаю, для моего случая вполне достаточно. Задача была поправить несколько криво переведенных слов в админке сайта. Так что ограничился самым простым вариантом.
Ответить с цитированием
  #9 (permalink)  
Старый 14.06.2014, 14:47
q21 q21 вне форума
Новичок на форуме
Отправить личное сообщение для q21 Посмотреть профиль Найти все сообщения от q21
 
Регистрация: 14.06.2014
Сообщений: 1

IMHO, когда замены всего 3, изящнее всего написать три раза и не наворачивать массивы и циклы, с тем же результатом.
Если речь об админке своего сайта - поменять слова собственно в файле локализации или в файле языкового оверрайда, если CMS это поддерживает. Ищи "language override".
Яваскрипт для этого использовать - как раз и есть китайский вариант.
Если же речь о систематической замене слов на чужих страницах в своём браузере - можно использовать аддон типа FoxReplace.
https://addons.mozilla.org/ru/firefox/addon/foxreplace

Последний раз редактировалось q21, 14.06.2014 в 14:50.
Ответить с цитированием
  #10 (permalink)  
Старый 11.03.2015, 15:35
Аспирант
Отправить личное сообщение для _Eldar_ Посмотреть профиль Найти все сообщения от _Eldar_
 
Регистрация: 22.02.2015
Сообщений: 74

рони , а если аяксом перегружается блок с текстом, то слова в тексте можно ли как-нибудь изменить?
Прочитал - Скрипт на JS не работает без перезагрузки страницы что вроде при аяксе подгружать функцию - которая будет удалять действие прошлых функций(по замене слов) на новую функцию, подскажите что и как делать

$.fn.replaceText = function (e, f, g)... как удалить функцию?

Последний раз редактировалось _Eldar_, 11.03.2015 в 16:44.
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Обрезание длинных слов RazZzeR Элементы интерфейса 15 14.03.2012 18:58
подсчёт не слов, букв Александр х@к Элементы интерфейса 8 29.08.2011 17:22
Подсчет количества слов в поле формы. Guranin Общие вопросы Javascript 7 10.08.2009 13:35
Замена слов в тексте Dan T Общие вопросы Javascript 8 18.03.2009 12:36
добавление окошка в скрипт подсчета слов Гость Общие вопросы Javascript 10 11.03.2008 17:07