javascript - 使用 Chrome 扩展将元素添加到完全加载的 DOM
问题描述
我正在制作一个简单的 chrome 扩展,将表单元素添加到页面。我想把表单放在一个特定的地方,就在页面上由 JS 加载的其他一些元素的正上方。所以,我的计划是等到所有这些元素都加载完毕,然后插入我的表单,但这非常不一致。
该扩展程序运行一个内容脚本“start.js”,它将表单 HTML 和 CSS 添加到页面,并将另一个脚本“inject.js”附加到文档正文。这是代码:
addFormHTML();
addFormStyle();
addFormScript();
function addFormHTML () {
var form = document.createElement('form');
var input = document.createElement('input');
var btn = document.createElement('button');
var searchIcon = document.createElement('i');
form.setAttribute("class", "example");
form.setAttribute("action", "/contact");
form.setAttribute("method", "POST");
btn.setAttribute("type", "submit");
searchIcon.setAttribute("class", "fa fa-search");
Object.assign(input, {
type : "text",
placeholder: "Search the stream",
name : "search"
});
btn.appendChild(searchIcon);
form.appendChild(input);
form.appendChild(btn);
document.body.appendChild(form);
}
function addFormStyle() {
var styleLink = document.createElement("link");
styleLink.setAttribute("rel", "stylesheet");
styleLink.setAttribute("href", chrome.runtime.getURL('searchStyle.css'));
var imgStyle = document.createElement("link");
imgStyle.setAttribute("rel", "stylesheet");
imgStyle.setAttribute("href", "https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css");
document.head.appendChild(styleLink);
document.head.appendChild(imgStyle);
}
function addFormScript () {
var inject = document.createElement('script');
inject.src = chrome.runtime.getURL('inject.js');
document.body.appendChild(inject);
console.log(inject)
}
inject.js 侦听窗口的“加载”事件,然后尝试将表单元素移动到所需位置。问题是,即使在这一切之后,它仍然说我要在之前插入表单的元素是空的。这是代码:
listenAndLoad();
function listenAndLoad() {
window.addEventListener("load", function() {
var form = document.getElementsByTagName("form")[0];
var main = document.getElementById("ow43");
main.insertBefore(form, main.children[1]);
});
}
这是我的清单:
{
"name": "Google Classroom Searchbar",
"version": "1.0",
"description": "A search bar for the google classroom assignments stream",
"manifest_version": 2,
"permissions": [
"activeTab",
"contextMenus",
"tabs"
],
"content_scripts": [
{
"run_at": "document_end",
"matches": ["https://classroom.google.com/u/*/c/*"],
"js": ["start.js"]
}
],
"web_accessible_resources": [
"inject.js",
"searchStyle.css"
]
}
我也尝试过在 start.js 中简单地运行 inject.js 代码,但这也不起作用。我在 Ubuntu 上的 Chromium 上的谷歌课堂页面上使用它。
解决方案
至少在这种情况下,答案是通过设置间隔等到我想要的元素被加载。这是我使用的代码:
var form = document.getElementsByTagName("form")[0];
var intervalID = setInterval(function() {
targetDiv = document.getElementById("ow43");
if (targetDiv != null) {
console.log(targetDiv);
targetDiv.insertBefore(form, targetDiv.children[1]);
clearInterval(intervalID);
}
}, 2000);
推荐阅读
- vue.js - Chrome 不下载存档文件(zip)
- asynchronous - 在 actix-web 中生成从多部分读取数据
- python - 如何在 Python Pandas DataFrame 中选择日期在索引中的行?
- javascript - 访问由单元格渲染器创建的网格的 gridOptions
- python - Kivy:我无法访问 ScreenManager 中存储的所有屏幕
- material-design - MaterialButton 样式 shapeAppearance 不起作用
- sql - 无法转换为日期,收到“ORA-01855:需要 AM/AM 或 PM/PM”错误消息
- linux - 将 netcat 输出发送到光标位置
- python - 熊猫数据框自定义格式字符串到时间
- xml - 如何使用 xslt 按功能将元素的值与其他兄弟姐妹的值进行比较