Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/421.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何将所选单词换行_Javascript_Jquery_Html_Firefox_Selection - Fatal编程技术网

Javascript 如何将所选单词换行

Javascript 如何将所选单词换行,javascript,jquery,html,firefox,selection,Javascript,Jquery,Html,Firefox,Selection,我想能够悬停在网页上的任何单词,并在该单词上方弹出一个包含该单词的弹出窗口。如果没有巨大的性能问题,这几乎是不可能的,所以我尝试双击而不是悬停 通过双击,我可以检测单词的文本,但我不能在页面中对单词本身做任何事情。基本上,我想用一个span标记来包装所选的文本,这样我就可以相对于它定位事物。我以前见过用荧光灯做的,但我不知道怎么做 注意:这只需要在Firefox中使用。您可以使用以下功能: var range = window.getSelection().getRangeAt(0); var

我想能够悬停在网页上的任何单词,并在该单词上方弹出一个包含该单词的弹出窗口。如果没有巨大的性能问题,这几乎是不可能的,所以我尝试双击而不是悬停

通过双击,我可以检测单词的文本,但我不能在页面中对单词本身做任何事情。基本上,我想用一个span标记来包装所选的文本,这样我就可以相对于它定位事物。我以前见过用荧光灯做的,但我不知道怎么做


注意:这只需要在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以获取单词的坐标
  • 将单词弹出元素放置在远离这些坐标的某个偏移处并显示它
演示非常有限(例如,它不能处理跨越元素边界的单词,单词检测非常粗糙,并且有大量的优化空间),但应该足以让您开始。它在当前浏览器中工作,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))){
--开始;
}
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))){
--圣