Остановить UserScript от автоматического нажатия - PullRequest
0 голосов
/ 21 марта 2020

Приведенный ниже код является частью JavaScript пользовательского сценария, который я создаю для добавления кнопок комментариев к указанному c подредакту в Reddit:

// ==UserScript==
// @name         Assholedesign Repost Commenter
// @namespace    Reddit
// @version      0.1
// @description  Add repost buttons to r/assholedesign
// @author       Duncan Yang
// @include      https://*.reddit.com/r/assholedesign/comments/*
// @include      http://*.reddit.com/r/assholedesign/comments/*
// @run-at document-start
// ==/UserScript==

window.addEventListener("DOMContentLoaded", function() {
    var edit_form = document.querySelector("form > div.usertext-edit").parentNode;
    var btns = edit_form.querySelector("div.usertext-edit > div.bottom-area > div.usertext-buttons");
    var save_btn = btns.querySelector("button.save");
    var edit_textbox = edit_form.querySelector("div.usertext-edit > div > textarea");

    var repost_text = function(a) {
        edit_textbox.value = a;
        console.log(a);
    }

    try
    {
        var cancel_btn = btns.querySelector("button.cancel");

        var a00 = document.createElement("button");
        var a01 = document.createElement("button");
        var a02 = document.createElement("button");

        // This section of code is
        a00.setAttribute("class", "save");
        a00.innerHTML = "Repost";
        a00.addEventListener("click", repost_text("Repost"));
        a01.setAttribute("class", "save");
        a01.innerHTML = "General Repostii";
        a01.addEventListener("click", repost_text("[General Repostii](https://reddit.com/r/assholedesign/wiki/common_topics)"));
        a02.setAttribute("class", "save");
        a02.innerHTML = "Cold One";
        a02.addEventListener("click", repost_text("[General Repostii, you are a cold one.](https://reddit.com/r/assholedesign/wiki/common_topics)"));
        // where I am having problems.

        btns.insertBefore(a00, cancel_btn);
        btns.insertBefore(a01, cancel_btn);
        btns.insertBefore(a02, cancel_btn);
    }
    catch (err)
    {
        console.log(err);
    }
}, false);

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

1 Ответ

1 голос
/ 21 марта 2020

Проблема в вашем addEventListener обратном вызове, который запускается немедленно.

Обратный вызов в таких функциях, как addEventListener, должен быть функцией, которая не запускается немедленно.

Для Например, следующий код будет alert('Hello'), как только код будет введен.

target.addEventListener('click', alert('Hello'));

Однако правильный способ - заключить его в такую ​​функцию:

target.addEventListener('click', function() { alert('Hello'); });

Выше будет запускаться только после того, как событие будет запущено.

В вашем коде следующее будет выполнено немедленно.

a00.addEventListener("click", repost_text("Repost"));

Измените его на:

a00.addEventListener("click", function() { repost_text("Repost"); });

Или функцию стрелки:

a00.addEventListener("click", () => repost_text("Repost"));

Только для информации, если вы не хотите передавать данные в функции, было бы хорошо и следующее:

a00.addEventListener("click", repost_text);
...