我正在尝试学习如何编写一个书签,我可以突出显示一些文本,点击书签,让它告诉我突出显示的是什么。我可以做到这一点,但接下来我想知道文本是什么元素。
例如:
<div id="some-id">to be highlighted</div>
小书签代码:
javascript:(function(){alert(window.getSelection();})()
如果我突出显示“要突出显示”文本,然后单击书签,它将提醒文本。但是,如何获取文本所在的元素,在这种情况下是后面的元素?
所以流程是:突出显示文本,点击bookmarklet,bookmarklet告诉你突出显示的内容及其所在的元素。
谢谢!
答案 0 :(得分:22)
尝试类似于此的内容以获取包含所选文本的dom元素。
window.getSelection().anchorNode.parentNode
它适用于firefox和Chorme,您应该将其测试到剩余的浏览器中。
它有一个怪癖,如果你选择的文字不仅仅是一个元素,那么只返回第一个。但也许你可以忍受这个。
仅供参考什么是anchorNode属性: http://help.dottoro.com/ljkstboe.php
在Internet Explorer上,这个代码片段可以解决问题(我无法测试)
document.selection.createRange().parentElement();
如上所述 http://msdn.microsoft.com/en-us/library/ms535872.aspx和 http://msdn.microsoft.com/en-us/library/ms536654.aspx
关于quirksmode的范围说明:http://www.quirksmode.org/dom/range_intro.html
答案 1 :(得分:7)
您可以在所有主流浏览器中相对简单地执行此操作。代码如下,实例:http://jsfiddle.net/timdown/Q9VZT/
function getSelectionTextAndContainerElement() {
var text = "", containerElement = null;
if (typeof window.getSelection != "undefined") {
var sel = window.getSelection();
if (sel.rangeCount) {
var node = sel.getRangeAt(0).commonAncestorContainer;
containerElement = node.nodeType == 1 ? node : node.parentNode;
text = sel.toString();
}
} else if (typeof document.selection != "undefined" &&
document.selection.type != "Control") {
var textRange = document.selection.createRange();
containerElement = textRange.parentElement();
text = textRange.text;
}
return {
text: text,
containerElement: containerElement
};
}
答案 2 :(得分:0)
我认为你不能,他只知道当前正在使用哪个元素就是在元素上使用onclick事件。除此之外,没有确定的方法。但是,您可以搜索每个元素,直到找到具有相同文本的元素
jQuery('*:contains(' + selected + ').
您可以添加一个事件来获取具有此代码的当前元素(未经测试)
var all = document.getElementsByTagName('*');
for (var i = 0; i < all.length; i++)
all[i].onclick = function(e){
window.selectedElement = all[i];
//preventDefault $ StopBubble &
return false;
}
它将存储在selectedElement
中好的尝试这个:
var all = document.getElementsByTagName('*');
for (var i = 0; i < all.length; i++)
all[i].onclick = function(e) {
window.selectedElement = this;
((e && e.stopPropagation && e.stopPropagation()) ||
(window.event && (window.event.cancelBubble = true)));
return false;
}
DEMO:http://jsfiddle.net/HQC6Z/1/ 更好的是:http://jsfiddle.net/HQC6Z/
在查看其他答案之后,我收回了我的解决方案并提供了他们的解决方案: