0

我正在编写我的第一个 Chrome 扩展程序,它使用上下文菜单(右键单击并出现选项)。当突出显示文本并从右键单击菜单中选择 ExtensionName 选项时,它会打开一个新选项卡并将其作为查询传递给我的组织拥有的目录。问题是它只工作一次。当文本被突出显示并右键单击时,上下文菜单中的选项仍会出现,但选择 ExtensionName 选项无法生成包含目录结果的另一个选项卡。

我希望用户能够在浏览器会话中根据需要多次使用它,就像大多数其他 Chrome 扩展一样。在 Chrome 扩展程序菜单中重新加载扩展程序可以解决此问题。我认为这与我的后台脚本中发生的事件处理有关rightclick.js。我对 JavaScript 或 Chrome 上下文中的事件处理不太熟悉,因此我们将不胜感激。

清单.json

{
    "name": "ExtensionName",
    "description": "Right-click text to search the given directory.",
    "manifest_version": 2,
    "version": "1.0",
    "permissions": ["contextMenus"],
    "icons": {
        "16": "icon-bitty.png",
        "48": "icon-small.png",
        "128": "icon-large.png"
    },
    "background": {
        "scripts": ["rightclick.js"]
    }
}

右键单击.js

var selection_callbacks = []; 

chrome.extension.onMessage.addListener(function (request) { 
    var callback = selection_callbacks.shift(); 
    callback(request); 
});


function getSelection(callback) { 
    selection_callbacks.push(callback); 
    chrome.tabs.executeScript(null, { file:"selection.js" }); 
};

function createDirectoryRequest(selectText) {
    var form = document.createElement("form");
    form.setAttribute("method", "post");
    form.setAttribute("action", "THE URL FOR THE DIRECTORY GOES HERE");
    form.setAttribute("target", "_blank");

    var hiddenField = document.createElement("input");
    hiddenField.setAttribute("id", "search_generic_search_terms);");        
    hiddenField.setAttribute("name", "search[generic_search_terms]");
    hiddenField.setAttribute("value", selectText);
    form.appendChild(hiddenField);
    document.body.appendChild(form);        
    form.submit();

}

chrome.contextMenus.create({title: 'ExtensionName "%s"', 
                    contexts:["selection"], 
                    onclick: function(info, tab){ createDirectoryRequest(info.selectionText); }})

选择.js

chrome.extension.sendResponse(window.getSelection().toString());

我知道这可能不是一个难题,我对此非常陌生,因此将不胜感激。谢谢。

4

1 回答 1

0

这里的问题是您尝试多次提交具有不同值的表单。基于Submitting HTML form multiple times with different values,您所要做的就是给表单的目标一个唯一的值并在提交表单之前打开一个新选项卡:

右键单击.js

var i = 0;

function createDirectoryRequest(selectText) {
    var form = document.createElement("form");
    form.setAttribute("method", "post");
    form.setAttribute("action", "THE URL FOR THE DIRECTORY GOES HERE");

    // unique target for each form; open it in a new tab
    form.setAttribute("target", "window" + i);
    window.open("THE URL FOR THE DIRECTORY GOES HERE", "window" + i);
    i++;

    var hiddenField = document.createElement("input");
    hiddenField.setAttribute("id", "search_generic_search_terms);");        
    hiddenField.setAttribute("name", "search[generic_search_terms]");
    hiddenField.setAttribute("value", selectText);
    form.appendChild(hiddenField);
    document.body.appendChild(form);        
    form.submit();
}

请注意,您可以只创建一个表单,并在提交之前简单地更改其属性,而不是每次都创建一个全新的表单:

var i = 0;

var form = document.createElement("form");
form.setAttribute("method", "post");
form.setAttribute("action", "THE URL FOR THE DIRECTORY GOES HERE");

var hiddenField = document.createElement("input");
hiddenField.setAttribute("id", "search_generic_search_terms);");        
hiddenField.setAttribute("name", "search[generic_search_terms]");
form.appendChild(hiddenField);
document.body.appendChild(form);   

function createDirectoryRequest(selectText) {
    form.setAttribute("target", "window" + i);
    window.open("THE URL FOR THE DIRECTORY GOES HERE", "window" + i);
    i++;

    hiddenField.setAttribute("value", selectText);    
    form.submit();
}
于 2013-10-15T19:01:27.813 回答