dojo.xhrGet或dojo.xhrPost

时间:2009-11-02 22:58:19

标签: dojo

我对此很新,事实上这是我第一次尝试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脚本,在那里无法分辨为什么它被打破。你们其他人在开发什么样的环境?

5 个答案:

答案 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