Применение тега DIV / Span к слову по определенным координатам

Образец данных HTML


<body style="width:300px;">
<h3>Long-Text</h3>
A simple tool to store and display texts longer than a few lines.
The search button will highlight all the words matching the name of objects that are members of the classes listed in searchedClasses, itself a member of the KeySet class. The highlighted words are hypertext.
Edit invokes wscripts/acedb.editor, which by default launches emacs. Edit that file to start another editor in its place.
Save will recover from the emacs but will not destroy it.
Read will read a text file, so you could Search it.
**general** grep is a way to annotate a set of longtexts versus the searchedClasses. It outputs an ace file that you can then hand check and read back in acedb to create XREF from longTexts to genes etc.
<h3>World Wide NotePad</h3>
World wide notepad is a small text editor similar to Microsoft's notepad but has some more useful features like an auto typer to make typing the same sentence or word more easy, also World Wide NotePad has a text to speech feature which reads all text in the current open document and speaks it out load to you.
<h3>Etelka Wide Text Pro Bold Italic</h3>
</body>

Например -> «общий» (между **) находится при x = 0 и y = 465. Я знаю положение x, y. Но как выделить слово, находящееся в определенном месте?

Позвольте мне еще раз объяснить. Я хочу выделить слово по месту.

например, у меня есть значение местоположения (x, y) = (0,625). Я хочу извлечь первое слово в этом месте (предположим, в этом месте у нас есть слово "World"). Как же выделить это слово?

Изменить:
Здесь координата Y - это абсолютное положение всего HTML-документа.


person Sagar R. Kothari    schedule 04.08.2010    source источник
comment
Под выделением вы имеете в виду его выбор или хотите обернуть, например тег span?   -  person Felix Kling    schedule 04.08.2010
comment
Я хочу заключить в тег span - пример <span id='sfasfsdfsf'>World</span>   -  person Sagar R. Kothari    schedule 04.08.2010
comment
Надо было прочитать заголовок;)   -  person Felix Kling    schedule 04.08.2010
comment
Возможно, вы можете попытаться динамически сгенерировать регулярное выражение для выбора / сопоставления слова world (используя слова спереди и сзади) и применить дополнительный тег span с replace.   -  person airmanx86    schedule 04.08.2010


Ответы (1)


Единственный способ, который я могу придумать, - это заключить каждое слово в элемент span, а затем использовать < em> document.elementFromPoint (x, y), чтобы получить элемент span в заданном месте. Что-то вроде этого:

function highlightWordAtXY(x, y) {
    // Get the element containing the text
    var par = document.elementFromPoint(x, y),
        // textContent or innerText ?
        t = "textContent" in par ? "textContent" : "innerText",
        // Get the text of the element. No pun intended on the par[t].
        text = par[t],
        result;

    // Wrap a span around every word
    par.innerHTML = text.replace(/\b(\w+)\b/g, "<span>$1</span>");

    // Get the elementFromPoint again, should be a span this time
    result = document.elementFromPoint(x, y);

    // Check that we actually clicked on a word
    if (result == par)
        return false;

    // Wrap HTML text around the text at x, y
    result[t] = '<span class="highlight">' + result[t] + '</span>';

    // Restore the content with the wrapped text
    par.innerHTML = par[t];
}

Пример на http://jsfiddle.net/BSHYp/1/show/light/ - щелкните слово и посмотрите, как оно выделится.

Некоторые важные предостережения:

  • Каждый блок текста должен быть заключен в элемент (например, <p> или <div>). В любом случае вам следует заключать абзацы в теги <p>,
  • Элемент в указанном месте (x, y) должен содержать только текст, без дочерних HTML-элементов. Текстовые узлы с родственными элементами HTML будут удалены (например, если щелкнуть "Некоторые" или "здесь" в Some <b>text</b> here, будут удалены теги <b>). Разделение их на отдельные <span> элементы было бы единственным решением без построения гораздо более сложной процедуры,
  • IE выдаст «Неизвестную ошибку времени выполнения», если вы попытаетесь добавить элемент уровня блока в тег <p>,
  • На очень, очень, очень больших блоках текста вы можете столкнуться с проблемами производительности. Разбейте их там, где это возможно.
person Andy E    schedule 04.08.2010
comment
Вау :) отличный. Превосходно. Просто смотрю образец по ссылке. :) - person Sagar R. Kothari; 04.08.2010
comment
Превосходный ответ :) круто :) ваш разделение всего абзаца на небольшой кусок слов с тегами span и получение этого конкретного слова. Обалденная логика. :) Последний вопрос - на примере ur - он удаляет предыдущее выделение - что делать, чтобы его сохранить. ваше регулярное выражение и innerText полностью удаляет предыдущее выделение. - person Sagar R. Kothari; 06.08.2010
comment
на указанном вами образце ссылки - при обычных щелчках она удаляет предыдущие выделения. Но после нажатия на пустое место он позволяет выделить несколько моментов! :( @ #% - person Sagar R. Kothari; 06.08.2010
comment
@sugar: это снова переход на сложную территорию, потому что выделенные элементы становятся родственниками текстовых узлов. Один из вариантов - сохранить список координат в массиве и выполнить цикл по каждой из этих координат от строк result = document.elementFromPoint(x,y); до result[t] = .... Таким образом, вы поместите несколько слов в диапазон перед par.innerHTML = par[t];. - person Andy E; 06.08.2010
comment
@sugar: то, что вы пытаетесь достичь, является сложным :-) Я рад начать вас и помочь вам там, где вы застряли, но пример, который я написал, был задуман именно как пример. Вполне вероятно, что без особых настроек он будет далек от совершенства. - person Andy E; 06.08.2010
comment
разве это невозможно реализовать, заменив регулярное выражение для разделения слов на диапазон? - person Sagar R. Kothari; 06.08.2010
comment
аааа! эээ! оххх! :-( Я разработчик Objective-C. Мне сложно понять DOM, javascript и регулярное выражение. :-( В любом случае большое спасибо за вашу помощь #best Best Best #. Надеюсь, у меня была возможность проголосовать все больше и больше, чтобы проголосовать за вас еще раз. :-) - person Sagar R. Kothari; 06.08.2010