Javascript 检测光标是否在可编辑内容的li范围内

Javascript 检测光标是否在可编辑内容的li范围内,javascript,jquery,css,contenteditable,Javascript,Jquery,Css,Contenteditable,我有一个工作代码,当您在内容可编辑的div中按enter键时,可以插入。(浏览器有各种默认的插入或) 问题在于,在构建有序或无序列表时,它会终止按enter键添加另一个列表项的默认行为。所以我的问题是,您是否可以检测文本插入点是否在列表项中,如果是,请禁用处理enter键的javascript 工作代码: 您需要对包含所选内容的节点执行一些DOM树检查。以下是一个在所有主要浏览器中都适用的演示: 代码: 您需要对包含所选内容的节点执行一些DOM树检查。以下是一个在所有主要浏览器中都适用的演示

我有一个工作代码,当您在内容可编辑的div中按enter键时,可以插入

。(浏览器有各种默认的插入

问题在于,在构建有序或无序列表时,它会终止按enter键添加另一个列表项的默认行为。所以我的问题是,您是否可以检测文本插入点是否在列表项中,如果是,请禁用处理enter键的javascript

工作代码:


您需要对包含所选内容的节点执行一些DOM树检查。以下是一个在所有主要浏览器中都适用的演示:

代码:


您需要对包含所选内容的节点执行一些DOM树检查。以下是一个在所有主要浏览器中都适用的演示:

代码:



问题:jQuery对您可用吗?不请自来的迂腐:你可能是指“插入符号”,或者更可能是指“光标”。编辑:没关系。我看到您的演示使用了jQuery。很好,我将其更新为文本插入点,因为大多数人可能认为“光标”是您用鼠标移动的箭头。问题:jQuery对您可用吗?不请自来的迂腐:你可能是指“插入符号”,或者更可能是指“光标”。编辑:没关系。我看到你的演示使用了jQuery。很好,我更新了它,说它是文本插入点,因为大多数人可能认为“光标”是你用鼠标移动的箭头。看起来li不能有焦点。你是对的,尽管你可以通过应用tabindex绕过它。我已将答案更新为在()上使用,而不是在live()上使用,尽管尚未测试。后者已经被弃用了一段时间,并从jQuery 1.9开始被删除。感谢您进一步研究。我已经在列表项中添加了一些选项卡索引,并更新了代码,以便在关注
  • 的同时按enter键时显示警报。但是我不能让它正常工作。看起来安利不可能有焦点你是对的,尽管你可以通过应用tabindex来解决这个问题。我已将答案更新为在()上使用,而不是在live()上使用,尽管尚未测试。后者已经被弃用了一段时间,并从jQuery 1.9开始被删除。感谢您进一步研究。我已经在列表项中添加了一些选项卡索引,并更新了代码,以便在关注
  • 的同时按enter键时显示警报。但是我不能让它正常工作。很抱歉耽误了你的回复。看起来不错!我将进一步检查它,如果它有效,我将接受答案。这会检测您是否在
  • 中+我为此付出了代价!然而,我不能让它与我上面问题中的现有代码一起工作。太好了!感谢您的帮助。请注意,在Xubuntu上使用Chromium v30.0.1599.114是不起作用的。在fiddle中,“警报”对话框可防止返回false阻止事件冒泡。删除
    alert
    语句可以解决这个问题。@DaveJarvis:这一点很好。我添加了一个更新的JSFIDLE。谢谢。很抱歉耽误了你的回复。看起来不错!我将进一步检查它,如果它有效,我将接受答案。这会检测您是否在
  • 中+我为此付出了代价!然而,我不能让它与我上面问题中的现有代码一起工作。太好了!感谢您的帮助。请注意,在Xubuntu上使用Chromium v30.0.1599.114是不起作用的。在fiddle中,“警报”对话框可防止返回false阻止事件冒泡。删除
    alert
    语句可以解决这个问题。@DaveJarvis:这一点很好。我添加了一个更新的JSFIDLE。谢谢
    .on('keypress', 'document', function (e) {
        if (!$('li').focus();) {
        ...
        }
      }
    });
    
    function isSelectionInsideElement(tagName) {
        var sel, containerNode;
        tagName = tagName.toUpperCase();
        if (window.getSelection) {
            sel = window.getSelection();
            if (sel.rangeCount > 0) {
                containerNode = sel.getRangeAt(0).commonAncestorContainer;
            }
        } else if ( (sel = document.selection) && sel.type != "Control" ) {
            containerNode = sel.createRange().parentElement();
        }
        while (containerNode) {
            if (containerNode.nodeType == 1 && containerNode.tagName == tagName) {
                return true;
            }
            containerNode = containerNode.parentNode;
        }
        return false;
    }