javascript get id of "commonAncestorContainer"
javascript get id of "commonAncestorContainer"
所以我觉得我有点自不量力。但这是我想做的。
基本上,我想让用户在一个段落(可能包含许多元素(即<span>
和<a>
)中选择文本的一部分,以返回该段的id属性的值。这是我的想法。
function getParaID() //function will be called using a mouseUp event
{
var selObj = window.getSelection();
var selRange = selObj.getRangeAt(0); //btw can anyone explain what this zero means
var paraElement = selRange.commonAncestorContainer;
var paraID = paraElement.getAttribute;
return paraID;
}
你觉得怎么样?我离得近吗?
选择范围的commonAncestorContainer
属性可以是对文本节点的引用,也可以是对<span>
或<a>
元素或<body>
元素的引用,也可以是对页面中其他元素的引用。在这种情况下,您需要在DOM树中查找包含<p>
的元素(如果存在的话)。你还需要意识到IE <9不支持window.getSelection()
或DOM范围,尽管可以很容易地在IE中做你想做的事情;9. 下面是一些可以在所有主流浏览器(包括IE 6)上运行的代码:
jsFiddle: http://jsfiddle.net/44Juf/
代码:function getContainingP(node) {
while (node) {
if (node.nodeType == 1 && node.tagName.toLowerCase() == "p") {
return node;
}
node = node.parentNode;
}
}
function getParaID() {
var p;
if (window.getSelection) {
var selObj = window.getSelection();
if (selObj.rangeCount > 0) {
var selRange = selObj.getRangeAt(0);
p = getContainingP(selRange.commonAncestorContainer);
}
} else if (document.selection && document.selection.type != "Control") {
p = getContainingP(document.selection.createRange().parentElement());
}
return p ? p.id : null;
}
关于传递给getRangeAt()
的0
,这表明您想要选择哪个范围。Firefox支持多个选择范围:如果你做了一个选择,然后按住Ctrl再做另一个选择,你会看到你现在有两个不连续的选择范围,可以通过getRangeAt(0)
和getRangeAt(1)
访问。同样在Firefox中,在表中选择一列单元格会为每个选定的单元格创建一个单独的区域。可以使用选择项的rangeCount
属性获得所选范围的数量。其他主流浏览器都不支持多选区
你很接近了。如果您想要的只是父元素的id,那么您应该将paraElement.getAttribute
替换为paraElement.id
,如:
var paraID = paraElement.id;
关于getRangeAt()
的参数,它指定要返回的选择范围的索引,它只与允许不连续选择的控件相关。例如,在select
框中,用户可以使用ctrl + click
同时选择任意几组行。在这种情况下,您可以使用该参数从一个选定区域步进到下一个区域。但是要在段落中突出显示文本,你不应该有一个不连续的选择,因此总是可以通过0
。从本质上讲,这意味着你要求"第一个选择的区域"。
还要注意,如果你的界面允许用户的选择跨越多个段落,那么你的commonAncestorContainer
可能不是一个段落,它也可能是包含所有段落标签的元素。所以你应该准备好处理这种情况。
在玩了一会儿之后,这是我的建议:http://jsfiddle.net/vCsZH/
基本上,这段代码不依赖于commonAncestorContainer
,而是对每个段落应用mouseDown
和mouseUp
侦听器(除了已经应用于顶级容器的侦听器之外)。从本质上讲,监听器将记录选择范围开始和结束的段落,从而更容易可靠地计算出选择了哪些段落。
- 铬:“;未捕获的语法错误:意外的标记:"
- 可以设置“;文件名"发生错误时显示的内联脚本标记的
- JS表单提交"无法使用Chrome数据保护程序加载此页面.尝试重新加载页面.调试信息:POST CISmtuK
- 检测电话窃听,即:<a href="电话:xxx">在UIWebview上
- 使用“+="操作人员
- //而不是在src=“”上使用http://"属性
- "未捕获的语法错误:意外的标记}"
- 可以<脚本类型=“;text/javascript”>window.location=“/"</
- "实例范围”;TypeScript类的getter/setter
- Javascript复选框函数:;缺少:在属性id之后"
- "“;变量未引用正确的对象
- "日期“;AJAX请求返回的类型值未定义
- 得到"TypeError:无法读取属性'filename'未定义的“;调用“npm start
- Soundcloud api"未捕获的类型错误:无法读取属性'uri'“未定义”;
- "工具提示"jQuery插件坏了
- "锻造;React中的表达式
- 图像可以从源<img src=""/>.TEXT可以在没有javascript的情况下从外部
- 如何提取“;href"最近列表项中的属性值
- CKEditor如何允许href="javascript:void(0)"在小部件中
- 插入“;img src"在javascript中