Этот вопрос касается аналогичной проблемы области видимости javascript, которую я задал вчера . Я надеюсь, что вы можете помочь мне решить эту проблему.
Я работаю с расширением Chrome. options.html
сохраняет в localStorage
новое электронное письмо пользователя как «user» и вызывает refreshUser()
функцию в background.html
:
//save entered gmail address
document.getElementById("save").addEventListener(
"click", function ()
{
var user = document.getElementById("getEmail").value;
localStorage.setItem("user", user);
chrome.extension.getBackgroundPage().refreshUser();
} , false)
Затем я сохраняю письмо как «newUser» в background.html
. Проблема в том, что newUser
обновляется внутри refreshUser()
, но null
снаружи refreshUser()
:
newUser = localStorage.getItem("user");
console.log("first newUser " + newUser);
//newUser=null
function refreshUser ()
{
newUser = localStorage.getItem("user");
console.log("newUser inside of refreshUser function " + newUser);
//newUser is updated with saved email in localStorage
}
console.log("newUser after refreshUser() " + newUser);
//newUser=null
Почему newUser
локально по отношению к refreshUser()
, хотя оно определено без ключевого слова var
? Спасибо за вашу помощь!
Обновление
В ответ на ответ pimvdb Я копирую код для моего background.html
. Если я хочу использовать newUser
в formData
, как указано, какую функцию мне нужно вызывать внутри refreshUser()
? Спасибо.
<html>
<script>
newUser = localStorage.getItem("user");
console.log("first newUser " + newUser);
function refreshUser ()
{
newUser = localStorage.getItem("user");
console.log("newUser inside of refreshUser function " + newUser);
}
console.log("newUser after refreshUser() " + newUser);
//I want to user newUser below in formData
chrome.browserAction.onClicked.addListener(function(tab)
{
chrome.tabs.getSelected(null,
function(tab)
{
// Send a request to the content script.
chrome.tabs.sendRequest(tab.id, {action: "getDOM"},
function(response)
{
var firstParagraph = response.dom;
var formData = new FormData();
formData.append("url", tab.url);
formData.append("title", tab.title);
formData.append("pitch", firstParagraph);
formData.append("extension_user", "abc@gmail.com");
//I want to user newUser here:
//formData.append("extension_user", newUser);
console.log("newUser inside formData: " + newUser)
var xhr = new XMLHttpRequest();
xhr.open("POST", "http://ting-1.appspot.com/submithandlertest", true);
xhr.onreadystatechange =
function (aEvt)
{
if (xhr.readyState == 4)
{
if (xhr.status == 200)
{
console.log("request 200-OK");
chrome.browserAction.setBadgeText ( { text: "done" } );
setTimeout(function ()
{
chrome.browserAction.setBadgeText( { text: "" } );
}, 2000);
}
else
{
console.log("connection error");
chrome.browserAction.setBadgeText ( { text: "ERR" } );
}
}
};
xhr.send(formData);
}); //chrome.tabs.sendRequest
});
});
</script>
</html>
Обновление до ответа Комментарий pimvdb :
Проблема, с которой я столкнулся, заключается в том, что background.html
загружается при открытии браузера, но электронная почта сохраняется в options.html
впоследствии. Так что refreshUser()
говорит background.html
получить newUser
от localStorage. Затем мне нужно использовать "newUser" в formData, как это:
formData.append("extension_user", newUser);
Но то, как у меня сейчас "newUser" снаружи refreshUser()
, равно нулю. Чего мне не хватает?
Обновление, чтобы уточнить, почему некоторые журналы не отображаются в консоли
Вот что я делаю:
1. I reload the extension and start with localStorage empty
2. I use the extension to save a bookmark
3. all 3 logs are null as expected
first newUser null
newUser after refreshUser() null
newUser inside formData: null
request 200-ok
4. now I save user email in options as abc@gmail.com
5. now I use the extension again to save a bookmark
6. now refreshUser is executed and the log inside the function says abc@gmail.com and formData log says abc@gmail.com
newUser inside of refreshUser function abc@gmail.com
newUser inside formData: abc@gmail.com
request 200-OK
7. but what confuses me is that now the first 2 logs do not show in the console. Why?