Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/401.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_Google Chrome Extension - Fatal编程技术网

Javascript 在第页的任意位置查找插入符号位置

Javascript 在第页的任意位置查找插入符号位置,javascript,google-chrome-extension,Javascript,Google Chrome Extension,我是一名兼职的新开发人员,致力于设计一个内部CR工具的Chrome扩展 概念很简单,在键盘快捷键上,分机获取插入符号旁边的单词,检查其模式匹配,如果匹配为“true”,则用一个固定的响应替换该单词 为了做到这一点,我主要使用了的一个修改版本 我遇到了一个障碍,使用它对活动元素有效,但它似乎不适用于诸如Chrome中的“撰写”窗口之类的东西,也不适用于其他服务(例如,Salesforce似乎也不喜欢它)。我想这可能是iFrame的一个问题,所以我做了一些修改,修改了这段代码: function g

我是一名兼职的新开发人员,致力于设计一个内部CR工具的Chrome扩展

概念很简单,在键盘快捷键上,分机获取插入符号旁边的单词,检查其模式匹配,如果匹配为“true”,则用一个固定的响应替换该单词

为了做到这一点,我主要使用了的一个修改版本

我遇到了一个障碍,使用它对活动元素有效,但它似乎不适用于诸如Chrome中的“撰写”窗口之类的东西,也不适用于其他服务(例如,Salesforce似乎也不喜欢它)。我想这可能是iFrame的一个问题,所以我做了一些修改,修改了这段代码:

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;
};
函数getActiveElement(文档){ document=document | | window.document; 如果(document.body==document.activeElement | | document.activeElement.tagName=='IFRAME'){//检查活动元素是否在主web或IFRAME中 var iframes=document.getElementsByTagName('iframe');//获取iframes 对于(vari=0;i0){//如果有多个空格字符 var words=preText.split(“”;//按空格分割单词 返回单词[words.length-1];//返回最后一个单词 } else{//否则,如果没有空格字符 return-preText;//返回单词 } } 函数getActiveElement(文档){ document=document | | window.document; 如果(document.body==document.activeElement | | document.activeElement.tagName=='IFRAME'){//检查活动元素是否在主web或IFRAME中 var iframes=document.getElementsByTagName('iframe');//获取iframes
对于(var i=0;i我让它在Gmail窗口中工作(可能还有其他contenteditable元素,而不仅仅是输入元素)

编辑:换行符周围的失败是因为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 compose 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

识别帧后(例如,通过递归处理相同的原始帧,如您所做的),您可以使用“子问题2”的逻辑替换插入符号处的零件在这个答案中:委派事件会减少对MO的需要吗?是的,这样效果更好。谢谢,我以前从未使用过委派事件。只要我只想在消息的第一行中找到一个词,这似乎就很有效。如果第二行之间有换行符,这似乎不太好。此外,我会你能提供一个委托活动的示例吗?我真的很感兴趣。我只有一个委托的点击活动在工作;关键事件不工作的原因我还不明白。我用换行符修复了这个问题;编辑了答案,谢谢,我已经添加并奖励了你自己,就像你给我的大部分奖励一样我一直在寻找什么,以及在大多数情况下找到它的可靠方法。我仍在剖析答案,但它在大多数情况下都有效(不幸的是,除了一个非常挑剔的案例)。不过,如果您能提供有关委托单击处理程序的任何进展的更新,我将不胜感激。
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());
});