Javascript 如何在contextMenus onclick事件处理程序中获取iframeId?

Javascript 如何在contextMenus onclick事件处理程序中获取iframeId?,javascript,google-chrome-extension,firefox-addon-webextensions,Javascript,Google Chrome Extension,Firefox Addon Webextensions,我正在开发一个Mozilla Web扩展。我只想将一个JavaScript文件插入到我单击了使用contextMenus.create()创建的上下文菜单选项的框架中 我正在使用: browser.contextMenus.create({ "title": "Records", "contexts": ["all","link"], "id" : "M1", "onclick": onClickContextMenu, }, function() { });

我正在开发一个Mozilla Web扩展。我只想将一个JavaScript文件插入到我单击了使用
contextMenus.create()
创建的上下文菜单选项的框架中

我正在使用:

browser.contextMenus.create({
    "title": "Records",
    "contexts": ["all","link"],
    "id" : "M1",
    "onclick": onClickContextMenu,
}, function() { });

function onClickContextMenu(info, tab){

    var clickedFrameID=""; //How do I get the actual frameId where click occurred?

    browser.tabs.executeScript(tab.id,{
                        file: "fileName.js",
                        allFrames: false,
                        frameId: clickedFrameID
                     }, function() {
        console.log("Script injected");
    });
}

如何获取
clickedFrameID

在对我(Chandrakant Thakkar)和我的团队领导Nitin Makwana先生进行了大量测试后,找到了解决这种情况的方法

首先,我将manifest.json文件中的“messageListener.js”文件作为

"content_scripts": [
{
        "matches": ["https://*/*","http://*/*"],
        "css":["jquery-ui.css"],
        "js": [
            "jquery.js",
            "jquery-ui.js",              
            "content_scripts/msg_listener.js"
        ],
        "all_frames":true
}
然后在“messageListener.js”文件中创建“contextMenu”侦听器,并在我单击contextMenu(鼠标右键单击)时将消息发送到后台js文件 作为

在这里,”abc@gmail.com“是我要发送消息的web扩展的id

然后,在我的背景js文件中,我声明了名为“clickedFrameID”的全局变量,并在同一个文件中添加了OnMessageListener,如下所示

browser.runtime.onMessage.addListener(
    function(msg, sender, callback) {
         if(msg.type === 'onContextMenuClicked')
            {
               if(sender.hasOwnProperty("frameId")){
                   clickedFrameID=sender.frameId;
               }else{
                   clickedFrameID="";
               }
            }
}); 
现在我已经在特定的框架中注入了“fileName.js”文件,如下所示

   var clickedFrameID=""; //This is a Global Variable
   browser.contextMenus.create({
     "title": "Records",
     "contexts": ["all","link"],
     "id" : "M1",
     "onclick": onClickContextMenu,
   }, function() { });

 function onClickContextMenu(info, tab){
     var options={};
    if(clickedFrameID !="" && clickedFrameID!=null && 
     clickedFrameID!=undefined )
                    {
                        options={
                        file: "fileName.js",
                        allFrames: false,
                        frameId: clickedFrameID
                      };
                    }


   browser.tabs.executeScript(tab.id,options, function() {
     console.log("Script injected");
   });
 }
现在,“fileName.js”将被注入到我右键单击的特定框架中


感谢@wOxxOm、@MohammedAshrafali、@Makyen在做了这么多测试之后对我感兴趣

,我的团队领导Nitin Makwana先生找到了解决这种情况的方法

首先,我将manifest.json文件中的“messageListener.js”文件作为

"content_scripts": [
{
        "matches": ["https://*/*","http://*/*"],
        "css":["jquery-ui.css"],
        "js": [
            "jquery.js",
            "jquery-ui.js",              
            "content_scripts/msg_listener.js"
        ],
        "all_frames":true
}
然后在“messageListener.js”文件中创建“contextMenu”侦听器,并在我单击contextMenu(鼠标右键单击)时将消息发送到后台js文件 作为

在这里,”abc@gmail.com“是我要发送消息的web扩展的id

然后,在我的背景js文件中,我声明了名为“clickedFrameID”的全局变量,并在同一个文件中添加了OnMessageListener,如下所示

browser.runtime.onMessage.addListener(
    function(msg, sender, callback) {
         if(msg.type === 'onContextMenuClicked')
            {
               if(sender.hasOwnProperty("frameId")){
                   clickedFrameID=sender.frameId;
               }else{
                   clickedFrameID="";
               }
            }
}); 
现在我已经在特定的框架中注入了“fileName.js”文件,如下所示

   var clickedFrameID=""; //This is a Global Variable
   browser.contextMenus.create({
     "title": "Records",
     "contexts": ["all","link"],
     "id" : "M1",
     "onclick": onClickContextMenu,
   }, function() { });

 function onClickContextMenu(info, tab){
     var options={};
    if(clickedFrameID !="" && clickedFrameID!=null && 
     clickedFrameID!=undefined )
                    {
                        options={
                        file: "fileName.js",
                        allFrames: false,
                        frameId: clickedFrameID
                      };
                    }


   browser.tabs.executeScript(tab.id,options, function() {
     console.log("Script injected");
   });
 }
现在,“fileName.js”将被注入到我右键单击的特定框架中


感谢@wOxxOm、@MohammedAshrafali、@Makyen关注

是的,我也面临同样的问题。有什么解决办法吗?Thanx。对不起,先生,我在contextMenus中执行的操作单击了事件浏览器。contextMenus。创建({“标题”:“记录”,“上下文”:[“全部”,“链接],“id”:“M1”,“onclick”:onClickContextMenu,},function(){});onClickContextMenu在这个方法中,我注入fileName.js文件,但这里我没有得到当前iframe的帧ID,这里我得到的是“info”和“tab”对象,但不是iFrameId@ChandrakantThakkar然后在你的问题中指定这些信息,而不仅仅是在评论中。因为你现在的问题太广泛了,可能已经结束了。如果您想清楚地说明(并在代码中显示)这是由于在
上下文菜单
项中单击而执行的,那么这可以通过一种方式来回答。我已编辑了您的问题,将您(或多或少)在注释中提供的代码包括在内。如果这不是您想要传达的内容,请回答问题,或者回滚我的编辑。@Makyen您在我的问题代码中添加注释也是正确的。。。谢谢……是的,我也面临同样的问题。有什么解决办法吗?Thanx。对不起,先生,我在contextMenus中执行的操作单击了事件浏览器。contextMenus。创建({“标题”:“记录”,“上下文”:[“全部”,“链接],“id”:“M1”,“onclick”:onClickContextMenu,},function(){});onClickContextMenu在这个方法中,我注入fileName.js文件,但这里我没有得到当前iframe的帧ID,这里我得到的是“info”和“tab”对象,但不是iFrameId@ChandrakantThakkar然后在你的问题中指定这些信息,而不仅仅是在评论中。因为你现在的问题太广泛了,可能已经结束了。如果您想清楚地说明(并在代码中显示)这是由于在
上下文菜单
项中单击而执行的,那么这可以通过一种方式来回答。我已编辑了您的问题,将您(或多或少)在注释中提供的代码包括在内。如果这不是您想要传达的内容,请回答问题,或者回滚我的编辑。@Makyen您在我的问题代码中添加注释也是正确的。。。谢谢