【问题标题】:How to retrieve the element where a contextmenu has been executed if i have only background script?如果我只有后台脚本,如何检索执行上下文菜单的元素?
【发布时间】:2016-03-28 19:57:15
【问题描述】:

好像和那个问题How to retrieve the element where a contextmenu has been executed类似 但我什么也得不到,请帮帮我。

 var clickedEl;
document.addEventListener("mousedown", function(event){
        //right click
        if(event.button == 2) { 
            clickedEl = event.target;
        }
        }, true);
var imageSourceUrl;
function getClickHandler() {
    "use strict";

    return function (info, tab) {

 if(tab.url.indexOf('https://vk.com') > -1){
        if(clickedEl.parentNode.href.indexOf('photo') > -1){
        var photoalbumid = clickedEl.parentNode.href.substring(clickedEl.parentNode.href.lastIndexOf("o")+1);

            var getphoto = new XMLHttpRequest();

            getphoto.open('GET', 'https://api.vk.com/method/photos.getById?photos=' + photoalbumid);

            getphoto.onload = function () {

            var answer = JSON.parse(getphoto.response);

            if (answer.response[0].src_big === undefined) {
                thereIsAnError('hueta s polucheniem url img', answer, imageUrl);
                return;
            }
            imageSourceUrl =  decodeURIComponent(answer.response[0].src_big);                                           

            }                                    

            getphoto.send();
    }
}
if(imageSourceUrl === undefined) imageSourceUrl  = info.srcUrl;

           var imageUploadHelperUrl = 'upload.html#',
            vkCLientId           = '128593',
            vkRequestedScopes    = 'docs,offline,groups,stats,photos',
            vkAuthenticationUrl  = 'https://oauth.vk.com/authorize?client_id=' + vkCLientId + '&scope=' + vkRequestedScopes + '&redirect_uri=http%3A%2F%2Foauth.vk.com%2Fblank.html&display=page&response_type=token';

        chrome.storage.local.get({'vkaccess_token': {}}, function (items) {

            if (items.vkaccess_token.length === undefined) {
                chrome.tabs.create({url: vkAuthenticationUrl, active:false}, function (tab) {
                    chrome.tabs.onUpdated.addListener(listenerHandler(tab.id, imageSourceUrl));
                });

                return;
            }

            imageUploadHelperUrl += imageSourceUrl + '&' + items.vkaccess_token;

            chrome.tabs.create({url: imageUploadHelperUrl, active:false}); 
        });
    };
}

 * Handler of chrome context menu creation process -creates a new item in the context menu
 */
chrome.contextMenus.create({
    "title": "Rehost on vk.com",
    "type": "normal",
    "contexts": ["image"],
    "onclick": getClickHandler()
});

