#javascript #html #google-chrome-extension
Вопрос:
Расширяю расширение Chrome, и я пытаюсь захватить элемент из внешнего HTML — файла и манипулировать им. Этот HTML-файл был добавлен web_accessories
в файл manifest.json, но всякий раз, когда я пытаюсь, ничего не происходит, есть ли что-то, что я упускаю или делаю неправильно?
Где я пытаюсь получить элемент
// Load in HTML file
fetch(chrome.runtime.getURL("findfont.html"))
.then(r => r.text())
.then(html => {
showModal();
const fontName = document.querySelector('.font-name');
fontName.innerText = "red";
});
полный Content.js
let toggleIsOn = false;
const elementIsReady = "special-flag";
// Receiving message from popup.js
chrome.runtime.onMessage.addListener(
function (request, sender, sendResponse) {
toggleIsOn = request.switchStatus === "on";
registerEventHandlers();
}
);
function registerEventHandlers() {
const allText = document.querySelectorAll('h1, h2, h3, h4, h5, p, li, td, caption, span');
for (let i = 0; i < allText.length; i ) {
const element = allText[i];
if (!element.hasAttribute(elementIsReady)) {
element.addEventListener('mouseover', async () => {
if (!toggleIsOn){
element.style.cursor = null;
return;
}
const colors = ['#ffadad', '#ffd6a5', '#fdffb6', '#caffbf', '#bdb2ff', '#9fdfff'];
element.style.backgroundColor = colors[Math.floor(Math.random() * colors.length)];
element.style.cursor = "pointer";
});
element.addEventListener('mouseout', async () => {
if (!toggleIsOn) return;
element.style.backgroundColor = null;
});
element.addEventListener('click', async (e) => {
if (!toggleIsOn) return;
const showModal = async () => {
const modal = document.createElement('dialog');
modal.setAttribute(
"style",`
border: none;
border-radius:20px;
background-color:#fafafa;
opacity:1;
animation:fadeMe 0.4s;
position:absolute;
z-index:10000000000000;
box-shadow: rgba(0, 0, 0, 0.2) 0px 18px 50px -10px;
`);
modal.innerHTML =
`
<iframe id="popup-content" scrolling="no" style="height:155px; width:347px; z-index:10000000000000; animation:fadeMe 0.4s;" frameBorder="0">
</iframe>
`;
modal.style.top = e.pageY "px";
modal.style.left = e.pageX "px";
document.body.appendChild(modal);
const dialog = document.querySelector("dialog");
dialog.show();
document.body.addEventListener('click', () => {
document.body.removeChild(modal);
dialog.close();
});
const iframe = document.getElementById("popup-content");
iframe.src = chrome.extension.getURL("findfont.html")
}
// Load in HTML file
fetch(chrome.runtime.getURL("findfont.html"))
.then(r => r.text())
.then(html => {
showModal();
const fontName = document.querySelector('.font-name');
fontName.innerText = "text";
});
});
element.setAttribute(elementIsReady, true);
}
}
}
Внешний 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.0">
<link rel="stylesheet" href="content.css">
<title>Find Font Modal</title>
</head>
<body id="dontChange">
<div class="modal-div" id="modal">
<div>
<div class="font-name">Font Name</div>
<div class="foundry-name">The Foundry Name</div>
</div>
<div class="line"></div>
<div class="buttons">
<button class="tryfont-btn" id="tryfont">Try out this Font</button>
</div>
</div>
<script src="findfont.js"></script>
</body>
</html>
Комментарии:
1. При вызове этой выборки:
fetch(chrome.runtime.getURL("findfont.html"))
он ищет html-файл в каталоге расширений относительно корня расширения, например, предположим, что идентификатор расширенияxyz
-это URL-адрес, который вы получитеchrome-extension://xyz/findfont.html
. (1) Это то место, где должен находиться/должен находиться HTML-файл, или он внешний, как на каком-то сервере? (2) возвращает ли выборка 200? вы можете связать улов в цепочку после вкладки «Затем проверить или проверить сеть».2. Хорошо, 1) Нет, по крайней мере, я так не думаю. HTML-файл не находится ни в какой папке и не размещен извне, он находится в корневом каталоге со всеми другими файлами, и 2) Да, выборка возвращает 200