Chrome Storage API не работает

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

Вот мой html

<!DOCTYPE html>

<head>

<title>Storage</title>
<script src = "popup.js"></script>

<span id = "box"> </span>
<input type  = "text" id = "card">
<button id = "button">Save</button>

Вот мой js

        window.onload=function(){
console.info("yay");
chrome.storage.sync.get("text",function(change){    
    if (change.text){
        document.getElementById("box").innerText=change.text;
    }
});
if (document.getElementById("button")){
    document.getElementById("button").addEventListener("click",function(){
console.info(documengt.getElementById("card").value);
        var textBox=document.getElementById("card").value;
    console.info(textBox);
        chrome.storage.sync.set({"text":textBox});



document.getElementById("box").innerText=document.getElementById("card").value;
        });
    }
}

Вот мой манифест:

  {
  "manifest_version":2,

  "name": "Storage",
  "description": "This extension allows the user to save information in the box",
  "version": "1.0",

  "browser_action": {
    "default_icon": "icon.png",
    "default_popup": "popup.html"
  },
  "permissions": [
    "activeTab",
    "storage"
  ]
}

Любая помощь приветствуется!

Не могли бы вы опубликовать свой манифест? Кроме того, разве val() не jQuery, а не простой js?

Teepeemm 27.03.2018 03:52

Вы можете проверить пример - он содержит базовый пример использования API хранилища, как вы пытаетесь это сделать.

Sergii Rudenko 27.03.2018 03:54

При отправке текущая страница заменяется ответом сервера. В вашем случае он просто перезагружает страницу. Измените вход submit на элемент кнопки.

wOxxOm 27.03.2018 04:13

О, хорошо, спасибо за помощь, но по какой-то причине это все еще не работает

Edward Chen 27.03.2018 13:42

Я обновил свой код, а также Сергей, ссылка, которую вы поместили, не работает.

Edward Chen 27.03.2018 13:49
Поведение ключевого слова "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
5
288
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Убедитесь, что вы добавили это в свой manifest.json

"permissions": [
    "storage",
],

Как объяснено в основной таблице из chrome.storage

Permissions: "storage"

Да. Вот мой манифест {"manifest_version": 2, "name": "Storage", "description": "Это расширение позволяет пользователю сохранять информацию в поле", "version": "1.0", "browser_action": { "default_icon": "icon.png", "default_popup": "popup.html"}, "permissions": ["activeTab", "storage"]}

Edward Chen 27.03.2018 14:02
Ответ принят как подходящий

Я думаю, ваша проблема в том, что вы изначально не получаете нужный элемент.

Вы используете document.getElementById ("text"); когда на самом деле нет элемента с id = "text". Ваше текстовое поле ввода на самом деле type = "text", но id = "card".

А также, получение элемента просто получает элемент как объект (он покажет что-то вроде [object HTMLInputElement] вместо текста, который фактически находился внутри поля ввода). Итак, вам нужно использовать .value, чтобы добраться до фактического текста

Еще пара вещей, которые нужно улучшить, ваш новый storage.js должен использовать

  • правильный идентификатор элемента («карта»)
  • получить значение поля ввода текста
  • innerText вместо innerHTML (защищает от XSS)

В готовом виде это выглядит так:

//popup.js
window.onload=function(){
    chrome.storage.sync.get("text",function(change){    
        if (change.text){
            document.getElementById("box").innerText=change.text;
        }
    });
    if (document.getElementById("button")){
        document.getElementById("button").addEventListener("click",function(){
            var textBox=document.getElementById("card").value;
            chrome.storage.sync.set({"text":textBox});

        });
    }
}

Спасибо, MagnetPlant

Обновлено: изменил storage js на popup.js

Хорошо, спасибо, я согласен с InnerText и .value, но я все еще не понимаю, как получить хранилище, потому что я думал, что идентификатор «текст» будет относиться к тому, который находится в хранилище Chrome. В любом случае спасибо за вашу работу.

Edward Chen 28.03.2018 21:08
chrome.storage.sync.get("text"... и document.getElementById("text") - две разные вещи. chrome.storage получает его из хранилища вашего расширения, тогда как getElementById не получает ваше значение из хранилища, он фактически представляет весь элемент <input>. Если я могу быть более ясным, дайте мне знать
MagnetPlant 30.03.2018 07:47

Я изменил свой js на вашу окончательную версию и сохранил свой html и мой манифест одинаковыми. Кстати, он просто отображает "// storage html", и я могу изменить его на что-нибудь еще, когда я нажимаю кнопку

Edward Chen 30.03.2018 16:57

nvm я просто меняю его на что угодно, и он все еще ничего не отображает

Edward Chen 30.03.2018 16:58

извините, он не имеет отступа, но все равно не работает. Я также добавил console.info, но единственное, что я получаю в консоли, это yay

Edward Chen 30.03.2018 17:05

Я сделал базовое расширение Chrome, в котором в основном были то, что вы опубликовали, и внесенные мной изменения, и оно работает. Возможно, вы могли бы проверить свой код здесь: github. При первой загрузке всплывающего окна ничего не отображается, но затем вы пишете текст и нажимаете «Сохранить», а в следующий раз, когда вы открываете всплывающее окно, там отображается сохраненный текст.

MagnetPlant 31.03.2018 01:48

Вы проверяли свой код на это? https://github.com/turquoise-turtle/49503172

MagnetPlant 02.04.2018 22:22

Это сработало? Если нет, могу я увидеть немного больше вашего кода, чтобы узнать, что еще может сделать его неработающим

MagnetPlant 07.04.2018 04:35

извините занят в эти дни. Работаю над другим проектом. Это нормально, что вся помощь мне нужна. Спасибо! Я отмечу как правильный, если он сработает через несколько дней.

Edward Chen 08.04.2018 02:18

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