chrome 说“contextMenus 的事件处理程序出错:TypeError:无法读取未定义的属性 'parentNode' 在“ if(clickedEl.parentNode.href.indexOf('photo') ”行.... 如何在 getClickHandler() 中访问更改后的 clickedEl?

        //background 
var imageSourceUrl;
function getClickHandler() {
    "use strict";

    return function (info, tab) { 
        if(tab.url.indexOf('https://vk.com') > -1){
            chrome.tabs.query({active: true, currentWindow: true}, function(tabs) {
                chrome.tabs.sendMessage(tabs[0].id, {imghref : "gimmemore"}, function(response) {
                    imageSourceUrl = response.imaged;
                    console.log(response.imaged);
                });
            });
        }
        else{imageSourceUrl=info.srcUrl;}
        var imageUploadHelperUrl = 'upload.html#',
            vkCLientId           = '5118087',
            vkRequestedScopes    = 'docs,offline,groups,stats,photos',
            vkAuthenticationUrl  = 'https://oauth.vk.com/authorize?client_id=' + vkCLientId + '&scope=' + vkRequestedScopes + '&redirect_uri=http%3A%2F%2Foauth.vk.com%2Fblank.html&display=page&response_type=token';

        chrome.storage.local.get({'vkaccess_token': {}}, function (items) {

            if (items.vkaccess_token.length === undefined) {
                chrome.tabs.create({url: vkAuthenticationUrl, active:false}, function (tab) {
                    chrome.tabs.onUpdated.addListener(listenerHandler(tab.id, imageSourceUrl));
                });

                return;
            }

            imageUploadHelperUrl += imageSourceUrl + '&' + items.vkaccess_token;

            chrome.tabs.create({url: imageUploadHelperUrl, active:false}); 
        });
    };
}


    //content script
var clickedEl = null;
var photoalbumid = null;
document.addEventListener("mousedown", function(event){
       //right click
        if(event.button == 2) { 
            clickedEl = event.target;
            if(clickedEl.parentNode.href.indexOf('photo') > -1){
                photoalbumid = clickedEl.parentNode.href.substring(clickedEl.parentNode.href.lastIndexOf("o")+1);
                if (photoalbumid.indexOf('?') > -1) {
                    photoalbumid = photoalbumid.slice(0, photoalbumid.indexOf('?'));
                }
            }
            console.log(photoalbumid);
        }
        }, true);
                var getphoto = new XMLHttpRequest();

                getphoto.open('GET', 'https://api.vk.com/method/photos.getById?photos=' + photoalbumid);

                getphoto.onload = function () {

                var answer = JSON.parse(getphoto.response);

                if (answer.response[0].src_big === undefined) {
                thereIsAnError('hueta s polucheniem url img', answer, imageUrl);
                }
                imageSourceUrl =  decodeURIComponent(answer.response[0].src_big);                                           
                }                                    
                getphoto.send();

chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) {
    if(request.imghref == "gimmemore") {
        sendResponse({imaged : imageSourceUrl });
    }
});

重读后的改动^

【问题讨论】:

  • 你撕掉了相关代码。当getClickHandler 被调用时,没有什么可以解释的。您能否解释一下此代码在您的扩展程序中的位置,并对其进行编辑以使其在逻辑上完整? “内在”细节无所谓,但代码应该是完整的。
  • @Xan 添加了 getClickHandler

标签: javascript dom google-chrome-extension contextmenu vk


【解决方案1】:

您错过了原始答案中 cmets 解释代码如何在扩展部分之间拆分的部分:

//content script
/* ... */

//background
/* ... */

您需要(重新)阅读Architecture Overview 以更好地了解 Chrome 扩展程序的结构。

这里发生的情况是,点击事件实际上从未在您的后台发生 - 它发生在实际页面中,您可以使用内容脚本捕获它。

但内容脚本不能用作上下文菜单事件的侦听器。你需要背景。所以,这里的(必需的)逻辑是:

  1. 在页面中,点击监听器准备信息。
  2. 发生上下文菜单点击,后台事件监听器触发。
  3. 后台脚本向内容脚本请求信息。
  4. 内容脚本接收请求,回复信息。
  5. 后台脚本接收回复,处理数据。

考虑到这一点,请阅读Overview(这次是全部内容),然后再阅读the original question

【讨论】:

  • 也许你知道数组 tabs[0] 中的另一个元素是什么意思?有什么方法可以定义 chrome.tabs.query 只能在 vk.com 上执行?亲爱的 Xan,我知道在我的情况下需要内容脚本......但我仍然收到错误“无法加载资源:net::ERR_FILE_NOT_FOUND”“chrome-extension://idmmkbnmabiljdhhjniiihglbghhegpi/undefined”请指导我应该阅读什么还是重新阅读理解?
  • 对不起,我刚刚插入了一些更改。但它仍然没有工作......当我试图从 vk 重新托管图像时,没有任何效果。但是,当我从其他域重新托管图片并获取 info.srcUrl,然后我尝试从 vk.com 获取图片时,它会重新保存之前保存的图片...我是 javascript 的新手,我无法得到缺少的东西
  • 亲爱的,请帮帮我,我还是不明白我的代码出了什么问题
猜你喜欢
  • 2016-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多