2014-09-05 62 views
-1

我試圖將文件下載到我的下載文件中。我在網頁上動態創建一個按鈕,當按下該按鈕時,我喜歡下載一些東西。無論什麼原因,當我點擊按鈕什麼都沒有發生,我不知道爲什麼。請幫助Chrome擴展程序:單擊按鈕後不會下載

background.js代碼

function SendRequest(url, callback){ 

var xhr = new XMLHttpRequest(); 
    xhr.onreadystatechange = function() { 
    if (xhr.readyState == 4) { 
    callback(xhr.responseText); 
    } 
    }; 
    xhr.open("GET", url, true); 
    xhr.send(); 
} 

var objurl = localStorage.getItem("OBJURL"); 
function EditContent(objurl){ 
    chrome.downloads.download({url:objurl,filename:"Object Edit - Chrome Extension.rbxl",conflictAction:"overwrite"}) 
} 

item.js

contentInput.onclick = function(){ 
var assetid = $('.thumbnail-span').attr("data-3d-url") 
var baseurl = 'http://www.roblox.com' 
SendRequest(baseurl + assetid, function (response) { 
var response = response; //Easy Peasy 
var jsonObject = JSON.parse(response); //Parse the response 

localStorage.setItem("URL1", jsonObject.Url); //It's saved! 
var test = localStorage.getItem("URL1"); //Let's grab it and save it to a variable 
console.log(test); //Logs "Hello World!" 
}); 

var url1 = localStorage.getItem("URL1"); 
SendRequest(url1, function (response1) { 

var response = response1; //Easy Peasy 
var jsonObject = JSON.parse(response); //Parse the response 
localStorage.setItem("OBJ", jsonObject.obj); //It's saved! 
}); 

var hashdecode = "http://roblox.com/thumbnail/resolve-hash/" 
var objhash = localStorage.getItem("OBJ"); 
SendRequest(hashdecode + objhash, function (objresponse) { 
var response = objresponse; //Easy Peasy 
var jsonObject = JSON.parse(response); //Parse the response 

localStorage.setItem("OBJURL", jsonObject.Url); //It's saved! 
}); 



    chrome.extension.sendRequest({ 
     action: "EditContent", 

    }) 

} 
+0

最近所有的roblox問題是什麼? – Xan 2014-09-05 23:08:14

回答

0

哦男孩。這裏有很多錯誤。我的意思是很多

  1. chrome.extension.sendRequest已棄用。改爲使用chrome.runtime.sendMessage

  2. 也就是說,你正在發送消息,但實際上並沒有聽到它。 action: "something"並不意味着什麼先驗的,你需要給自己的反應:

    // background.js 
    chrome.runtime.onMessage.addListener(
        function(message, sender, sendResponse){ 
        if(message.action == "EditContent") { 
         /* do stuff */ 
        } 
        } 
    ); 
    
  3. localStorage不是內容腳本和背景腳本之間共享。實際上,後臺腳本有自己的副本localStorage(綁定到chrome-extension://whateverisyourid/域),內容腳本與頁面共享。

    您應該使用chrome.storage,這是共享的,但工作方式不同,或通過在郵件中需要的東西,即這樣的消息:

    {action: "EditContent", objurl: jsonObject.Url} 
    

    並使用它:

    chrome.runtime.onMessage.addListener(
        function(message, sender, sendResponse){ 
        if(message.action == "EditContent") { 
         EditContent(message.objurl) 
        } 
        } 
    ); 
    
  4. 在內容腳本中調用後臺腳本(SendRequest中定義的函數不能調用。您需要將其移至內容腳本,或從後臺腳本中調用它。

  5. 您的SendRequest是異步的。如果你寫的東西,如:

    function f(){ 
        action1(); 
        SendRequest(url1, function(response){ 
        action2(); 
        }); 
        action3(); 
        SendRequest(url2, function(response){ 
        action4(); 
        }); 
        action5(); 
    } 
    
    f(); 
    

    那麼這是會發生什麼:

    • action1()
    • SendRequest將排隊與url1的請求,而不是等待它
    • ​​3210
    • SendRequest將排隊請求url2,但不等它
    • action5()
    • 您的功能f()終止,隊列中的下一個是第一個請求。
    • 當請求結束時,運行action2()
    • 隊列中的下一個是第二個請求。
    • 當請求結束時,運行action4()

    這可能甚至會交換,我想,這取決於哪個請求首先完成。

    你看到問題了嗎?您需要鏈異步調用來代替:

    function f(){ 
        action1(); 
        SendRequest(url1, function(response){ 
        action2(); 
        action3(); 
        SendRequest(url2, function(response){ 
         action4(); 
         action5(); 
        }); 
        }); 
    } 
    

這可能不是問題的完整列表,當然不是一個完整的工作代碼。

請,下次調試您的擴展。您可以訪問頁面控制檯中的內容腳本中的錯誤(Ctrl + Shift + J),以及開發者模式下的chrome://extensions的背景頁面控制檯。

相關問題