javascript - 如何检测文本区域和输入之外的选择

标签 javascript jquery

jQuery 选择事件仅限于 textareainput:text仅有的。有没有办法处理普通元素中的选择,例如 <div>

最佳答案

jQuery 的 select 事件包装了 native 浏览器的 select 事件,该事件会在 IE 和 WebKit 中的任何类型选择时触发,但仅适用于其他浏览器中的输入和文本区域。

这个问题之前已经出现过好几次了:

您会看到很多与卢克类似的答案,但没有一个完全有效。首先,您需要考虑通过键盘以及通过编辑和上下文浏览器菜单中的“全选”选项进行的选择。其次,通过查看选择文本来检查选择的更改并不完全可靠:如果用户在文档中的其他位置选择相同的文本,则不会选择该文本。

这里有一些代码可以解决大多数问题,尽管无法轮询选择,但您无法从“编辑”和上下文菜单中选择“全选”。

var addSelectHandler = function(callback) {
    var selectionChangeEventHandler;

    if (typeof window.getSelection != "undefined" && typeof document.addEventListener != "undefined") {
        var previouslySelected = null;

        var rangesEqual = function(r1, r2) {
            return r1.startContainer === r2.startContainer && r1.startOffset === r2.startOffset &&
                   r1.endContainer === r2.endContainer && r1.endOffset === r2.endOffset;
        };

        selectionChangeEventHandler = function() {
            var sel = window.getSelection(), selectedRanges = [], range;
            var changed = !previouslySelected || (sel.rangeCount != previouslySelected.length);
            for (var i = 0, len = sel.rangeCount; i < len; ++i) {
                range = sel.getRangeAt(0).cloneRange();
                selectedRanges[i] = range;
                if (!changed && !rangesEqual(range, previouslySelected[i])) {
                    changed = true;
                }
            }
            previouslySelected = selectedRanges;
            if (changed) {
                callback();
            }
        };

        document.addEventListener("mouseup", selectionChangeEventHandler, false);
        document.addEventListener("keyup", selectionChangeEventHandler, false);
    } else if (typeof document.selection != "undefined" && typeof document.attachEvent != "undefined") {
        // This is IE, which fires a selectionchange event for any selection
        document.attachEvent("onselectionchange", callback);
    }
};

addSelectHandler(function() {
    alert("Selection changed");
}

关于javascript - 如何检测文本区域和输入之外的选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4910927/

相关文章:

jquery - 滑动切换完成后调用函数

javascript - 使用 Plyr.io,一旦视频结束 - 重启播放器

javascript - 初始化 AngularJS Controller 时出现问题 : Cannot set property . .. 未定义

javascript - Extjs 将按钮在容器中居中对齐

javascript - 单击时将 2 个 Bootstrap 列替换为 2 个隐藏列。 rails 4, Bootstrap

javascript - 获取父级信息并将其传递到隐藏表单

javascript - 循环遍历数组以查找用户输入的索引,然后替换另一个数组的相同索引处的值

javascript - Highcharts:使用 CSV 预处理数据

javascript - 使用 git bash 错误设置 app.js

javascript - jQuery slideToggle - 仅 slideUp Action 的回调函数