在页面上找到任意位置的插入位置

时间:2015-07-14 20:34:03

标签: javascript google-chrome-extension

我是兼职新手开发人员,致力于Chrome扩展程序,可用作内部CR工具。

概念很简单,在键盘快捷键上,扩展名获取插入符号旁边的单词,检查它是否匹配模式,以及匹配是否为“真实”。用预设的回复替换该单词。

为此,我主要使用this answer的修改版本。

我已经遇到了障碍,因为这对于活动元素起作用,但它似乎不适用于诸如“组合”这样的事情。 Chrome中的窗口,或者与其他服务一致(例如,Salesforce似乎也不喜欢它)。稍微调整一下我认为这可能是iFrames的一个问题,所以我修改了一下并修改了这段代码的和平:

Exception in thread "main" java.lang.NullPointerException
    at assign4.Roster.addStudent(Roster.java:56)
    at assign4.TestRoster.testAdd(TestRoster.java:17)
    at assign4.TestRoster.main(TestRoster.java:13)
Java Result: 1`

(我最初从另一个SO帖子中得到了我再也找不到了)。好像我运气不好,好像没有骰子。

是否有一种简单的方法可以在每个页面上始终使用活动插入符号获取活动元素,即使对于Gmail撰写窗口和类似服务,或者我将不得不为我不断增加的服务列表编写自定义代码代码无法获取插入符号?

我的完整代码就在这里。虽然这很粗糙,但我只是想让它发挥作用,所以我理解它的草率部分需要整理:

function getActiveElement(document){
    document = document || window.document;
    if( document.body === document.activeElement || document.activeElement.tagName == 'IFRAME' ){// Check if the active element is in the main web or iframe
        var iframes = document.getElementsByTagName('iframe');// Get iframes
        for(var i = 0; i<iframes.length; i++ ){
            var focused = getActiveElement( iframes[i].contentWindow.document );// Recall
            if( focused !== false ){
                return focused; // The focused
             }
         }
     }
     else return document.activeElement;
};

1 个答案:

答案 0 :(得分:2)

我已经将它用于Gmail窗口(可能是其他可信的元素,而不仅仅是输入元素)。

编辑:换行失误是因为window.getSelection()。anchorOffset返回相对于该特定元素的偏移量,而ReturnWord则传递整个撰写窗口(包含多个元素)的文本。 window.getSelection()。anchorNode返回计算偏移量的节点。

function AlertPrevWord() {
    var text = getActiveElement();
    var caretPos = text.selectionStart || window.getSelection().anchorOffset;        
    var word = ReturnWord(text.value || window.getSelection().anchorNode.textContent, caretPos);
    if (word != null) {return word;}
}

我最初使用MutationObserver来计算页面加载后创建的Gmail撰写div,只是为了附加一个事件监听器。

var observer = new MutationObserver(function(mutations) {
  mutations.forEach(function(mutation) {
    var nodes = mutation.addedNodes; //list of new nodes in the DOM
    for (var i = 0; i < nodes.length; ++i) {
      //attach key listener to nodes[i] that calls AlertPrevWord
    }
  });    
});
observer.observe(document, {childList: true, subtree:true });
    //childList:true notifies observer when nodes are added or removed
    //subtree:true observes all the descendants of document as well

编辑:我一直在测试的委托点击处理程序。到目前为止,关键事件处理程序无法正常工作。

$(document).on( "click", ":text,[contenteditable='true']", function( e ) {
   e.stopPropagation();
   console.log(AlertPrevWord());
});