2015-02-10 2 views
0

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

var city = "", state = "", pin = ""; 
var url = "https://maps.googleapis.com/maps/api/geocode/json?address="+encodeURIComponent(laddress[1].replace(/<.*?>/g,'').replace('&amp;','&').trim())+"&sensor=false&key=AIzaSyCAQmrAKh0jzNVcT1VqTUhjB5Oh_dxl1zA"; 
console.log(url); 
var xhr = new XMLHttpRequest(); 
var resp; 
xhr.open("GET", url, true); 
xhr.setRequestHeader("Content-Type", "*/*"); 
xhr.onload = function() { 
    var json = xhr.responseText;       // Response 
    json = json.replace(/^[^(]*\(([\S\s]+)\);?$/, '$1'); // Turn JSONP in JSON 
    json = JSON.parse(json); 
    console.log(json.results[0].address_components); 
    for(var i=0;i<json.results[0].address_components.length;i++){ 
     if(json.results[0].address_components[i].types[0]=="administrative_area_level_2") 
      city = json.results[0].address_components[i].long_name; 
     if(json.results[0].address_components[i].types[0]=="administrative_area_level_1") 
      state = json.results[0].address_components[i].long_name; 
     if(json.results[0].address_components[i].types[0]=="postal_code") 
      pin = json.results[0].address_components[i].long_name; 
    } 
    localStorage.setItem("city", city); 
    localStorage.setItem("state", state); 
    localStorage.setItem("pin", pin); 
} 
xhr.send(); 
lcity = localStorage.getItem("city"); 
lstate = localStorage.getItem("state"); 
lpin = localStorage.getItem("pin"); 

Проблемы возникают, когда

  • бизнес страница уже открыта, и я пытаюсь нажать на расширение, LocalStorage не будет работа
  • иногда, это не показывает никакого значения, иногда оно показывает значения.

Что делать, чтобы получить идеальные значения в localStorage при доступе к нескольким бизнес-страницам?

+0

Ваша ситуация эквивалентна https://stackoverflow.com/questions/14220321/how-to-return-the-response-from-an-ajax-call - вы пытаетесь использовать значение до его установки. – Xan

ответ

0

Я считаю, что вы используете неправильный localStorage. Хотя localStorage определяется как HTML5, ему нужен корневой контекст, например wwww.something.com.

Попробуйте использовать chrome.storage.

Чтобы изменить пример из документов. Давайте используем локальное хранилище.

var city = "", state = "", pin = ""; 
var url = "https://maps.googleapis.com/maps/api/geocode/json?address="+encodeURIComponent(laddress[1].replace(/<.*?>/g,'').replace('&amp;','&').trim())+"&sensor=false&key=AIzaSyCAQmrAKh0jzNVcT1VqTUhjB5Oh_dxl1zA"; 
console.log(url); 
var xhr = new XMLHttpRequest(); 
var resp; 
xhr.open("GET", url, true); 
xhr.setRequestHeader("Content-Type", "*/*"); 
xhr.onload = function() { 
    var json = xhr.responseText;  // Response 
    json = json.replace(/^[^(]*\(([\S\s]+)\);?$/, '$1'); // Turn JSONP in JSON 
    json = JSON.parse(json); 
    console.log(json.results[0].address_components); 
    for(var i=0;i<json.results[0].address_components.length;i++){  
     if(json.results[0].address_components[i].types[0]=="administrative_area_level_2") 
      city = json.results[0].address_components[i].long_name; 
     if(json.results[0].address_components[i].types[0]=="administrative_area_level_1") 
      state = json.results[0].address_components[i].long_name; 
     if(json.results[0].address_components[i].types[0]=="postal_code") 
      pin = json.results[0].address_components[i].long_name; 
    } 
    chrome.storage.local.set({“city”: city, 
        "state”: state, 
        "pin”: pin}, function(){ 
        // Do stuff here after set. 
        chrome.storage.local.get(["city", "state", "pin", 
         function(items) { 
          lcity = items.city; 
          lstate = items.state; 
          lpin = items.pin; 
         } 
       }); 
} 
xhr.send(); 

Пожалуйста, не забудьте изменить ваши разрешения в манифесте, чтобы использовать хранилище.

A Quick Point: xhr.send() - это асинхронный вызов. Задание переменных l * сразу после этого - ваша проблема с данными, которые несколько раз показываются. Обращайтесь к этому при разгрузке или обратном вызове local.set. Приведенный выше пример имеет настройку в обратном вызове.

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