代码之家  ›  专栏  ›  技术社区  ›  Jason

从Gecko和Webkit中的选择(范围)中检索父节点

  •  6
  • Jason  · 技术社区  · 16 年前

    我试图在使用使用“createLink”命令的所见即所得编辑器时添加属性。我认为在browse执行该命令之后返回创建的节点是很简单的。

    结果,我只能在IE中抓取这个新创建的节点。有什么想法吗?

    var getSelectedHTML = function() {
        if ($.browser.msie) {
            return this.getRange().htmlText;
        } else {
            var elem = this.getRange().cloneContents();
            return $("<p/>").append($(elem)).html();
        }
    };
    
    var getSelection = function() {
        if ($.browser.msie) {
            return this.editor.selection;
        } else {
            return this.iframe[0].contentDocument.defaultView.getSelection();
        }
    };
    
    var getRange = function() {
        var s = this.getSelection();
        return (s.getRangeAt) ? s.getRangeAt(0) : s.createRange();
    };
    
    var getSelectedNode = function() {
        var range = this.getRange();
        var parent = range.commonAncestorContainer ? range.commonAncestorContainer : 
                        range.parentElement ? range.parentElement(): 
                        range.item(0);
        return parent;
    };
    
    
    // **** INSIDE SOME EVENT HANDLER ****
    
    if ($.browser.msie) {
        this.ec("createLink", true);
    } else {
        this.ec("createLink", false, prompt("Link URL:", "http://"));
    }
    
    var linkNode = $(this.getSelectedNode());
    linkNode.attr("rel", "external");
    
    $.log(linkNode.get(0).tagName);
        // Gecko: "body"
        // IE: "a"
        // Webkit: "undefined"
    
    $.log(this.getSelectedHTML());
        // Gecko: "<a href="http://site.com">foo</a>"
        // IE: "<A href="http://site.com" rel=external>foo</A>"
        // Webkit: "foo"
    
    $.log(this.getSelection());
        // Gecko: "foo"
        // IE: [object Selection]
        // Webkit: "foo"
    

    谢谢你的帮助,我已经搜索了相关的问题,所以没有成功!

    3 回复  |  直到 16 年前
        1
  •  13
  •   gnarf    16 年前

    这是我用来获取文本光标“parentNode”的代码:

    var getSelectedNode = function() {
        var node,selection;
        if (window.getSelection) {
          selection = getSelection();
          node = selection.anchorNode;
        }
        if (!node && document.selection) {
            selection = document.selection
            var range = selection.getRangeAt ? selection.getRangeAt(0) : selection.createRange();
            node = range.commonAncestorContainer ? range.commonAncestorContainer :
                   range.parentElement ? range.parentElement() : range.item(0);
        }
        if (node) {
          return (node.nodeName == "#text" ? node.parentNode : node);
        }
    };
    

    jsbin preview 你可以用它来测试。

        2
  •  1
  •   Community Mohan Dere    9 年前

    我发现,在不同的浏览器中,选择会变得复杂和混乱。再加上浏览器文档编辑的魔力,情况会变得更糟!

    我看了一下TinyMCE是如何实现我所要做的事情的,并用同样的方法修改jhtlarea。

    基本上,链接是用假href创建的。然后,它通过搜索具有特定href的链接来找到该dom元素。然后,您可以添加任何所需的属性,并用实际的url更新href。

    这个 solution above by gnarf 是获取选定节点的一个很好的示例,适用于大多数场景。

    以下是我的工作代码:

    var url = prompt("Link URL:", "http://");
    
    if (!url) {
        return;
    }
    
    // Create a link, with a magic temp href
    this.ec("createLink", false, "#temp_url#");
    
    // Find the link in the editor using the magic temp href
    var linkNode = $(this.editor.body).find("a[href='#temp_url#']");
    
    linkNode.attr("rel", "external");
    
    // Apply the actual desired url
    linkNode.attr("href", url);
    
        3
  •  0
  •   naugtur    16 年前

    this.getSelection() 似乎在两个需要的浏览器中都是相同的,因此:

    var link=prompt('gimme link');
    
    //add the thing
    
    var text=this.getSelection();
    
    var whatYouNeed=$('a:contains("'+text+'")[href="'+link+'"');