Использование React для изменения содержимого на уже существующей странице с помощью расширения Chrome

Я только начал изучать React и пытался создать расширение для Chrome, используя его. Я пытаюсь создать расширение с кнопкой, onClick которой будет выделять определенные слова на веб-странице. Я могу выделить слова в контенте, который я представляю на странице, но не в том контенте, который уже присутствует на странице

Вот код, который я придумал -

На всплывающем HTML есть кнопка с классом highlight-hazardous-words

popup.js (всплывающее окно расширений):

window.onload = () => {
const $highlightHazardousButton = document.querySelector('.highlight-hazardous-words');

$highlightHazardousButton.onclick = () => {
    // Get active tab
    chrome.tabs.query({
        active: true,
        currentWindow: true,
    }, (tabs) => {
        // Send message to script file
        chrome.tabs.sendMessage(
        tabs[0].id,
        { injectApp: true },
        response => window.close()
);
});
};
};

main.js (здесь находится основное содержимое приложения React):

import React from 'react';
import ReactDOM from 'react-dom';
import Highlighter from "react-highlight-words"

class HighlightHazardous extends React.Component {
    constructor(props) {
        super(props);
        this.state = {searchWords : this.props.searchWords, textToHighlight : this.props.textToHighlight}
    }

    render() {
        return (
            <Highlighter
                highlightClassName = "highlighted-text"
                searchWords = {this.state.searchWords}
                autoEscape = {true}
                textToHighlight = {document.body.innerText}
            />
        )
    }
}
// Message Listener function
chrome.runtime.onMessage.addListener((request, sender, response) => {
    // If message is injectApp
    if (request.injectApp) {
        // Inject our app to DOM and send response
        injectApp();
        response({
            startedExtension: true,
        });
    }
});

function injectApp() {
    const newDiv = document.createElement("div");
    newDiv.setAttribute("id", "chromeExtensionReactApp");
    document.body.appendChild(newDiv);
    ReactDOM.render(<HighlightHazardous searchWords = {['hazardous', 'alcoholic']}/>, newDiv);
}

Здесь добавленный newDiv выделил слова по всему телу страницы, я хочу выделить опасные или алкогольные напитки в любом месте на любой веб-странице, а не в новом div, в основном, я не хочу вводить этот новый div и изменять содержимое страницы уже присутствует.

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
0
1 400
1

Ответы 1

Единственный способ получить доступ к содержимому DOM веб-страницы - использовать компонент Content Scripts, где Расширения Chrome использует сценарии содержимого для упоминания файла JS и CSS в manifest.json, который необходимо внедрить на нижележащую страницу.

Как указано ниже:

The problem with our create-react-app is that the build step will generate the output JS file in different name each time (if the content changed). So we have no way to know the actual file name of the JS file, hence we can’t mention it in our manifest.json file.

Обходной путь для этого - извлечь из create-react-app и вручную изменить конфигурацию веб-пакета, чтобы создать отдельную точку входа для сценария содержимого.

Источники:

Другой вариант - внедрить iframe в DOM и загрузить index.html реагирующего приложения во фрейм.

Wayne 02.07.2020 07:32

И еще один вариант заключается в том, что вы можете перепрограммировать свою сборку, чтобы предотвратить разделение кода (и дать выходному JS-файлу статическое имя), как описано здесь: mtm.dev/disable-code-splitting-create-react-app

Wayne 07.09.2020 09:10

Этот ответ все еще верен?

Aleka 11.07.2021 10:01

Другие вопросы по теме