2014-09-05 64 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的背景页面控制台。

相关问题