Я пытаюсь создать расширение 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
работает правильно. Проблема, насколько я могу судить прямо сейчас, заключается в том, что даже когда флажок иногда отображается как «выключен», значение для switchStatus
равно true
.. я думаю, что оно просто не сохраняется в popup.js
Возможный дубликат Как вернуть ответ на асинхронный вызов?
Обратные вызовы Chrome API существуют не только для демонстрации, но и потому, что они вызываются асинхронно, а это означает, что вам необходимо переработать свой код, как показано в связанной теме [дубликат].
Похоже, вы можете немного упростить свой код.
// 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);
}
});
});
Это решило мою проблему. Большое спасибо!!
Ваша переменная
switchStatus
сохраняет правильный статус? Похоже, у вас естьconsole.info
, чтобы проверить это... сохраняет ли значение флажка?