2015-01-05 3 views
1

Я занимаюсь созданием расширения, расширение отображает значение в секундах для пользователя как количество времени, затраченного пользователем на конкретный веб-сайт. У меня все работает, но каждый раз, когда хром закрывается или компьютер перезапускается, переменная времени начинает отсчет снова с 0. Я полагал, что использование хром-хранилища API должно выполнять эту работу. После прохождения документации по API мне удалось сохранить и получить номер из локального хранилища. То, что я не могу сделать, - это сохранить данные в локальном хранилище, когда пользователь закрывает хром. Есть ли способ обнаружить такое событие?Хранить и извлекать данные из локального хранилища с использованием хром-хранилища API

ответ

1

Прежде всего, вам не нужно использовать API chrome.storage, чтобы сделать эту работу. Кстати, к сожалению, то, что вы ищете, не существует. Вы ищете какое-то событие (например, onBrowserClosed), которое не реализовано в API Chrome. Сообщение об ошибке было сделано HERE (хотя это на самом деле не ошибка), если вы хотите остаться в курсе, вы можете его зажечь.

Несмотря на то, что проблема может быть решена с помощью setInterval(), который выполнит вашу функцию, чтобы обновить время, которое пользователь потратил на сайт на каждый определенный интервал (в миллисекундах), и остановится при закрытии браузера. Что-то вроде этого:

var currentActiveTab, chromeHasFocus = false; 

localStorage.timeSpentOnSites = localStorage.timeSpentOnSites || "{}"; 

// get the first tab at startup 
chrome.tabs.query({active: true, highlighted: true}, function(tabs) { 
    currentActiveTab = tabs[0]; 
    console.log('New active tab:', tabs[0]); 
}); 

// this will keep currentActiveTab updated to always be the active tab (the one that the user is watching) 
chrome.tabs.onUpdated.addListener(function(tabID, info, tab) { 
    if (tab.active && tab.highlighted) currentActiveTab = tab; 
    console.log('New active tab:', tab); 
}); 

// this also 
chrome.tabs.onActivated.addListener(function(info) { 
    chrome.tabs.query({active: true, highlighted: true}, function(tabs) { 
     currentActiveTab = tabs[0]; 
     console.log('New active tab:', tabs[0]); 
    }); 
}); 

// this will check if chrome is active or not 
chrome.windows.onFocusChanged.addListener(function(windowID) { 
    if (windowID === chrome.windows.WINDOW_ID_NONE) { 
     chromeHasFocus = false; 
     console.log('Chrome lost focus.'); 
    } else if (!chromeHasFocus) { 
     chromeHasFocus = true; 
     console.log('Chrome has focus.'); 
    } 
}); 

function addTimeSpentOnSite(site) { 
    var T = JSON.parse(localStorage.timeSpentOnSites); 

    // if site already exists increment the time spent on it 
    if (T[site]) T[site]++; 
    // otherwise set the time spent on it as 1 (second) 
    else T[site] = 1; 

    localStorage.timeSpentOnSites = JSON.stringify(T); 
} 

setInterval(function() { 
    if (!chromeHasFocus) return; 
    // if the chrome window isn't active the user is not watching the site 

    var site = currentActiveTab.url.split('/')[2]; 
    // get the site name, something like www.site.com 

    addTimeSpentOnSite(site); 
    // increase the amount of time spent on the site 
}, 1000); 
+0

Да, это именно то, что я закончил делать. Но разве это неэффективно? –

+0

@ nashmaniac Да, я знаю, это немного неэффективно, и установка меньшего количества миллисекунд в setInterval заставит его работать медленнее, но это единственное решение прямо сейчас. –

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