dojo / dijit ContentPane设置内容

时间:2010-03-08 16:39:57

标签: javascript dom dojo

我正在尝试将通过dojo.XHRGet检索到的某些XML附加到dijit.layout.ContentPane。在Firefox(3.6)中一切正常,但在Chrome中,我只能在特定的ContentPane中找回'undefined'。

我的代码看起来像这样:

var cp = dijit.byId("mapDetailsPane");
cp.destroyDescendants(); // there are some existing Widgets/content I want to clear
                         // and replace with the new content

var xhrData = {
  url : "getsomexml.php",
  handleAs: "xml",
  preventCache: true,
  failOk: true
};

var deferred = new dojo.xhrGet(xhrData);
deferred.addCallback(function(data) {
  console.log(data.firstChild); // get a DOM object in both Firebug 
                                // and Chrome Dev Tools
  cp.attr("content",data.firstChild); // get the XML appended to the doc in Firefox,
                                      // but "undefined" in Chrome
});

因为在两个浏览器中我都找回了一个有效的Document对象,我知道XHRGet工作正常,但是内容的设置方式似乎存在某种差异。有没有更好的方法来处理请求中的返回数据?

有人要求查看我的XML,所以这里有一部分......

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns:svg="http://www.w3.org/2000/svg" 
 xmlns="http://www.w3.org/2000/svg" 
 xmlns:xlink="http://www.w3.org/1999/xlink" 
 version="1.1" width="672" height="1674">
 <defs>
   <style type="text/css">
     <![CDATA[ ...bunch of CSS...
     ]]>
   </style>
   <marker refX="0" refY="0" orient="auto" id="A00End" style="overflow: visible;">
   ...bunch more defs...
 </defs>
 <g id="endpoints">
   ...bunch of SVG with a some...
   <a xlink:href="javascript:gotoLogLine(16423,55);" xlink:type="simple">...more svg...</a>
 </g>
</svg>

我已经通过用于XML的WC3验证器运行输出XML以验证它是否有效。就像我之前说过的那样,可以在FireFox 3.6中使用。我在Safari上尝试过,我得到了相同的“未定义”,所以它似乎与Webkit有关。

2 个答案:

答案 0 :(得分:1)

cp.containerNode.appendChild(data.firstChild)有效吗?将ContentPane视为可以接受任意XML节点的通用容器可能会过多地询问它。它的主要用例是 - 并且始终是 - 注入HTML。不是说它无法工作,而是它在这个小部件中没有很好地探索的角落案例。

答案 1 :(得分:1)

我不确定我最近的遭遇是否和你一样。 我正在使用html-head部分中加载的外部javascript文件作为cheking用户脚本。 这是我在IE中生成错误的代码,但这不会在Firefox中生成错误。

function loginCheck()
{
var username = dojo.byId("usernameBox").value;
var password = dojo.byId("passwordBox").value;
var loginForm = dijit.byId("loginDialog");
var mainPage = dijit.byId("entirePage");
var menuUrl = "";

if(username != 'admin' && username != 'user'){
    alert('Incorrect username');
} else {
    if(password != '1234') {
        alert('Incorrect password');
    } else {
        loginForm.hide();
        dojo.style(mainPage.domNode, {visibility:"visible"});
        dojo.doc.title = dojo.doc.title + " : Signed in as [" + username + "]";

        if(username == 'user'){
            menuUrl = "../data/userMenu.json";
        } else if(username == 'admin') {
            menuUrl = "../data/adminMenu.json";
        }

        var treeStore = new dojo.data.ItemFileReadStore({
            url : menuUrl
        });

        var treeModel = new dijit.tree.ForestStoreModel({
            store : treeStore,
            query : {
                "type" : "category"
            },
            childrenAttrs : ["children"]

        });

        var naviTree = new dijit.Tree({
            model : treeModel,
            showRoot : false,
            autoExpand : true
        }, "naviPane");

        dojo.connect(naviTree, "onClick", function(item){
                var targetPage = item.link;

                var targetPane = dijit.byId("centerPane");
                console.log(targetPage);
                **targetPane.attr('href',targetPage);**
                console.log("redirect success.");
        });
    }
}

在**线。 IE返回此错误。

  

网页错误详情

     

用户代理:Mozilla / 4.0(兼容; MSIE 8.0; Windows NT 6.1; Trident / 4.0; SLCC2; .NET&gt; CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.2;&gt; Tablet PC 2.0; .NET4.0C; .NET4.0E; AskTB5.6)   时间戳:星期二,2010年10月19日08:24:35 UTC

     

消息:对象不支持此属性或方法   行:49   查尔:21   代码:0   URI:http://localhost:8080/TestESarabun/script/loginCheck.js

在我跟踪到dojo库并使用这段代码停止在文件dojo / _base / xhr.js之后。

dojo._ioAddQueryToUrl = function(/ * dojo .__ IoCallbackArgs * / ioArgs){   // summary:将io延迟构造发现的查询参数添加到URL。   //仅将此用于基本为GET类型操作的操作。   如果(ioArgs.query.length){    ioArgs.url + =(ioArgs.url.indexOf(“?”)== -1?“?”:“&amp;”)+ ioArgs.query;    ioArgs.query = null;   }
 }

我的粗略解决方案只是注释“indexOf”行,然后,我的Web应用程序运行没有任何错误。 无论如何,我不确定这条线要做什么?