chrome 扩展中的 getElementById

Alo*_*alo 5 javascript onclick

我已经编写了扩展代码,但它不起作用:我无法在文档或扩展弹出窗口中 getElementById。我想当我点击弹出文本扩展程序时开始游戏。HTML代码;

    <!DOCTYPE html>
<html>
<head> 

<style> p {color: purple;} </style>
</head>
<body>
<p id="pocinje"> Ekstenzija je pokrenuta i ceka se vrijeme za pocetak. </p>
<script src="background.js"> </script>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

JAVASCRIPT;

document.getElementById("pocinje").onclick= function() {open};

function open() {
document.getElementById("startNewGame").click();

console.log("alorka");

}
Run Code Online (Sandbox Code Playgroud)

我怎样才能解决这个问题?

Nei*_*eii 9

扩展弹出窗口无法直接与“选项卡”内容(您的网页)交互。

只有“背景”和“内容”脚本可以与“选项卡”内容交互。“弹出”脚本只能向他们发送消息,可以在其中插入另一个脚本(单击“选项卡”内容)。

1/您必须在“弹出”脚本和这些脚本之一之间建立通信

2/ 您的操作必须通过正确的扩展脚本插入到“选项卡”内容中


清单.json:

首先,您必须在清单中声明您想要与选项卡内容进行交互:

"permissions": ["tabs", "<all_urls>"],
Run Code Online (Sandbox Code Playgroud)

其次,您必须声明一个“后台”文件,该文件将用作扩展的核心(仍在清单中),至少可以集中扩展脚本之间的通信:

"background": {
    "scripts": ["background.js"]
},
Run Code Online (Sandbox Code Playgroud)

第三,您必须声明您的“弹出窗口”(仍在清单中):

"browser_action": {
    "default_popup": "popup.html"
}
Run Code Online (Sandbox Code Playgroud)

现在您已经设置了扩展程序,以下是您可以使用的主要脚本:

弹出.html:

弹出窗口插入将与“background.js”通信的“popup.js”文件:

<!DOCTYPE html>
<html>
<head>
    <script type="text/javascript" src="popup.js"></script>
</head>
<body>

    <a id="popupBtn">Click me</a>

</body>
</html>
Run Code Online (Sandbox Code Playgroud)

弹出.js

弹出脚本监听弹出内容的点击,并在触发时向后台发送消息:

// always waits the document to be loaded when shown
document.addEventListener('DOMContentLoaded', function() {

    // opens a communication between scripts
    var port = chrome.runtime.connect();

    // listens to the click of the button into the popup content
    document.getElementById('popupBtn').addEventListener('click', function() {

        // sends a message throw the communication port
        port.postMessage({
            'from': 'popup'
            'start': 'Y'
        });
    });
});
Run Code Online (Sandbox Code Playgroud)

背景.js

后台脚本在弹出窗口与其自身之间创建通信,并抛出“ chrome.runtime ”,并且如果消息正确,则会将代码插入到选项卡内容中:

// opens a communication port
chrome.runtime.onConnect.addListener(function(port) {

    // listen for every message passing throw it
    port.onMessage.addListener(function(o) {

        // if the message comes from the popup
        if (o.from && o.from === 'popup' && o.start && o.start === 'Y') {

            // inserts a script into your tab content
            chrome.tabs.executeScript(null, {

                // the script will click the button into the tab content
                code: "document.getElementById('pageBtn').click();"
            });
        }
    });
});
Run Code Online (Sandbox Code Playgroud)

更多信息请参见:https ://developer.chrome.com/extensions/content_scripts#functionity


Iva*_*van 1

在您的代码中,您正在使用onclick事件处理程序:

element.onclick = functionRef;
Run Code Online (Sandbox Code Playgroud)

其中functionRef是函数:在其他地方声明的函数名称 (1) 或函数表达式 (2)。

- MDN 网络文档

所以你可以:

  1. 使用函数标识符后面的括号调用函数:

    document.getElementById("pocinje").onclick = function() {
        open()
    };
    
    Run Code Online (Sandbox Code Playgroud)
  2. 或者直接将函数传递给属性onclick

    document.getElementById("pocinje").onclick = open
    
    Run Code Online (Sandbox Code Playgroud)