此处的代码返回iFrame中的JavaScript选择对象(iFrame页面位于同一个域中,因此没有xss问题)。
我需要知道的是原始 html代码(不是dom)中的选择索引。
更新
E.g。
如果您有html doc:
<html><body>ABC</body></html>
在UI中,用户使用鼠标选择文本“ABC”,我希望能够使用JavaScript来确定html源中所选文本的位置。在这种情况下,ABC的索引是13。
更新2
我坚持这种疯狂的原因是,我需要创建一个工具,可以根据用户之前识别的选定文本重新访问页面并拉取文本。用户告诉系统文本的位置,从那时起系统使用正则表达式来拉取文本。现在,如果dom与原始html不同,并且无法确定原始html中的选择 - 那么很难知道reg ex会产生什么。我不认为还有另一种解决方法。
// Returns the raw selection object currently
// selected in the UI
function getCurrentSelection() {
var selection = null;
var iFrame = document.getElementById('uc_iFrameGetPriceData');
try {
if (window.getSelection) { // Gecko
selection = iFrame.contentWindow.getSelection();
}
else { // IE
var iframeDoc = iFrame.contentWindow.document;
if (iframeDoc.selection) {
selection = iframeDoc.selection;
}
else {
selection = iframeDoc.contentWindow.getSelection();
}
}
}
catch (err) {
alert( 'Error: getCurrentSelection() - ' + err.description )
}
return selection;
}
答案 0 :(得分:1)
您可以使用selection.anchorOffset
和selection.focusOffset
来访问所选内容的索引和偏移量。
看看这个: http://help.dottoro.com/ljjmnrqr.php
这是另一篇很好的解释文章: http://www.quirksmode.org/dom/range_intro.html
更新到您的更新:我不确定您为什么要尝试获取原始HTML代码的索引。但是你可以根据选择这样选择DOM:
selection.anchorNode.nodeValue.replace(selection.anchorNode.nodeValue.substring(selection.anchorOffset, selection.focusOffset), 'replace value')
请注意,anchorOffset
仍然可能在focusOffset
之前,具体取决于您是从左到右还是从右到左选择了文字。
答案 1 :(得分:0)
如果我理解正确,你会想要在DOM中移动。在这种情况下,您可以使用以下方法/属性:
parentNode
getChildNodes()
firstChild
和lastChild
......这些链接可能有所帮助:
http://www.codingforums.com/archive/index.php/t-81035.html
http://www.sitepoint.com/forums/showthread.php?t=586034
最快的方式可能是
var node = document.getElementById('myElement');
alert(node.parentNode.indexOf(node));
(抱歉,由于某种原因格式化按钮没有出现在我的“你的答案”区域......)
答案 2 :(得分:0)
如果有这些信息,我会感到惊讶。
没有DOM API可以区分
<html><body>ABC</body></html>
和
<html ><body >ABC</body></html>
原始HTML中的索引在每种情况下都不同,但构造的DOM是相同的。
答案 3 :(得分:0)
你不能理智地做到这一点:唯一可能的方法是通过Ajax重新下载页面的HTML,解析HTML并将生成的DOM与当前的DOM相匹配,这些DOM本身可能已被JavaScript改变。此外,它无论如何都不是一个有用的数字,因为一旦加载了页面,原始HTML字符串就不再存在于DOM中,因此该字符串中的偏移在JavaScript中没有任何意义。从节点和偏移方面进行选择更为明智。