2015-09-10 3 views
0

Есть много вопросов по этой теме на SO, но я не могу найти решения для своей проблемы, поэтому я решил задать свой вопрос. Моя ситуация: у меня есть раскрывающийся список с несколькими опциями и текстовое поле внутри iframe. Когда пользователь выбирает какой-либо текст в текстовом поле и выбирает один из раскрывающегося списка, тогда выделенный текст будет содержать обертку тега a, а значение параметра станет тегом href. Вот мой код:Выберите текст и добавьте к нему тег

var optionTag  = document.getElementById("option-id"); 
    var optionValue  = optionTag.options[optionTag.selectedIndex].value; 
    var iframe   = document.getElementById("my-frame"); 
    var iframeContent = iframe.contentDocument.body.innerHTML.split("<br>")[0]; 

    //get user selected text 
    var iframeSelection = iframe.contentWindow.getSelection().toString(); 

    // and wrap a tag around it then add href equal to value of option 
    var aTag  = "<a href=\"" + optionValue + "\">" + iframeSelection +"</a>"; 

    // replace user selected text with new a tag 
    iframe.contentDocument.body.innerHTML = iframeContent.replace(iframeSelection,aTag) 

Этот код работы но только заменить первое слово, если это слово уже существует. Например:

lorem ipsum click dolor sit amet click spum 

Если пользователь выбирает второе слово «нажмите» и выберите один из вариантов, то мой код будет заменить только первое слово «нажмите», и если у меня есть несколько слов «нажмите» это еще только заменить первое слово, но если пользователь выбирает слово «ipsum» или «lorem», тогда он работает нормально. Я не знаю, как это исправить, пожалуйста, помогите. Спасибо!

p/s: Я не хочу заменять все слова «щелчок», я хочу только выбрать точный элемент.

+3

Не могли бы вы также разместить HTML-код, мне трудно понять этот вопрос. –

+1

Не могли бы вы добавить HTML и, еще лучше, настроить скрипку? – sinisake

+0

Прошу прощения. Я не могу получить доступ к HTML-коду. Например, у меня есть 10 слов «щелчок», и я хочу вручную выбрать каждый из них, а затем выбрать один вариант из раскрывающегося списка, а значение из моей опции станет атрибутом href. Но если я случайно выбираю одно слово «щелчок» и выбираю один optioin, тогда он только завершает первый «щелчок», который появляется в моем абзаце, и добавляет тег плюс href к этому первому слову, а не мое текущее выбранное слово. Извините, мой английский не очень хорошо. –

ответ

0

Проблема в том, что Javascript String.replace() работает только так, как вы ожидаете, когда используете его с шаблоном RegExp с установленным глобальным флагом. К счастью, this answer имеет хорошее решение.

Изменить это:

iframe.contentDocument.body.innerHTML = iframeContent.replace(iframeSelection,aTag); 

... в этом:

iframe.contentDocument.body.innerHTML = iframeContent.replace(new RegExp(iframeSelection, 'g'), aTag); 

Что она делает это, что он преобразует строку поиска в объект RegExp с глобальным флагом, поэтому каждое вхождение заменяется.

Если было сделано только для того, чтобы заменить только то, что выбрал пользователь, он становится более сложным, но вы можете найти все необходимые бит от this answer.

+0

Да, я хочу заменить только то, что выбрал пользователь. Пожалуйста, помогите: ( –

+0

@Vk.Я добавил еще одну ссылку на ответ, в котором есть то, что вы ищете – Schlaus

+0

Большое спасибо, я попробую это, как только я получу свой рабочий компьютер и дам вам знать: D еще раз спасибо @Schlaus –

1

Проблема заключается в том, что iframeSelection в вашем вызове replace() является «щелчком», а не выбранным вами элементом, поэтому он заменяет первое появление.

Вместо этого попробуйте получить диапазон выбора, удалив его и добавив новый элемент в этот диапазон.

var selection = iframe.contentWindow.getSelection(); 
range = selection.getRangeAt(0); 
range.deleteContents(); 
range.insertNode(document.createElement(your_new_element)); 

Я не смог протестировать без вашего HTML, JSFiddle поможет.

+0

Я постараюсь это завтра и дайте знать, большое спасибо @Drown: D –