Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

HTML+CSS+JavaScript

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: получение узла(node) по позиции курсора в IE
 
 автор: Igorek   (21.01.2007 в 21:16)   письмо автору
 
 

заблудился я в поиске нормального решения этой проблемы =)
вполне возможно, что мою проблему решит ответ на вопрос менее глобальный - как реализовать метод moveToNodeText(на подобие метода moveToElementText, только выделение охватывает не элемент, а узел, в том числе текстовый)

   
 
 автор: Igorek   (22.01.2007 в 18:25)   письмо автору
 
   для: Igorek   (21.01.2007 в 21:16)
 

может я слишком мудрено сказал? так я поясню...
неужели никто не поможет дельным советом?

   
 
 автор: Lelik   (22.01.2007 в 18:27)   письмо автору
 
   для: Igorek   (22.01.2007 в 18:25)
 

подробней расскажи ситуацию

   
 
 автор: 12345   (22.01.2007 в 20:17)   письмо автору
 
   для: Igorek   (21.01.2007 в 21:16)
 

moveToPoint( ) - ставит TextRange, который сделали на документе, в точку, которую указали. Указываем координату выделения, взятую через TextRange, построенный на селекции (boundingLeft). Для Gecko аналог - вероятно, только event.target, когда выделяют selection .

   
 
 автор: Igorek   (22.01.2007 в 23:27)   письмо автору
 
   для: 12345   (22.01.2007 в 20:17)
 

причем здесь moveToPoint()? не могу понять. зачем перемещать выделение?

   
 
 автор: 12345   (23.01.2007 в 15:02)   письмо автору
 
   для: Igorek   (22.01.2007 в 23:27)
 

Не выделение, а TextRange, чтобы найти обрамляющий узел. В 2 действия: сначала находим

d=document
tRS=d.selection.createRange()
tRSx=tRS.boundingLeft
...
//потом
tR=d.createTextRange( )
tR.moveToPoint(tRSx,tRSy) //точка начала выделения.
//Впрочем, это то же, что и tRS.collapse(). Затем
tRS.collapse().parentElement()


Итого,
<script>
ff=function(){d=document;tRS=d.selection.createRange()
tRS.collapse()
o=tRS.parentElement()
alert(o.tagName)
}
</script>

<b>abcde <sub>fghij</sub></b><br>
<a href=# onclick=ff();return!1>показать обрамляющий элемент</a>

   
 
 автор: Igorek   (23.01.2007 в 18:53)   письмо автору
 
   для: 12345   (23.01.2007 в 15:02)
 

эт не то что нужно...(
получить парента эт не проблема. вот например:
<span>text1<b>text2</b>text3</span>
вот если курсор находится в позиции между закрывающим тегом b и закрывающим тегом span, то мне надо получить не парента(<span>), а именно этот текстовый узел, у которого nodeValue=="text3"

   
 
 автор: AlexSol   (23.01.2007 в 19:10)   письмо автору
 
   для: Igorek   (23.01.2007 в 18:53)
 

вы заблуждаетесь. какраз для text3 (как и для text1<b>text2</b>) узел это <span></span>, а запись </b>text3</span> язык не поворачивается узлом назвать.

   
 
 автор: Igorek   (23.01.2007 в 19:53)   письмо автору
 
   для: AlexSol   (23.01.2007 в 19:10)
 

<html>
<head>
<script language="javascript">
window.onload = function(){
  var sp = document.getElementById("spn");
  var t = document.getElementById("txt");
  for (var n=sp.firstChild; n; n=n.nextSibling){
    if (n.nodeType==1) txt.value+=n.nodeName + "\t" + n.innerHTML+"\n";
    if (n.nodeType==3) txt.value+=n.nodeName + "\t" + n.nodeValue+"\n";
  }
}
</script>
</head>

<body>
<span id="spn">
text1
<b>text2</b>
text3
</span>

<textarea id="txt" rows=5></textarea>
</body>
</html>



так вот: грубо говоря, если курсор находится в "text3", то мне надо document.getElementById("spn").lastChild

   
 
 автор: 12345   (23.01.2007 в 22:53)   письмо автору
 
   для: Igorek   (23.01.2007 в 19:53)
 

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

   
 
 автор: Igorek   (24.01.2007 в 15:35)   письмо автору
 
   для: 12345   (23.01.2007 в 22:53)
 

Поэтому надо пробежаться, заменить ноды на теги, потом спрашивать парент.
Хм... вот похоже то, что мне надо. Мог бы и сам додуматься =(
А так. пасиба))

   
 
 автор: RMW   (23.01.2007 в 23:36)   письмо автору
 
   для: Igorek   (23.01.2007 в 19:53)
 

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

<script>
var getTextNodes = function(obj)
{
  var a = [];
  var root = obj;
  var recurs = function(obj)
  {
    with(obj)
    {
      if(nodeType == 3)a.push(obj);
      if(firstChild)recurs(firstChild); 
      if(nextSibling && obj!=root)recurs(nextSibling);
    }
  }
  recurs(obj); 
  return a;
}

onload = function()
{
  var a = getTextNodes(document.getElementById('spn'));
  alert(a);
}
</script>

<span id="spn"> 
text1 
<b>text2</b> 
text3 
</span>

   
 
 автор: 12345   (24.01.2007 в 01:47)   письмо автору
 
   для: RMW   (23.01.2007 в 23:36)
 

Это специально, чтоб дольше работало? :) Как раз 2 вещи, которые надо избегать при критически тяжёлых скриптах: рекурсии и with. И для не-ИЕ надо исключать пробельные ноды, для совместимости, и для задачи они ни к чему.

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования