在firefox扩展页面内提交表单

时间:2019-06-11 08:00:52

标签: javascript node.js firefox-addon firefox-webextensions

我正在开发一个简单的Firefox扩展。我有一个页面,其中包含用于输入用户名的表单。当用户单击浏览器操作按钮时,该页面打开。该文件中有一个javascript文件,我想从该文件中将该名称发送到后端Node.Js服务器。但是我不知道如何执行表单提交,我尝试了不同的方法,但是对我没有任何帮助。
这是我的manifest.json文件:

{
  "manifest_version": 2,
  "name": "Ext",
  "version": "1.0",
  "description": "My Experiments.",
  "icons": {
    "48": "icons/ff.jpg"
  },
  "permissions": [
    "webRequest",
    "storage",
    "alarms",
    "tabs",
    "notifications",
    "activeTab",
    "<all_urls>"
  ],
  "background": {
    "scripts": [
      "background-script.js"
    ]
  },
  "browser_action": {
    "default_icon": "icons/toggle-off.png",
    "default_title": "EXT"
  }

}

这是我的index.html文件,要提交的表单位于其中。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>Firefox Extension</title>
    <link href="https://fonts.googleapis.com/css?family=Montserrat" rel="stylesheet">
    <link rel="stylesheet" href="form.css">
</head>
<body>
<div class="container">
    <div id="form-main">
        <div id="form-div">
            <p class="desc">Thank you for installing our Extension!</p>
            <form class="montform" id="reused_form">
                <div class="group">
                    <input name="name" type="text" class="feedback-input" required id="name" autocomplete="off"/>
                    <span class="highlight"></span>
                    <span class="bar"></span>
                    <label> Please tell your name</label>
                </div>
                 <div class="submit">
                     <button type="submit" class="button-blue"><img src="../icons/right-arrow.png"></button>
                 </div>
            </form>
        </div>
    </div>
</div>
<script src="js/index.js"></script>
</body>
</html>

这是我要提交表单的index.js文件。

document.addEventListener("click", (e) => {
    console.log(e.target)
    if (e.target.classList.contains("button-blue")) {
    console.log("sss")
    e.preventDefault();
    var xhr = new XMLHttpRequest();
    let savedItem = browser.storage.local.get("ip");
    savedItem.then(function (item) {
        document.getElementById('ip').value = item.ip;
        xhr.addEventListener("load", reqListener);
        xhr.open('POST', 'http://localhost:2056/save/name', true);
        xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
        xhr.send(`name=${document.getElementById('name').value}&&ip=${item.ip}`);
        return false;
    });

    }
});

function reqListener() {
    const resp = JSON.parse(this.responseText);
    if (resp.error)
        console.error(resp.errorMsg);
    else {
        browser.tabs.query({active: true, currentWindow: true})
            .then(function (tabs) {
                browser.tabs.remove(tabs[0].id);
                browser.tabs.create({
                    url: './pages/second_page.html'
                });
            });
    }
}

我没有从e.target那里得到任何东西,它在控制台时显示<unavailable>

1 个答案:

答案 0 :(得分:0)

我不确定是什么原因导致了您的问题,我根据您的评论创建了一个扩展程序,从您的代码中删除了一些额外的行,它在Chrome和Firefox中对我是否有效:

enter image description here

这是我使用的JavaScript代码:

document.addEventListener("click", (e) => {
    e.preventDefault();
    console.log('e.target: ',e.target)
});

您能否重新检查代码或与我们共享完整的项目?