2009-12-03 2 views
1

Мне нужен способ просмотреть весь текст на моей странице, включая ссылки и другие элементы управления, и найти слова, которые находятся в определенном списке, и добавить к ним объект html-символа 10 (™). Мне тоже нужно быть быстрым. Список хранится в массиве javascript. У меня уже есть код с использованием .each, чтобы найти все ссылки на странице с текстом из этого списка, но он заметно медленный, и мне это не нравится.Добавить TM в текст с помощью jQuery?

Любые лучшие, более эффективные способы сделать это?

EDIT

Люди предполагают другие альтернативы (на стороне сервера, CSS и т.д.) Мы не можем использовать те, потому что эти слова в URL, по всему сайту. Мы будем испортить наш URL по всему сайту. Мы используем DotNetNuke для этого, и клиент просто сказал нам сегодня, что каждый раз, когда их продукты появляются на всем сайте (включая ссылки), они хотят, чтобы они были во всех кешках и добавили ТМ. Если мы изменим продукты в базе данных, все ссылки внезапно добавят «торговую» к концу. Характер DNN говорит, что мы не можем делать это на стороне сервера. Мы могли бы просмотреть и вручную изменить его на каждой странице ... но на сайте более 1900 страниц ... SO! Сторона клиента - это маршрут, по которому мы хотим идти.

+0

почему бы вам не сделать это на стороне сервера? –

+0

Серверная сторона не является вариантом. У нас нет доступа. Предположим, что jQuery - единственный способ сделать это и сообщить мне об этом быстрее. –

+0

ПРИМЕЧАНИЕ: если кто-то (скажем, ваш клиент) посещает сайт с отключенным JavaScript ... вам все еще не повезло – luckykind

ответ

1

Найдите/замените регулярное выражение. Теоретически это должно быть быстрее, чем метод marcgg, поскольку вы касаетесь DOM только один раз.

var wordList = ["jQuery UI", "jQuery", "is"]; 
var regExp = new RegExp("\\b" + wordList.join("\\b|\\b") + "\\b", "g"); 
var $elem = $("#divWithText"); 
console.log(regExp); 
$elem.html($elem.html().replace(regExp, "$&™")); 

Оговорка:

  1. Это также нюк любых сценариев, которые могут быть внутри DIV, так как элементы сценария повторно не разобраны.
  2. То же самое относится к любому тегу html, который соответствует вашему регулярному выражению.
+0

Как я могу применить массив к этому? Нужно ли мне перебирать массив и прикоснуться к DOM для каждого слова в списке? –

+0

И не могли бы вы объяснить это немного больше для тех из нас, которые вообще не знают Regex? Это поиск слов «jQuery UI», «jQuery» и «есть» или он ищет «jQuery UI jQuery is?»? –

+0

Он ищет либо: jQuery "," jQuery UI "или" is ". Динамически можно построить динамическое выражение со списком. –

3

Сделайте это на стороне сервера, всегда самый быстрый - и самый надежный.

+0

+1 Если вам важно показать, что какой-либо текст является зарегистрированным товарным знаком по юридическим причинам, то вы «Я хочу быть уверенным, что люди не просто отключают javascript и избегают уведомления о товарных знаках. Также ошибка javascript может помешать обнаружению товарного знака в некоторых браузерах. –

+0

Я понимаю, что серверная сторона - лучший способ. На стороне сервера здесь невозможно. –

4

Вы могли бы сделать что-то подобное:

$body = jQuery("body"); 
var words= ["blah", "blog", "blig"]; 
for(var i=0; i< words.size; i++){ 
    $body.replace(words[i],words[i]+"&trade"); 
} 

редактировать: с помощью «для» петли вместо Еогеасп или .each будет немного увеличить время рендеринга, как описано в this google tech talk.

НО Я бы этого не сделал и попробовал серверное решение.

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

+0

Это не работает. Я не получаю никаких изменений. на мою страницу, когда я заменил ваш список слов моим. –

+0

Возможно, вы захотите учитывать структуру пробелов/предложений вокруг слов. В противном случае вы можете закончить, как многие низкопрофессиональные проверки, которые не учитывают слова типа «класс». –

+0

Вам нужно немного подкорректировать код, я его не тестировал. Проверьте наличие ошибок JS. – marcgg

1

Вы также можете использовать CSS, хотя вы должны обернуть каждое вхождение имени в HTML-тег:

.tm:after { 
    /* HTML entities don't work here but unicode entities like \udo */ 
    content: "™"; 
} 

Lorem ipsum <span class="tm">The Company</span> etc etc 

Преимущество быть вы можете легко изменить стили, цвета и т.д.

+1

это не работает перекрестный браузер ... – marcgg

+0

Правда, но я думал, что выброшу его там. «Добавить ТМ в текст с помощью jQuery» является довольно произвольным в первую очередь. – DisgruntledGoat

0

Я не знаю .NET, но должно быть возможно как-то сделать это на стороне клиента без необходимости возиться с самой картой. Решение на стороне клиента звучит очень плохо для моих ушей.

В PHP вы можете хранить выходной буфер и выполнять операции над ним до его очистки. Должно быть что-то подобное. Операция Regex или DOM, которая заменяет все содержимое вне тегов (и, возможно, внутри атрибутов alt), должно работать быстро и чисто.

В дополнение к тому, что уже было написано еще две отрицательные стороны в подходе JS приходят на ум:

  • Названия продуктов индексируется в поисковых системах без ДЧ.
  • <title> тег должен быть изменен, а
Смежные вопросы