2013-08-16 3 views
1

Я делаю свое первое расширение хром, и я застрял как раз перед концом.Расширение Chrome - Фоновая страница и непрочитанные предметы

Я получаю ответ от сервера в json, выводящий html, кэширую его в localstorage, проверяя, есть ли кеш, если он не возвращается с сервера, а затем отображается.

Теперь. В background.js мне нужно проверять каждые 30 минут, если есть обновления в json-файле на сервере ... если какой-либо дисплей значка, после щелчка удалите значок до следующего раза. но я не знаю, что делать. Потому что, если я делаю setInterval, он попадает на сервер и всегда отображает значок, даже если нет ничего нового. Можете ли вы, парень, помочь мне построить js, пожалуйста?

<script> 
    setInterval(function(){ 
     chrome.browserAction.setBadgeText({text:chrome.browserAction.setBadgeText({text: "!!!"});}); 
    }, 1800000); 
    </script> 

Я также пробовал этот путь, но ничего не происходит.

function getUnreadItems(callback) { 
    $.ajax(..., function(data) { 
     process(data); 
     callback(data); 
    }); 
} 

function updateBadge() { 
    getUnreadItems(function(data) { 
     chrome.browserAction.setBadgeText({text:data.unreadItems}); 
    }); 
} 

var pollInterval = 1*60*60; // 60 min 
var timerId; 

function startRequest() { 
    updateBadge(); 
    timerId = window.setTimeout(startRequest, pollInterval); 
} 

function stopRequest() { 
    window.clearTimeout(timerId); 
} 

background.js

onload='startRequest()' 
+0

Я не хром-разработчик, но я должен спросить ... в ваших функциях выше, я не вижу никаких сравнений времени. Вы проверяете/сохраняете/сравниваете любые отметки времени? – monsto

ответ

0

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

Таким образом, вы можете сделать несколько вещей:

  • появляется при нажатии на кнопку и сбросить значок 0, вы можете отправить запрос на сервер, чтобы пометить все элементы для чтения. Какой запрос, конечно, зависит от вашего сервера и от того, что он принимает. Таким образом, непрочитанный счет на сервере всегда будет обновляться, а ваше расширение может быть очень «глупо»: все, что возвращается сервером, - это текущее количество непрочитанных элементов.

  • Если вы не можете этого сделать, вам нужно будет сохранить некоторую информацию локально в своем расширении и выяснить, что вы не прочитали. Я имею в виду, что вместо того, чтобы просто запрашивать непрочитанный счет, вам нужно будет получить информацию о конкретных элементах, таких как уникальный идентификатор. Затем каждый раз, когда вы просматриваете сервер для списка элементов, вы добавляете идентификаторы в список, сохраненный в localStorage, например (или chrome.storage.sync), с тегом viewed, установленным на false, если этот идентификатор еще не известен. Затем фоновый скрипт перейдет через этот список и подсчитает количество элементов, которые имеют тег viewed, установленный на false, и используйте это как непрочитанное количество. Всякий раз, когда вы открываете всплывающее окно, вы просматриваете весь свой список и устанавливаете тег viewed на true для всех ваших товаров.

Я сделал что-то подобное для an extension to get your Hulu playlist. Я сделал первый вариант, когда я удаляю видео из вашего списка воспроизведения, так что он удаляется локально и на сервере. И я сделал второй вариант, потому что я хотел показать количество новых видео, но Hulu не отслеживает это. (Он знает, играл и непрослушанное, но не «вы были уведомлены, что это новое видео доступно», который я хотел

См, в частности, this section:.

// Testing that it's the first time I'm seeing this show 
if (show_ids.indexOf(new_show.id) == -1) { 
    new_shows_number++; 
    new_show.seen = "no"; 
} else { 
    new_show.seen = "yes"; 
} 

Здесь show_ids список идентификаторов Я уже сохранен и отмечен как просмотренный локально. Если в этом списке нет new_show.id, это означает, что это не просматриваемый элемент.

+0

Большое спасибо за ответ, сэр. Я думаю, что второй случай будет работать для меня. Я могу получить уникальные идентификаторы и сохранить их в localStorage, это станет супер длинной строкой чисел, но если файл json изменится, эта строка также будет обновлена. поэтому я сохраняю их в localStorage с помощью my popup.js, а затем в background.js. Я делаю что-то вроде этого: http://pastebin.com/udnMGHfX вы думаете, что он будет работать? – user2686487

+0

Что вы пытаетесь сделать в строке 5 'var htmlIds = value.id'? Похоже, вы хотите объединить идентификаторы? Как 'htmlIds + = value.id'? Если это так, вы должны сначала поместить 'var htmlIds = '';' out из блока '$ .getJSON()'. Проверка конкатенированной строки с сохраненной строкой является хрупкой, потому что она не будет работать, если возвращенные идентификаторы не будут упорядочены одинаково. Вы можете использовать 'JSON.stringify' и' JSON.parse' для обработки объектов. Первый, когда вы сохраняете «localStorage» и последний, когда хотите его использовать. –

+0

Тогда вам, вероятно, следует создать массив сохраненных/прочитанных идентификаторов и искать в нем новое. Таким образом, порядок, отправленный сервером, не имеет значения. Кроме того, гораздо проще манипулировать реальными объектами, а не строкой. Это то, что я сделал и в Кулу. –

Смежные вопросы