Javascript 如何将所选单词换行
我想能够悬停在网页上的任何单词,并在该单词上方弹出一个包含该单词的弹出窗口。如果没有巨大的性能问题,这几乎是不可能的,所以我尝试双击而不是悬停 通过双击,我可以检测单词的文本,但我不能在页面中对单词本身做任何事情。基本上,我想用一个span标记来包装所选的文本,这样我就可以相对于它定位事物。我以前见过用荧光灯做的,但我不知道怎么做Javascript 如何将所选单词换行,javascript,jquery,html,firefox,selection,Javascript,Jquery,Html,Firefox,Selection,我想能够悬停在网页上的任何单词,并在该单词上方弹出一个包含该单词的弹出窗口。如果没有巨大的性能问题,这几乎是不可能的,所以我尝试双击而不是悬停 通过双击,我可以检测单词的文本,但我不能在页面中对单词本身做任何事情。基本上,我想用一个span标记来包装所选的文本,这样我就可以相对于它定位事物。我以前见过用荧光灯做的,但我不知道怎么做 注意:这只需要在Firefox中使用。您可以使用以下功能: var range = window.getSelection().getRangeAt(0); var
注意:这只需要在Firefox中使用。您可以使用以下功能:
var range = window.getSelection().getRangeAt(0);
var newNode = document.createElement("b");
range.surroundContents(newNode);
这用一个b标签围绕着您的选择。您可以使用以下功能:
var range = window.getSelection().getRangeAt(0);
var newNode = document.createElement("b");
range.surroundContents(newNode);
这用一个b标签围绕着你的选择。这在
mouseover
事件中不是不可能的。您可以使用Firefox 20及更高版本中标准化和支持的WebKit,也可以使用WebKit专有的等效工具
处理鼠标事件时的步骤包括:
- 隐藏单词弹出窗口(如果显示)
- 从事件中获取光标坐标
- 使用
或等效工具从光标坐标创建一个范围document.caretPositionFromPoint()
- 如果范围的容器节点是文本节点,则其偏移量是文本节点文本中的字符索引
- 从那里开始,在文本节点的文本中向前和向后展开,直到我们点击空白处得到单词
- 更新范围以包含整个单词
- 调用range以获取单词的坐标
- 将单词弹出元素放置在远离这些坐标的某个偏移处并显示它
document.caretPositionFromPoint()
以下是关键代码:
function expandToWord(str, offset) {
var start = offset;
while ( start >= 1 && /\S/.test( str.charAt(start - 1) ) ) {
--start;
}
var end = offset, len = str.length;
while ( end < len && /\S/.test( str.charAt(end) ) ) {
++end;
}
return {
start: start,
end: end,
word: str.slice(start, end)
};
}
var wordDiv = document.createElement("div");
wordDiv.className = "word";
var createRangeFromPoint = (function(doc) {
// Try standards-based method first
if (typeof doc.caretPositionFromPoint != "undefined") {
return function(x, y) {
var pos = doc.caretPositionFromPoint(x, y);
var range = null;
if (pos) {
range = doc.createRange();
range.setStart(pos.offsetNode, pos.offset);
range.collapse(true);
}
return range;
};
}
// Now try WebKit's proprietary method
else if (typeof doc.caretRangeFromPoint != "undefined") {
return function(x, y) {
return doc.caretRangeFromPoint(x, y);
};
}
// Give up
else {
return function() { return null; };
}
})(document);
function mouseEventHandler(e) {
if (wordDiv.parentNode) {
wordDiv.parentNode.removeChild(wordDiv);
}
var range = createRangeFromPoint(e.clientX, e.clientY);
if (range) {
if (range.startContainer.nodeType == 3) {
var wordInfo = expandToWord(range.startContainer.data, range.startOffset);
if (wordInfo.word) {
range.setStart(range.startContainer, wordInfo.start);
range.setEnd(range.startContainer, wordInfo.end);
var rect = range.getBoundingClientRect();
// Get the difference between client and page coordinates from the event
// for positioning the word div
var offsetX = e.clientX - e.pageX;
var offsetY = e.clientY - e.pageY;
wordDiv.style.left = (rect.left + offsetX) + "px";
wordDiv.style.top = (rect.top + offsetY - 20) + "px";
wordDiv.innerHTML = "";
wordDiv.appendChild( document.createTextNode(wordInfo.word) );
document.body.appendChild(wordDiv);
}
}
}
}
document.onmousemove = mouseEventHandler;
document.onmouseover = mouseEventHandler;
document.onmouseout = mouseEventHandler;
函数expandToWord(str,offset){
var开始=偏移量;
while(start>=1&&/\S/.test(str.charAt(start-1))){
--开始;
}
var end=偏移量,len=str.length;
while(end鼠标悬停事件并非不可能。您可以使用Firefox 20及更高版本中标准化和支持的WebKit,也可以使用WebKit专有的等效工具
处理鼠标事件时的步骤包括:
- 隐藏单词弹出窗口(如果显示)
- 从事件中获取光标坐标
- 使用
document.caretPositionFromPoint()
或等效工具从光标坐标创建一个范围
- 如果范围的容器节点是文本节点,则其偏移量是文本节点文本中的字符索引
- 从那里开始,在文本节点的文本中向前和向后展开,直到我们点击空白处得到单词
- 更新范围以包含整个单词
- 调用range以获取单词的坐标
- 将单词弹出元素放置在远离这些坐标的某个偏移处并显示它
演示非常有限(例如,它不能处理跨越元素边界的单词,单词检测非常粗糙,并且有大量的优化空间),但应该足以让您开始。它在当前浏览器中工作,IE除外,IE不支持document.caretPositionFromPoint()
以下是关键代码:
function expandToWord(str, offset) {
var start = offset;
while ( start >= 1 && /\S/.test( str.charAt(start - 1) ) ) {
--start;
}
var end = offset, len = str.length;
while ( end < len && /\S/.test( str.charAt(end) ) ) {
++end;
}
return {
start: start,
end: end,
word: str.slice(start, end)
};
}
var wordDiv = document.createElement("div");
wordDiv.className = "word";
var createRangeFromPoint = (function(doc) {
// Try standards-based method first
if (typeof doc.caretPositionFromPoint != "undefined") {
return function(x, y) {
var pos = doc.caretPositionFromPoint(x, y);
var range = null;
if (pos) {
range = doc.createRange();
range.setStart(pos.offsetNode, pos.offset);
range.collapse(true);
}
return range;
};
}
// Now try WebKit's proprietary method
else if (typeof doc.caretRangeFromPoint != "undefined") {
return function(x, y) {
return doc.caretRangeFromPoint(x, y);
};
}
// Give up
else {
return function() { return null; };
}
})(document);
function mouseEventHandler(e) {
if (wordDiv.parentNode) {
wordDiv.parentNode.removeChild(wordDiv);
}
var range = createRangeFromPoint(e.clientX, e.clientY);
if (range) {
if (range.startContainer.nodeType == 3) {
var wordInfo = expandToWord(range.startContainer.data, range.startOffset);
if (wordInfo.word) {
range.setStart(range.startContainer, wordInfo.start);
range.setEnd(range.startContainer, wordInfo.end);
var rect = range.getBoundingClientRect();
// Get the difference between client and page coordinates from the event
// for positioning the word div
var offsetX = e.clientX - e.pageX;
var offsetY = e.clientY - e.pageY;
wordDiv.style.left = (rect.left + offsetX) + "px";
wordDiv.style.top = (rect.top + offsetY - 20) + "px";
wordDiv.innerHTML = "";
wordDiv.appendChild( document.createTextNode(wordInfo.word) );
document.body.appendChild(wordDiv);
}
}
}
}
document.onmousemove = mouseEventHandler;
document.onmouseover = mouseEventHandler;
document.onmouseout = mouseEventHandler;
函数expandToWord(str,offset){
var开始=偏移量;
while(start>=1&&/\S/.test(str.charAt(start-1))){
--圣