1

Мне нужно сделать функцию javascript, которая работает только один раз EVER, так что она устанавливает кучу переменных chrome Google, знает ли кто-нибудь, как это сделать?Настройки расширения Chrome

Вот что я прямо сейчас, но я не думаю, что это работает:

window.onLoad = check(); 

function check() { 
    chrome.storage.local.get('defaultLoad', function (x) { 
     if (x.defaultLoad == undefined) { 
      chrome.storage.local.set({'defaultLoad': '0'}, function() { 
       console.log('SearchPanel default'); 
       defaultLoad(); 
      }); 
     } 
    }); 
} 

function defaultLoad() { 
    chrome.storage.local.set({'searchPanelOption': 'open'}, function() { 
      console.log('SearchPanel default'); 
    }); 
    chrome.storage.local.set({'barBackgroundOption': '#000000'}, function() { 
      console.log('barBackground default'); 
    }); 
    chrome.storage.local.set({'goBackgroundOption': '#000000'}, function() { 
      console.log('goBackground default'); 
    }); 
    chrome.storage.local.set({'barColorOption': '#ffffff'}, function() { 
      console.log('barColor default'); 
    }); 
    chrome.storage.local.set({'placeColorOption': '#999999'}, function() { 
      console.log('placeColor default'); 
    }); 
    chrome.storage.local.set({'searchEngineOption': 'google'}, function() { 
      console.log('searchEngine default'); 
    }); 
} 

Этот сценарий называется в верхней части страницы, он должен работать только один раз когда-либо, но я не» я думаю, что он работает, потому что я не получаю ни одного из выходов console.log.

ответ

2

Таким образом, вы хотите установить значения по умолчанию.

Определите значения по умолчанию в отдельном файле.

// Define default values. 
var options = { 
    notifyTimeout: 5, 
    pageInspect: true, 
    linkInspect: true, 
    pushItem: false, 
    notifyMode: 'margin', 
}; 

// a method similar to jquery.ready 
function initOptions(callback) { 
    // get data from remote 
    chrome.storage.sync.get(null, function(data) { 
     // merge remote data into local global `options` 
     $.extend(options, data); 
     // push them back to remote 
     // maybe the extension updated and added new default values. 
     chrome.storage.sync.set(options); 
     // callback method to use updated options. 
     callback && callback(); 
    }); 
} 

// listen to remote data changes, if soem value changed 
// update the global variable `options`, for example, 
// you changed an option in options page and push changes to remote 
// in contentscript, this got the changes and update to new value. 
// you can use the updated value without a page reload. 
chrome.storage.onChanged.addListener(function(changes) { 
    for (var name in changes) { 
     var change = changes[name]; 
     options[name] = change.newValue; 
    } 
}); 

на странице вы хотите использовать опции, вводить этот сценарий и не стесняйтесь использовать глобальную переменную options, она работает в contentscript тоже.

initOptions(function() { 
    doSomethingWith(options); 
}); 

Я написал статью об этом, но не на английском языке.

http://www.g2w.me/2014/08/sync-chrome-extension-options/

+0

Было бы здорово, если бы вы включили объяснение в сам ответ (получение принимает значения по умолчанию) и переместило ссылку вашего блога на дно как «больше информации». – Xan

+1

Ах, право. Существует более короткий способ сделать то, что вы делаете: если вы выполняете 'chrome.storage.sync.get (options, ...)' Chrome заполнит ответ значениями по умолчанию, где они отсутствуют. Нет необходимости «расширять» – Xan

+0

Я думаю, что это, вероятно, лучший способ сделать это, хотя моя функция также работает (как и Xan's) – Nesiehr

0

Nevermind, этот код действительно работает, вам просто нужно переместить вызов функции defaultLoad() из вызова chrome.local.storage.set.

window.onLoad = check(); 

function check() { 
    chrome.storage.local.get('defaultLoad', function (x) { 
     if (x.defaultLoad == undefined) { 
      chrome.storage.local.set({'defaultLoad': '0'}, function() { 
       console.log('SearchPanel default'); 
      }); 
      defaultLoad(); 
     } 
    }); 
} 

function defaultLoad() { 
    chrome.storage.local.set({'searchPanelOption': 'open'}, function() { 
      console.log('SearchPanel default'); 
    }); 
    chrome.storage.local.set({'barBackgroundOption': '#000000'}, function() { 
      console.log('barBackground default'); 
    }); 
    chrome.storage.local.set({'goBackgroundOption': '#000000'}, function() { 
      console.log('goBackground default'); 
    }); 
    chrome.storage.local.set({'barColorOption': '#ffffff'}, function() { 
      console.log('barColor default'); 
    }); 
    chrome.storage.local.set({'placeColorOption': '#999999'}, function() { 
      console.log('placeColor default'); 
    }); 
    chrome.storage.local.set({'searchEngineOption': 'google'}, function() { 
      console.log('searchEngine default'); 
    }); 
} 
1

Существует событие для запуска только при первоначальной инсталляции:

chrome.runtime.onInstalled.addListener(function(details) { 
    if(details.reason == "install") { 
    // This code runs once 
    } 
}); 

Однако метод presented by greatghoul предпочтительнее установить параметры по умолчанию. Он перезапишет любую опцию, которая не настроена вообще по умолчанию, и сохранит значение любой опции, которая уже установлена. Это лучше, потому что добавление дополнительных опций так же просто, как добавление нового ключа к настройкам по умолчанию.