我对此很新,事实上这是我第一次尝试Dojo。我正试图从以下网站获取数据:
<script
text="text/javascript"
src="http://o.aolcdn.com/dojo/1.3/dojo/dojo.xd.js"
djConfig="parseOnLoad:true,isDebug:true"
></script>
<script type="text/javascript">
//How are we supposed to know what else to include in the dojo thing? like query?
dojo.addOnLoad(function(){
console.log("hi");
dojo.xhrPost({
url: "http://www.scrapbookingsuppliesrus.com/catalog/layout", //who knows how to set relative urls?
handleAs: "json", //get json data from server
load: function(response, ioArgs){
console.log("got");
console.log(response); //helps with the debugging
return response; //that way goods should be a very large array of the data we want
},
error: function(response, ioArgs){
console.log("nope didn't make it", response+' '+ioArgs); //helps with the debugging
return response; //who knows what this does
} //last item, thus no extra comma
});
});
</script>
但没有任何反应。虽然我在这,但究竟是什么响应和ioArgs变量。它们应该神奇地是对我认为已经特别定义的请求的响应。但是,谁知道呢。此外,我想在每次尝试之后它会在加载或错误中触发某些东西,但是唉。 曾经有一个错误,我将被禁止的uri,但然后firebug会引用一个非常大的dojo脚本,在那里无法分辨为什么它被打破。你们其他人在开发什么样的环境?
答案 0 :(得分:4)
嗯,有几个问题。
首先让我们从非常简单的开始。
在开发时,您希望使用Dojo的“未压缩”版本,可以通过将.uncompressed.js附加到正在使用的Dojo库的路径来找到:
http://o.aolcdn.com/dojo/1.3/dojo/dojo.xd.js.uncompressed.js
这样可以更容易地看到什么中断,如果它在core-Dojo中。
接下来是djConfig参数。我很确定Dojo可以处理一个字符串,但传统上它已经被一个对象定义了,所以,一旦你包含了你的Dojo库:
<script src="path to dojo"></script>
启动一个新的脚本块并在其中定义djConfig对象:
<script>
djConfig = {
parseOnLoad: true,
isDebug: true
};
</script>
接下来最简单,我使用IntelliJ JIDEA进行开发,它具有内置的Dojo代码感,使生活更轻松。否则,标准包,Firefox + Firebug。
复杂的东西:
您似乎在使用XHR方法请求数据,希望您知道这意味着您的脚本和被访问的数据必须位于同一个域中,否则您将遇到安全性错误。怎么解决这个问题?您使用称为跨域脚本的技术,dojo也通过dojo.io.script.get功能支持。
更复杂的东西:
Dojo使用称为“延迟”对象的东西。这意味着一旦创建了对象,请求实际上就不会出现,而是当你要求它出去时它会消失,这就是“延迟”的概念,你将一段代码的执行推迟到晚点。在你的情况下,这个问题的解决方式是这样的:
var deferred = dojo.xhrPost({
url: "http://www.scrapbookingsuppliesrus.com/catalog/layout", //who knows how to set relative urls?
handleAs: "json" //get json data from server
});
if(deferred) {
deferred.addCallback(function(response){
console.log("got");
console.log(response); //helps with the debugging
return response; //that way goods should be a very large array of the data we want
});
deferred.addErrback(function(response){
console.log("nope didn't make it", response+' '+ioArgs); //helps with the debugging
return response; //who knows what this does
});
}
这应该可以解决了。
作为个人注释,我不建议使用XHR,而是使用dojo.io.script.get方法,从长远来看,这种方法更加便携。
答案 1 :(得分:1)
您的代码中存在几个非常基本的错误。
<script ... djConfig="parseOnLoad:true,isDebug:true"/></script>
/>
的简短形式(禁止使用)和同时包括结束</script>
。 console.log("hi")
您尝试从 http://www.scrapbookingsuppliesrus.com/catalog/layout加载数据您的脚本是否也在该域上运行?否则,对Crossdomain-Ajax(google)的安全限制将阻止您加载数据。
答案 2 :(得分:1)
此问题也在道场兴趣列表中提出,并且对on that list问题有一些回复。
答案 3 :(得分:1)
如果您的网页是通过 www.scrapbookingsuppliesrus.com 投放的,那么您发布的代码看起来是正确的。声明djConfig的方式可行,并且在xhrGet的参数中指定加载和错误是正确的。你将要深入挖掘和调试。
查看Firebug的控制台窗口。您应该看到GET请求,包括请求和响应HTTP标头以及响应文本。如果你没有看到它,那么我怀疑在你的onLoad函数被调用之前出现了其他问题 - 我也会在它的顶部抛出一个console.log。如果没有调用onLoad函数,您可能需要单击Script选项卡中的小向下箭头并设置“Break on all errors”
关于响应和ioArgs
是什么。
Response
就是回应。如果请求成功,它将是JSON对象(或XML DOM对象,或HTML DOM对象,或文本,具体取决于handleAs)。如果请求失败,它将包含一个包含错误详细信息的对象。
ioArgs
是一个对象,其中包含有关xhr请求的大量低级详细信息。作为一个副本,我发现如果你附加一个回调到xhrGet返回的延迟:
var dfd = dojo.xhrGet(args);
dfd.addCallbacks(function(response) {...}, function(error){...});
然后回调没有传递ioArgs
参数,只传递response
(或错误)。
dojocampus.org是官方的dojo文档站点,包含大量详细信息和示例。 来自O'Reilly的 Dojo:权威指南是一本很好的书。如果你要做很多dojo开发,这是一个很好的资源。
答案 4 :(得分:0)
首先,让我们从基础开始,然后您可以添加所有功能。
您只需要这个来实现Ajax(利用Dojo):
function sendData(dataToPost) {
dojo.xhrPost({
url: "http://myUrl.html",
postData: "data="+dataToPost,
handleAs: "text",
load: function(text){
getData(text);
},
error: function(error){
alert(error);
}
});
}
现在您可以使用“getData”函数中的数据
function getData(text){
myVariable = text;
}
您可以找到许多教程来了解它是如何实现的。 This是我找到的最完整的示例,在这里您可以看到它是如何实现的以及所有代码都可用: http://www.ibm.com/developerworks/java/library/j-hangman-app/index.html