Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/google-chrome/4.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 如何从Chrome扩展中获取输入字段值_Javascript_Google Chrome_Google Chrome Extension - Fatal编程技术网

Javascript 如何从Chrome扩展中获取输入字段值

Javascript 如何从Chrome扩展中获取输入字段值,javascript,google-chrome,google-chrome-extension,Javascript,Google Chrome,Google Chrome Extension,我正在学习如何建立一个谷歌浏览器扩展。我在网页上有一个用于测试的联系人表单。我正在尝试创建一个扩展,它将从该表单中读取输入字段值。目前,我有: manifest.json { "manifest_version": 2, "name": "Contact Form Friend", "description": "This extension gets contact form info.", "version": "1.0", "browser_ac

我正在学习如何建立一个谷歌浏览器扩展。我在网页上有一个用于测试的联系人表单。我正在尝试创建一个扩展,它将从该表单中读取输入字段值。目前,我有:

manifest.json

{
    "manifest_version": 2,

    "name": "Contact Form Friend",
    "description": "This extension gets contact form info.",
    "version": "1.0",

    "browser_action": {
      "default_icon": "icon.png",
      "default_popup": "popup.html"
    },

    "permissions": [
      "activeTab",
      "<all_urls>"
    ]
  }
{
    "manifest_version": 2,
    "name": "Contact Form Friend",
    "description": "This extension gets contact form info.",
    "version": "1.0",

    "browser_action": {
        "default_icon": "icon.png",
        "default_popup": "popup.html"
    },

    "permissions": [
        "activeTab",
        "<all_urls>"
    ],

    "content_scripts": [
        {
            "matches": ["http://*/*", "https://*/*"],
            "js": ["content.js"]
        }
    ]
}
{
“清单版本”:2,
“姓名”:“联系方式朋友”,
“描述”:“此扩展获取联系人表单信息。”,
“版本”:“1.0”,
“浏览器操作”:{
“默认图标”:“icon.png”,
“默认弹出窗口”:“popup.html”
},
“权限”:[
“活动标签”,
""
]
}
popup.html

<!doctype html>
<html>
  <head>
    <title>Getting Started Extension's Popup</title>
    <style type="text/css">
      body {
        margin: 10px;
        white-space: nowrap;
      }

      h1 {
        font-size: 15px;
      }

      #container {
        align-items: center;
        display: flex;
        justify-content: space-between;
      }
    </style>

    <script src="popup.js"></script>
  </head>

    <body>
        <h1>Info</h1>
        <div id="info">

        </div>
    </body>
</html>

入门扩展的弹出窗口
身体{
利润率:10px;
空白:nowrap;
}
h1{
字体大小:15px;
}
#容器{
对齐项目:居中;
显示器:flex;
证明内容:之间的空间;
}
信息
popup.js

function getHost() {
    return document.documentElement;
}

document.addEventListener('DOMContentLoaded', () => {
    const infoDisplay = document.getElementById('info');    
    const scriptToRun = `(${getHost})()`;

    // Run the script in the context of the tab
    chrome.tabs.executeScript({
      code: scriptToRun 
    }, (result) => {            
      var values = [];

      var inputFields = result.getElementsByTagName('input');
      infoDisplay.innerHTML = 'inputs: ' + inputFields.length;
      for (var i = 0; i < inputFields.length; i++) {
        values.push(inputFields[i].value);
      }

      infoDisplay.innerHTML += '<br />fields: ' + values.length;
    });
});
$(function() {
    $('#btn_check').click(function() { checkCurrentTab(); });
});

function checkCurrentTab() {
    chrome.tabs.query({'active': true, 'lastFocusedWindow': true}, function (tabs) {
        var url = tabs[0].url;
        console.log("checkCurrentTab: "+url);
        $(".pg_url").text(url);

        // request content_script to retrieve title element innerHTML from current tab
        chrome.tabs.sendMessage(tabs[0].id, "getHeadTitle", null, function(obj) {
            console.log("getHeadTitle.from content_script:", obj);
            log("from content_script:"+obj);
        });

    });
}

document.addEventListener('DOMContentLoaded', function () {
    chrome.windows.getCurrent(function (currentWindow) {
        chrome.tabs.query({active: true, windowId: currentWindow.id}, function(activeTabs) {
            // inject content_script to current tab
            chrome.tabs.executeScript(activeTabs[0].id, {file: 'content_script.js', allFrames: false});
        });
    });
});

function log(txt) {
    var h = $("#log").html();
    $("#log").html(h+"<br>"+txt);
}
// you will see this log in console log of current tab in Chrome when the script is injected
console.log("content_script.js");

