Сохранить значение флажка, расположенного во всплывающем окне, когда пользователь закрывает всплывающее окно

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

Я попытался добавить (из background.js) атрибут "checked" в флажок в popup.html, когда значение равно true (отмечено), а затем удалить атрибут, когда значение равно false (не отмечено).

Затем я прочитал что-то, что .attr в jquery больше не поддерживается, и новый способ сделать это (начиная с jquery 3+) - использовать .prop('checked', true);

//background.js
var switchStatus;
chrome.storage.onChanged.addListener(function(changes, areaName){
    console.info('received');
    chrome.storage.local.get('sS', function(status){
        switchStatus = status.sS;
        console.info(switchStatus);

        if (switchStatus === true) {
            $('#togBtn').prop('checked', true);
            chrome.storage.local.set({'sS': true});            
            console.info('when checked ' + switchStatus);
        }
        if (switchStatus === false) {
            $('#togBtn').prop('checked', false);
            chrome.storage.local.set({'sS': false});
            console.info('unchecked ' + switchStatus);
         }
    });
});
//popup.js
$(function() { 
    var switchStatus;
    $("#togBtn").on('change', function() {
         chrome.storage.local.get('sS', function(status){
             switchStatus = status.sS;
         });
        if (($('#togBtn').is(':checked')) === true) {
            switchStatus = $("#togBtn").is(':checked');
            alert(switchStatus); //to verify

            chrome.storage.local.set({'sS': true}, function(){
                alert('saved' + ' : ' + switchStatus);
            });
        }
        if (($('#togBtn').is(':checked')) === false) {
            switchStatus = $("#togBtn").is(':checked');
            alert(switchStatus); //to verify

            chrome.storage.local.set({'sS': false}, function(){
                alert('saved' + ' : ' + switchStatus);
            });
        }   
    });
});
//popup.html
<label class = "switch">
            <input type = "checkbox" id = "togBtn">
            <div class = "slider round" id = "thisthing">
                <span class = "on">ON</span>
                <span class = "off">OFF</span>
            </div>
        </label>

Опять же, я пытаюсь сохранить значение флажка после закрытия всплывающего окна. Поэтому, когда пользователь нажимает на флажок, а ползунок становится зеленым и «включенным», если пользователь щелкнет из всплывающего окна или перейдет на новую вкладку, флажок все равно будет отображаться зеленым и «включенным».

Ваша переменная switchStatus сохраняет правильный статус? Похоже, у вас есть console.info, чтобы проверить это... сохраняет ли значение флажка?

Bruno Monteiro 28.05.2019 23:28

Да, странно то, что переменная switchStatus работает правильно. Проблема, насколько я могу судить прямо сейчас, заключается в том, что даже когда флажок иногда отображается как «выключен», значение для switchStatus равно true.. я думаю, что оно просто не сохраняется в popup.js

losa22 29.05.2019 04:50

Возможный дубликат Как вернуть ответ на асинхронный вызов?

wOxxOm 29.05.2019 07:36

Обратные вызовы Chrome API существуют не только для демонстрации, но и потому, что они вызываются асинхронно, а это означает, что вам необходимо переработать свой код, как показано в связанной теме [дубликат].

wOxxOm 29.05.2019 07:38
Поведение ключевого слова "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) для оценки ваших знаний,...
0
4
491
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Похоже, вы можете немного упростить свой код.

// background.js
chrome.storage.onChanged.addListener(function(changes, areaName){
    chrome.storage.local.get('sS', function(status){
        var switchStatus = status.sS;

        if (switchStatus) {
            $('#togBtn').prop('checked', true);
        } else {
            $('#togBtn').prop('checked', false);
        }
    });
});

а также

// popup.js
$(function() {
    $("#togBtn").on('change', function(e) {
        if (e.target.checked){
            chrome.storage.local.set({'sS': true}, function(){
                alert('saved: True');
            });
        } else {
            chrome.storage.local.set({'sS': false}, function(){
                alert('saved: False');
            });
        }   
    });

    // I think that you may need to include this to initialize the checkbox.
    // I could be wrong though.
    chrome.storage.local.get('sS', function(status){
        var switchStatus = status.sS;

        if (switchStatus) {
            $('#togBtn').prop('checked', true);
        } else {
            $('#togBtn').prop('checked', false);
        }
    });
});

Это решило мою проблему. Большое спасибо!!

losa22 29.05.2019 17:13

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