Javascript: как мне найти определенный класс и добавить SPAN с нумерованным идентификатором к каждому слову?
Я пытаюсь использовать простой (без jQuery, mootools и т. д.) JavaScript для добавления тегов span с нумерованными идентификаторами к каждому слову в определенном классе.
Например:
<p class="read-aloud">
Here's a test.
</p>
Станет
<p class="read-aloud">
<span id="word001">Here's</span> <span id="word002">a</span> <span id="word003">test.</span>
</p>`
Пунктуация должна быть включена, но не кавычки.
У меня есть это (которое я изменил из другого поста):
function add-readAloud-uIDs(matchClass)
{
var elems = document.getElementsByTagName('*'),i;
for (i in elems)
{
if((" "+elems[i].className+" ").indexOf(" "+matchClass+" ") > -1)
{
elems[i].innerHTML.replace(/b([A-Za-z][a-z]*?-?’?'?[a-z]*?.?,?!???)([ | ”])("?)/g, '<span id="word">$1</span>$2$3');
}
}
}
window.onload = function ()
{
add-readAloud-uIDs("read-aloud");
}
Также в jsfiddle
У меня возникли проблемы с поиском способа увеличения идентификаторов.
Кроме того, причина, по которой я не хочу использовать библиотеку js, заключается в том, что она будет работать на iPad. Важна производительность, а также гибкость в использовании любой библиотеки для других целей, необходимых без конфликтов.
2 ответов:
Вы можете использовать пользовательскую функцию замены следующим образом:
var items = document.getElementsByClassName('readAloud'); var idCntr = 1, item; for (var i = 0; i < items.length; i++) { item = items[i]; item.innerHTML = item.innerHTML.replace(/[^\s]+/g, function(match) { return('<span id="word' + idCntr++ + '">' + match + '</span>'); }); }Демонстрация: http://jsfiddle.net/jfriend00/5v54f/
Для определения слова я выбрал любую последовательность символов, которая не содержит пробелов, но вы, очевидно, можете настроить регулярное выражение по своему вкусу.
Я думаю, что основная идея будет заключаться в использовании regexp replace с функцией. Небольшой пример ниже, надеюсь, может быть отправной точкой:
var text = "Here's a test"; var rx = /\b[\w']+\b/g; var fn = function(str) { fn.wordCount += 1; return '<span id="word' + fn.wordCount + '">' + str + '</span>'; } fn.wordCount = 0; result = text.replace(rx, fn); // result has '<span id="word1">Here's</span> <span id="word2">a</span> <span id="word3">test</span>'Вам нужно будет изменить регулярное выражение, чтобы оно соответствовало словам, возможно, в наборе
Функция замены использует что-то вроде статической переменной[\w']будет больше символов, которым вы захотите соответствовать.wordCount, чтобы отслеживать, сколько замен произошло, и использовать ее в качестве идентификатора в промежутке.Каждый вызов для замены текста будет нужно установить
fn.wordCount = 0;
Comments