【问题标题】:dom.byId returns undefined after the element has been added添加元素后 dom.byId 返回 undefined
【发布时间】:2014-10-15 19:21:48
【问题描述】:

我有一个函数将 div 作为子项添加到 dijit/layout/conentpane。我遇到的问题是,在添加此 div 后,我无法使用 dom.byId 引用它:创建此 div 的函数是从菜单项的单击事件中调用的:

菜单项:

<div id="miLMWS" data-dojo-type="dijit/MenuItem" data-dojo-props="onClick:function(){SetPage('LMWS');}">Watershed</div>

onclick 函数(SetPage):

....

function (dom, parser, registry, ready, WatershedMap, OWOWMapGallery) {
            window.SetPage = function (pg) {
                //set the page depending on the menu item clicked
                ClearWidget();//destroys previous widget deleting the div
                AddToolDiv();//add the div
                switch (pg) {
                    case 'LMWS':
                        var test = dom.byId("tool"); //this is undefined
                        //WS = new WatershedMap({}, "tool");
                        break;
                }
            };
...

addDivFunction:

function AddToolDiv() {
     //add page div (node where template will be placed in
     var tool = document.createElement("div");
     tool.setAttribute("id", "tool");
     var ContentContainer = registry.byId("MainContent");
      ContentContainer.set("MainContent", tool);
      var test = dom.byId("tool");//this is undefined
 }

每次单击菜单项时,都会将新的自定义小部件加载到工具 div 中。 (有一个函数 ClearWidget 可以破坏旧的小部件和工具 div)我在想这可能与从 onClick 事件调用函数有关?当我在页面第一次加载测试变量时调用 AddToolDiv 时正确地引用了工具 div。任何帮助将不胜感激。

谢谢

【问题讨论】:

    标签: javascript dojo


    【解决方案1】:

    byId 函数将在 DOM 中搜索具有给定 id 的元素。如果您调用byId 时您的工具元素实际上并未插入到DOM 中,您将得到未定义。

    您显示的代码实际上从未将工具元素插入 DOM,它只是将其传递给 ContentContainer.set("MainContent", tool) 调用。请务必检查此调用是否确实立即将工具元素插入 DOM。调用byId 时是否将ContentConainer 本身插入到DOM 中?

    【讨论】:

    • 谢谢 - 这有助于我了解可能发生的事情。有趣的是,我在树点击事件上使用了完全相同的方法并且效果很好。
    【解决方案2】:

    你可以试试这些东西

    var test = dom.byId("tool",ContentContainer.domNode);

    否则你可以直接持有这个dom的引用 this.tool = document.createElement("div");

    使用dojo中提供的domconstruct api

    【讨论】:

    • 感谢我能够使用 this.tool = document.createElement("div");我现在在创建新小部件时尝试使用它: WS = new WatershedMap({}, this.tool);但我无法读取 null 的属性 ID?
    • 您能否提供更新后的代码,或者您能否在 jsfiddle 中设置一些内容,这很可能是一个范围问题,您在哪里创建 div 以及在哪里创建小部件,还有一个尝试使用 domconstruct.create 而不是使用 document.createelement。请提供更多信息
    • 我用过:this.tool = domConstruct.create("div");并得到相同的结果。我会看看我是否可以在 jsfiddle 上设置一些东西谢谢
    • @pvitt 您必须在创建小部件时提供 .domNode WS = new WatershedMap({}, this.tool.domNode);希望这会有所帮助
    • 我终于想通了。问题出在 AddToolDiv 函数中: ContentContainer.set("MainContent", tool);需要:ContentContainer.set("content", tool);我没有将我的工具 div 添加到 ContentContainer 感谢所有帮助 - 抱歉,这太愚蠢了
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-02
    • 1970-01-01
    • 2019-03-19
    相关资源
    最近更新 更多