2009-11-02 61 views
4

我对此很新,实际上这是我第一次尝试Dojo。我试图从网站获取数据:dojo.xhrGet or dojo.xhrPost

<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,但随后萤火虫会引用一个非常大的dojo脚本,在那里不可能说明它为什么被破坏。你们其他人在发展什么样的环境?

回答

1

那里有几个非常基本的错误在你的代码。

<script ... djConfig="parseOnLoad:true,isDebug:true"/></script>

  • 在这里使用脚本标记/>(这是禁止的)的缩写形式同时在结尾</script>了。

console.log("hi")

  • 这里有一个分号失踪在声明

您尝试从http://www.scrapbookingsuppliesrus.com/catalog/layout加载数据的端脚本还取决于域中运行?否则CrossDomain-Ajax的安全限制(谷歌它)将阻止您加载数据。

1

在道场兴趣清单上也询问过这个问题,并且对问题on that list有几个回复。

4

好吧,有几个问题。

让我们先从非常容易的人开始。

当你开发你想使用道场的“非压缩”版本,可以通过附加.uncompressed.js到Dojo库的路径中使用:

http://o.aolcdn.com/dojo/1.3/dojo/dojo.xd.js.uncompressed.js 

这将使如果它出现在核心Dojo中,它会更容易看到什么会中断。

接下来是djConfig参数。我很肯定的是,道场可以处理字符串,但传统上它已经与对象定义,所以,一旦你包括你的Dojo库:

<script src="path to dojo"></script> 

开始一个新的脚本块并定义djConfig对象在那里:

<script> 
    djConfig = { 
    parseOnLoad: true, 
    isDebug: true 
    }; 
</script> 

接下来最简单的,我用的IntelliJ JIDEA发展,它有内置的代码意义道场,让生活变得更轻松。否则,标准包,Firefox + Firebug。

的复杂的东西:

看来你使用的是XHR方法请求数据,希望大家都知道,这意味着正在访问你的脚本和数据必须驻留在同一个域中,如果他们不”你会有安全错误。这怎么解决?您使用称为跨域脚本的技术,dojo也通过dojo.io.script.get功能支持。

更复杂的东西:

道场可与一些所谓的“延迟”的对象。这意味着请求并不会在创建对象时实际发生,而是在您请求它出去时熄灭,这就是“延迟”的概念,您将代码块的执行推迟到晚点。这个问题然后将在您的情况下解决的方式是这样的:

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

如果您的页面服务于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请求的较低级别细节的对象。作为asice,我发现,如果附加回调至xhrGet推迟返回:

var dfd = dojo.xhrGet(args); 
dfd.addCallbacks(function(response) {...}, function(error){...}); 

则回调未通过ioArgs说法,只是response(或错误)。

dojocampus.org是官方Dojo文档网站,包括很多的细节和例子。 Dojo:来自O'Reilly的权威指南是一本很好的书。如果你打算做很多dojo开发工具,这是一个很好的资源。

0

首先,让我们从基础开始,然后您可以添加所有功能。

你只需要这个实现Ajax(利用道场):

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