|
|
|
|
|
для: 12345
(23.01.2007 в 22:53)
| | Поэтому надо пробежаться, заменить ноды на теги, потом спрашивать парент.
Хм... вот похоже то, что мне надо. Мог бы и сам додуматься =(
А так. пасиба)) | |
|
|
|
|
|
|
|
для: RMW
(23.01.2007 в 23:36)
| | Это специально, чтоб дольше работало? :) Как раз 2 вещи, которые надо избегать при критически тяжёлых скриптах: рекурсии и with. И для не-ИЕ надо исключать пробельные ноды, для совместимости, и для задачи они ни к чему. | |
|
|
|
|
|
|
|
для: 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>
|
| |
|
|
|
|
|
|
|
для: 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 | |
|
|
|
|
|
|
|
для: Igorek
(23.01.2007 в 18:53)
| | вы заблуждаетесь. какраз для text3 (как и для text1<b>text2</b>) узел это <span></span>, а запись </b>text3</span> язык не поворачивается узлом назвать. | |
|
|
|
|
|
|
|
для: 12345
(23.01.2007 в 15:02)
| | эт не то что нужно...(
получить парента эт не проблема. вот например:
<span>text1<b>text2</b>text3</span>
вот если курсор находится в позиции между закрывающим тегом b и закрывающим тегом span, то мне надо получить не парента(<span>), а именно этот текстовый узел, у которого nodeValue=="text3" | |
|
|
|
|
|
|
|
для: 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>
|
| |
|
|
|
|
|
|
|
для: 12345
(22.01.2007 в 20:17)
| | причем здесь moveToPoint()? не могу понять. зачем перемещать выделение? | |
|
|
|
|
|
|
|
для: Igorek
(21.01.2007 в 21:16)
| | moveToPoint( ) - ставит TextRange, который сделали на документе, в точку, которую указали. Указываем координату выделения, взятую через TextRange, построенный на селекции (boundingLeft). Для Gecko аналог - вероятно, только event.target, когда выделяют selection . | |
|
|
|
|