在Javascript中,我可以获得与标签混淆的文本的精确坐标(到处都是childNodes吗?)

时间:2009-04-25 01:12:11

标签: javascript dom text

请参阅下面的示例:它显示表格中的文本行(这是一个很好的理由,但这不是问题所在。)

基本上,我需要的是一个函数,当我点击链接时,警告()是文本选择的完美坐标。通过完美的坐标,我的意思是:选择开始的行号,选择结束的行号(这两个是微不足道的,我只是使用<td> id中的数字,开头的偏移量选择的结束,选择结束的偏移。

所以,如果我选择

  

第一行,它包含文字
  这是第二个

我收到一条提示:

  

选择从第1行开始,偏移12
  选择在第2行结束,偏移18

使用getRange()非常简单(我不需要Internet Explorer兼容性,因此如果文本是纯文本,则可以使用适用于FireFox,Chrome和Safari的getRange())。这里的问题是<span>, <strong> and <em>标签无处不在,并且每个标签都是一个新的childNode。所以getRange()不起作用。

我还没有找到忽略标记的方法。似乎没有简单的方法可以做到这一点。但我不是Javascript专家,也许有一个技巧可以忽略(或使函数表现得好像忽略了)文本中的标记。

<a href="javacript: magicCode();">Select some text in the table then click here</a>
<table>
<tr>
<td id="content1">This <span class="one">is the</span> first line <span class="two">and it contains</span> text</td>
</tr>
<tr>
<td id="content2">This is the <span class="three">second line and it contains text</span></td>
</tr>
<tr>
<td id="content3"><span class="four">This is <span class="five">the third</span> line and it</span> contains text</td>
</tr>
<tr>
<td id="content4">This is <strong>the fourth <em>line</em> and it</strong> contains text</td>
</tr>
<tr>
<td id="content5">This is the fifth line and it contains text</td>
</tr>
</table>

有人可以帮我写我的magicCode()吗?

谢谢!

2 个答案:

答案 0 :(得分:1)

您可以使用.textContent属性来获取没有HTML的文本值。通过检查.innerText并使用它(如果存在),您可以轻松地在所有浏览器中使用它,否则使用.textContentinnerText适用于IE,textContent适用于Firefox / Chrome等。

以下是一个示例:

 var content = document.getElementById('content1');
 if(content.innerText){
   alert(content.innerText);
 }else{
   alert(content.textContent);
 }

答案 1 :(得分:0)

您可能希望使用canvas标记来生成文本;对于您的项目来说,它可能有点复杂和过分。

Bespin是一个完全使用canvas标签创建的代码编辑器。我没有看源,所以我无法告诉你他们如何设法渲染文本和模仿文本选择。

https://bespin.mozilla.com/