Расширение Chrome не может найти кнопку при использовании getElementById - PullRequest
1 голос
/ 01 мая 2019

Когда я загружаю свое расширение Chrome, оно показывает предупреждения правильно, но когда я пытаюсь использовать getElementById (), оно возвращает ноль.

Я обнаружил это, изменив первый оператор if на:

if (document.getElementById(button) == null) {
     alert("No element found");
}

Он напечатает это, но не будет ничего подтверждать, кроме нуля (например, "! = Нуль").Дело в том, что элемент существует.Я вижу это на странице, когда я проверяю страницу, и я могу взаимодействовать с ней, но по какой-то причине расширение Chrome не находит мою кнопку или любой другой элемент по идентификатору, насколько я тестировал, кнопка или нет.

Куда бы я ни посмотрел, везде говорят, что Javascript запускается после загрузки страницы, но я настроил расширение для запуска, когда DOM полностью загружен.Я в полной растерянности здесь.Я потратил часы, работая над этим и исследуя его, и не могу понять, что происходит.

manifest.json

{
    "manifest_version": 2,
    "name": "Clicker",
    "description": "Placeholder",
    "version": "0.1",

    // Permissions
    "permissions": [
        "activeTab"
    ],

    // Scripts
    "background": {
        "scripts": ["clicker.js"],
        "persistent": false
    }

}

clicker.js


window.onload = function (){
        var button = "clickIt";
    var run = 1;

    alert("Starting Clicker");

    while (run = 1){
        if (document.getElementById(button).disabled != true){
            document.getElementById(button).click();
                }
    }
}

testpage.html

<html>

<head>
    <title>Clicker Test Page</title>

</head>


<body onload="timer()">
<button id="clickIt" type="button" disabled="true" onClick="addCount()">Test Button</button> </br></br></br>

<!--  display counter for test button clicks -->
<p>Counter: </p>
<span id="click_counter">0</span> </br>

<!-- display countdown timer for clock cycles -->
<p>Timer: </p>
<p id="display_timer"></p>
</body>

</html>

<script type="text/javascript">    
function timer(){
    var timeleft = 10;
    var downloadTimer = setInterval(function(){
        document.getElementById("display_timer").innerHTML = timeleft + " seconds remaining";
        timeleft -= 1;
        if(timeleft <= -1){
            clearInterval(downloadTimer);
            document.getElementById("clickIt").disabled = false;
        }
    }, 1000);
}

function addCount(){
    var val = document.getElementById("click_counter").innerHTML;
    document.getElementById("click_counter").innerHTML = ++val;
    document.getElementById("clickIt").disabled = true;
    timer();
}
</script>

Тестовая страница отлично работает при ручном воспроизведении.Хотя я на 100% уверен, что расширение работает и работает бесконечно, как хотелось бы, оно не может найти какие-либо элементы по идентификатору и, таким образом, абсолютно ничего не делает, если вы не включите оповещения, чтобы убедиться, что оно никогда не входит в оператор if.Я также знаю, что он не может найти другие элементы на странице.

1 Ответ

0 голосов
/ 24 мая 2019

wOxxOm было правильно, что мне нужно было сделать этот скрипт контента вместо фонового скрипта, чтобы он мог получить доступ к контенту (например, ID элемента) в DOM.

Кроме того, хотя комментарий Herohtar был связан с другой проблемой, чем та, к которой я обращался во время представления этого вопроса, позже в процессе разработки этого расширения был важный фактор:

Herohtar был вернымчто использование цикла while перегружало вкладку и заставляло окно Chrome блокироваться и не отвечать, потому что оно обрабатывало клики так быстро.В конечном итоге я исправил это, используя наблюдатель мутаций с функцией inlay-ed setInterval () вокруг оператора button.click();, чтобы остановить слишком быстрое нажатие скрипта.

Спасибо вам обоим за помощь.

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