2016-09-22 71 views
2

我使用Dojo和JavaScript来执行一个简单的功能:使用Dojo,我该如何动态刷新div?

  • 找到一定的DIV ID为
  • 更新该div样式部分

下面是一个包含代码的模块上述意图。调整大小功能从主模块调用。原始div风格设置在主模块上:但是,无论何时出现“调整大小”,主模块都会调用此大小调整功能以不同的样式进行更新。

define(['dojo/_base/declare', 
'dojo/query', 
'dojo/_base/html' 
], 
function(declare, query, html) { 
    return declare([], { 
    baseClass: 'jimu-panel jimu-bottom-panel', 

    resize: function() { 
     var someNode = query("#widgets_panel") 
     if (someNode != null) { 
     // found it 
     this._setPosition(someNode); 
     } else { 
     console.error ("Cannot find the node"); 
     }; 
    }, 

    _setPosition: function (somenode) { 
     // set the style 
     // refresh the node 
     html.setStyle (somenode, "left", "10px"); 
     html.setStyle (somenode, "right", "auto"); 
     html.setStyle (somenode, "bottom", "20px"); 
     html.setStyle (somenode, "top", "auto"); 
     html.setStyle (somenode, "position", "absolute"); 
     somenode.refresh(); 
    } 
    }); 
}); 
  1. 当我通过浏览器运行程序,控制台错误,指出刷新()是不是一个函数。但是,正确的样式设置刷新了div。

  2. 如果我删除了node.refresh()语句,则div不会刷新并显示不正确的样式。当然没有错误。

我研究了这个主题,发现了一些使用refresh(),update()与DOM节点但不在Dojo上下文中的例子。有没有办法动态刷新DOM节点而不会出错?

感谢,

回答

1

没有必要使用refresh既不update。 而是使用dojo/dom-style如下所示:

define(['dojo/_base/declare', 
'dojo/query', 
'dojo/dom-style' 
], 
function(declare, query, domStyle) { 
    return declare([], { 
    baseClass: 'jimu-panel jimu-bottom-panel', 

    resize: function() { 
     var someNode = query("#widgets_panel") 
     if (someNode != null) { 
     // found it 
     this._setPosition(someNode); 
     } else { 
     console.error ("Cannot find the node"); 
     }; 
    }, 

    _setPosition: function (somenode) { 
     // set the style 
     // refresh the node 
     domStyle.set(somenode, { 
      left: '10px', 
      right: 'auto', 
      bottom: '20px', 
      top: 'auto', 
      position: 'absolute' 
     }); 
    } 
    }); 
}); 

一个更好的办法是切换,而不是与内联样式打一个类名:

define(['dojo/_base/declare', 
'dojo/query', 
'dojo/dom-class' 
], 
function(declare, query, domClass) { 
    return declare([], { 
    baseClass: 'jimu-panel jimu-bottom-panel', 

    resize: function() { 
     var someNode = query("#widgets_panel") 
     if (someNode != null) { 
     // found it 
     this._setPosition(someNode); 
     } else { 
     console.error ("Cannot find the node"); 
     }; 
    }, 

    _setPosition: function (somenode) { 
     // set the style 
     // refresh the node 
     domClass.add(somenode, 'newDivStyle'); 
    } 
    }); 
}); 

在CSS文件,创建相应的类:

.newDivStyle { 
     left: 10px; 
     right: auto; 
     bottom: 20px; 
     top: auto; 
     position: absolute; 
} 
+0

谢谢本。我只是尝试第一种方法,它与我的原始代码具有相同的效果(** no **更新了预期样式。)当我添加刷新时,它按预期工作(使用新样式)。对于第二种方法,它添加了新的类,但以某种方式显示原始样式(我怀疑它已经被写过了),因此它不能按预期工作。 - Chi – user3570980

+0

刷新它的工作原因是因为JS错误。它会停止执行下一条指令。所以我的赌注是:在'_setPosition'之后,其他的东西正在改变风格。你应该看看接下来会发生什么。你用第二种方法描述的问题往往证实我的赌注。 – ben

+0

嗨,本。如果样式在我的模块中没有被有效地改变,那么主模块将把样式转换回默认值。开发人员曾解释说,由于某种原因,JS错误导致样式变得有效,所以主模块之后不再修改样式。我更愿意调用正确的功能来实现变化,而不是偶然发生JS错误。 – user3570980