Использование React для изменения содержимого уже существующей страницы с использованием расширения Chrome - PullRequest
0 голосов
/ 16 сентября 2018

Я только начал изучать 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 (содержимое основного реагирующего приложения находится здесь):

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 и изменять содержимоестраницы уже присутствует.

1 Ответ

0 голосов
/ 17 сентября 2018

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

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

Проблема с нашим create-react-app заключается в том, что шаг сборки будет каждый раз генерировать выходной файл JS с другим именем (еслисодержание изменилось).Таким образом, у нас нет возможности узнать фактическое имя файла JS-файла, поэтому мы не можем упомянуть его в нашем файле manifest.json.

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

Источники:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...