chrome.runtime.onMessage.addListener(function(cmd, sender, sendResponse) {
    console.log("chrome.runtime.onMessage: "+cmd);
    switch(cmd) {
    case "getHtml":
        // retrieve document HTML and send to popup.js
        sendResponse({title: document.title, url: window.location.href, html: document.documentElement.innerHTML});
        break;
    case "getHeadTitle":
        // retrieve title HTML and send to popup.js
        sendResponse(document.getElementsByTagName("title")[0].innerHTML);
        break;      
    default:
        sendResponse(null);
    }
});
document.addEventListener('DOMContentLoaded', () => {
    const infoDisplay = document.getElementById('info');    
    const scriptToRun = `
        var values = [];
        var inputFields = document.getElementsByTagName('input');
        for (var i = 0; i < inputFields.length; i++) {
            values.push(inputFields[i].value);
        }
        values;`;  //all this code will be run on the tab page
                   //and the array "values" will be returned.

    chrome.tabs.executeScript({
      code: scriptToRun 
    }, (result) => {

        infoDisplay.innerHTML = `There are: ${result[0].length} inputs, with these values: <ol><li>${result[0].join("<li>")}`;  
    });
});
document.addEventListener('DOMContentLoaded', () => {
    const infoDisplay = document.getElementById('info');    

    window.addEventListener('DOMContentLoaded', function () {
        chrome.tabs.query({active: true, currentWindow: true}, function (tabs) {
            chrome.tabs.sendMessage(tabs[0].id, {}, function (result) {
                infoDisplay.innerHTML = result
            });
        });
    });

});
chrome.runtime.onMessage.addListener(function (msg, sender, response) {
    var values = [];
    var inputFields = document.getElementsByTagName('input');
    var result = 'inputs: ' + inputFields.length;

    for (var i = 0; i < inputFields.length; i++) {
        values.push(inputFields[i].value);
    }

    result += '<br />fields: ' + values.length;

    response(result)
});
函数getHost(){ 返回document.documentElement; } document.addEventListener('DOMContentLoaded',()=>{ const infoDisplay=document.getElementById('info'); 常量scriptToRun=`(${getHost})(`); //在选项卡的上下文中运行脚本 chrome.tabs.executeScript({ 代码:Scriptorun },(结果)=>{ var值=[]; var inputFields=result.getElementsByTagName('input'); infoDisplay.innerHTML='inputs:'+inputFields.length; 对于(变量i=0;i 当我运行这个程序时,它的行为就像无法从用户所在的网页(而不是扩展的网页)访问输入字段一样。我做错了什么?我错过许可了吗?我不这么认为。然而,它不起作用,我不知道为什么

谢谢你的帮助

如果您的扩展需要与网页交互,那么它需要一个内容脚本。内容脚本是在加载到浏览器的页面上下文中执行的JavaScript。将内容脚本视为加载页面的一部分,而不是其打包的扩展(其父扩展)的一部分

据报道,您需要一个内容脚本来与Chrome选项卡内的网页交互

下面是一个Chrome扩展的示例,其中一个内容脚本向popup.js公开了两个“命令”

有关说明,请参见代码注释

manifest.json(与您的类似)


注意:显然jQuery不是强制性的

您的方法的主要问题是,您试图通过message/sendResponse将DOM树从内容脚本发送到popup/background,以便在那里进行处理。无法通过message/sendResponse发送DOM树

更好的方法是在内容脚本中处理DOM,并将所需信息(在您的示例中是
输入值
值)发送回弹出/背景页面

一种可能的方法是:

popup.js

function getHost() {
    return document.documentElement;
}

document.addEventListener('DOMContentLoaded', () => {
    const infoDisplay = document.getElementById('info');    
    const scriptToRun = `(${getHost})()`;

    // Run the script in the context of the tab
    chrome.tabs.executeScript({
      code: scriptToRun 
    }, (result) => {            
      var values = [];

      var inputFields = result.getElementsByTagName('input');
      infoDisplay.innerHTML = 'inputs: ' + inputFields.length;
      for (var i = 0; i < inputFields.length; i++) {
        values.push(inputFields[i].value);
      }

      infoDisplay.innerHTML += '<br />fields: ' + values.length;
    });
});
$(function() {
    $('#btn_check').click(function() { checkCurrentTab(); });
});

function checkCurrentTab() {
    chrome.tabs.query({'active': true, 'lastFocusedWindow': true}, function (tabs) {
        var url = tabs[0].url;
        console.log("checkCurrentTab: "+url);
        $(".pg_url").text(url);

        // request content_script to retrieve title element innerHTML from current tab
        chrome.tabs.sendMessage(tabs[0].id, "getHeadTitle", null, function(obj) {
            console.log("getHeadTitle.from content_script:", obj);
            log("from content_script:"+obj);
        });

    });
}

document.addEventListener('DOMContentLoaded', function () {
    chrome.windows.getCurrent(function (currentWindow) {
        chrome.tabs.query({active: true, windowId: currentWindow.id}, function(activeTabs) {
            // inject content_script to current tab
            chrome.tabs.executeScript(activeTabs[0].id, {file: 'content_script.js', allFrames: false});
        });
    });
});

function log(txt) {
    var h = $("#log").html();
    $("#log").html(h+"<br>"+txt);
}
// you will see this log in console log of current tab in Chrome when the script is injected
console.log("content_script.js");

chrome.runtime.onMessage.addListener(function(cmd, sender, sendResponse) {
    console.log("chrome.runtime.onMessage: "+cmd);
    switch(cmd) {
    case "getHtml":
        // retrieve document HTML and send to popup.js
        sendResponse({title: document.title, url: window.location.href, html: document.documentElement.innerHTML});
        break;
    case "getHeadTitle":
        // retrieve title HTML and send to popup.js
        sendResponse(document.getElementsByTagName("title")[0].innerHTML);
        break;      
    default:
        sendResponse(null);
    }
});
document.addEventListener('DOMContentLoaded', () => {
    const infoDisplay = document.getElementById('info');    
    const scriptToRun = `
        var values = [];
        var inputFields = document.getElementsByTagName('input');
        for (var i = 0; i < inputFields.length; i++) {
            values.push(inputFields[i].value);
        }
        values;`;  //all this code will be run on the tab page
                   //and the array "values" will be returned.

    chrome.tabs.executeScript({
      code: scriptToRun 
    }, (result) => {

        infoDisplay.innerHTML = `There are: ${result[0].length} inputs, with these values: <ol><li>${result[0].join("<li>")}`;  
    });
});
document.addEventListener('DOMContentLoaded', () => {
    const infoDisplay = document.getElementById('info');    

    window.addEventListener('DOMContentLoaded', function () {
        chrome.tabs.query({active: true, currentWindow: true}, function (tabs) {
            chrome.tabs.sendMessage(tabs[0].id, {}, function (result) {
                infoDisplay.innerHTML = result
            });
        });
    });

});
chrome.runtime.onMessage.addListener(function (msg, sender, response) {
    var values = [];
    var inputFields = document.getElementsByTagName('input');
    var result = 'inputs: ' + inputFields.length;

    for (var i = 0; i < inputFields.length; i++) {
        values.push(inputFields[i].value);
    }

    result += '<br />fields: ' + values.length;

    response(result)
});
document.addEventListener('DOMContentLoaded',()=>{
const infoDisplay=document.getElementById('info');
常量Scriptorun=`
var值=[];
var inputFields=document.getElementsByTagName('input');
对于(变量i=0;i{
infoDisplay.innerHTML=`有:${result[0].length}个输入,输入值为:
  • ${result[0].join(“
  • ”)}`; }); });
  • 以下是您收到的错误:

    Error in response to tabs.executeScript: TypeError: result.getElementsByTagName is not a function
    at Object.chrome.tabs.executeScript [as callback] (chrome-extension://lmaefdnejmkjjmgalgfofdbobhapfmoh/popup.js:15:32)
    at HTMLDocument.document.addEventListener (chrome-extension://lmaefdnejmkjjmgalgfofdbobhapfmoh/popup.js:10:17)
    
    与其尝试在popup.js中获取当前选项卡的DOM,我建议使用内容脚本来完成任务,并将结果作为消息发送到popup

    manifest.json

    {
        "manifest_version": 2,
    
        "name": "Contact Form Friend",
        "description": "This extension gets contact form info.",
        "version": "1.0",
    
        "browser_action": {
          "default_icon": "icon.png",
          "default_popup": "popup.html"
        },
    
        "permissions": [
          "activeTab",
          "<all_urls>"
        ]
      }
    
    {
        "manifest_version": 2,
        "name": "Contact Form Friend",
        "description": "This extension gets contact form info.",
        "version": "1.0",
    
        "browser_action": {
            "default_icon": "icon.png",
            "default_popup": "popup.html"
        },
    
        "permissions": [
            "activeTab",
            "<all_urls>"
        ],
    
        "content_scripts": [
            {
                "matches": ["http://*/*", "https://*/*"],
                "js": ["content.js"]
            }
        ]
    }
    
    popup.js中,向内容脚本发送请求,以获取输入字段的数量,并将响应插入
    div

    content.js

    function getHost() {
        return document.documentElement;
    }
    
    document.addEventListener('DOMContentLoaded', () => {
        const infoDisplay = document.getElementById('info');    
        const scriptToRun = `(${getHost})()`;
    
        // Run the script in the context of the tab
        chrome.tabs.executeScript({
          code: scriptToRun 
        }, (result) => {            
          var values = [];
    
          var inputFields = result.getElementsByTagName('input');
          infoDisplay.innerHTML = 'inputs: ' + inputFields.length;
          for (var i = 0; i < inputFields.length; i++) {
            values.push(inputFields[i].value);
          }
    
          infoDisplay.innerHTML += '<br />fields: ' + values.length;
        });
    });
    
    $(function() {
        $('#btn_check').click(function() { checkCurrentTab(); });
    });
    
    function checkCurrentTab() {
        chrome.tabs.query({'active': true, 'lastFocusedWindow': true}, function (tabs) {
            var url = tabs[0].url;
            console.log("checkCurrentTab: "+url);
            $(".pg_url").text(url);
    
            // request content_script to retrieve title element innerHTML from current tab
            chrome.tabs.sendMessage(tabs[0].id, "getHeadTitle", null, function(obj) {
                console.log("getHeadTitle.from content_script:", obj);
                log("from content_script:"+obj);
            });
    
        });
    }
    
    document.addEventListener('DOMContentLoaded', function () {
        chrome.windows.getCurrent(function (currentWindow) {
            chrome.tabs.query({active: true, windowId: currentWindow.id}, function(activeTabs) {
                // inject content_script to current tab
                chrome.tabs.executeScript(activeTabs[0].id, {file: 'content_script.js', allFrames: false});
            });
        });
    });
    
    function log(txt) {
        var h = $("#log").html();
        $("#log").html(h+"<br>"+txt);
    }
    
    // you will see this log in console log of current tab in Chrome when the script is injected
    console.log("content_script.js");
    
    chrome.runtime.onMessage.addListener(function(cmd, sender, sendResponse) {
        console.log("chrome.runtime.onMessage: "+cmd);
        switch(cmd) {
        case "getHtml":
            // retrieve document HTML and send to popup.js
            sendResponse({title: document.title, url: window.location.href, html: document.documentElement.innerHTML});
            break;
        case "getHeadTitle":
            // retrieve title HTML and send to popup.js
            sendResponse(document.getElementsByTagName("title")[0].innerHTML);
            break;      
        default:
            sendResponse(null);
        }
    });
    
    document.addEventListener('DOMContentLoaded', () => {
        const infoDisplay = document.getElementById('info');    
        const scriptToRun = `
            var values = [];
            var inputFields = document.getElementsByTagName('input');
            for (var i = 0; i < inputFields.length; i++) {
                values.push(inputFields[i].value);
            }
            values;`;  //all this code will be run on the tab page
                       //and the array "values" will be returned.
    
        chrome.tabs.executeScript({
          code: scriptToRun 
        }, (result) => {
    
            infoDisplay.innerHTML = `There are: ${result[0].length} inputs, with these values: <ol><li>${result[0].join("<li>")}`;  
        });
    });
    
    document.addEventListener('DOMContentLoaded', () => {
        const infoDisplay = document.getElementById('info');    
    
        window.addEventListener('DOMContentLoaded', function () {
            chrome.tabs.query({active: true, currentWindow: true}, function (tabs) {
                chrome.tabs.sendMessage(tabs[0].id, {}, function (result) {
                    infoDisplay.innerHTML = result
                });
            });
        });
    
    });
    
    chrome.runtime.onMessage.addListener(function (msg, sender, response) {
        var values = [];
        var inputFields = document.getElementsByTagName('input');
        var result = 'inputs: ' + inputFields.length;
    
        for (var i = 0; i < inputFields.length; i++) {
            values.push(inputFields[i].value);
        }
    
        result += '<br />fields: ' + values.length;
    
        response(result)
    });
    
    chrome.runtime.onMessage.addListener(函数(msg、sender、response){
    var值=[];
    var inputFields=document.getElementsByTagName('input');
    变量结果='输入:'+inputFields.length;
    对于(变量i=0;i
    创建一个名为
    content.js
    的新文件。此文件将被注入网页,并侦听来自popup.js的消息。当消息到达时,它计算响应并将其发送回popup.js


    要了解有关内容脚本的更多信息,请查看。

    此答案无助于OP想要完成的任务:从网页读取一些
    输入值。没有必要把事情搞得太复杂了。@beaver你能看看我的问题吗。扩展中的代码是否执行过?还是说DOM不是你所期望的那样?@Zach Templeton,以下是你问题的答案: