在div上应用javascript函数

时间:2015-03-02 09:44:32

标签: javascript html inheritance dojo

我想在div上放一个变量,并由此div下的所有dojo小部件应用和继承。

这可行吗?

例如

<div shaper="Contextual"> 
<textarea ..../> 
<select multiple data-dojo-type="dijit/form/MultiSelect"> 
.... 
</div> 

我希望整形器支持的功能应用于div中包含的所有小部件。 p。:&#34; shaper&#34;是一个自定义模块,用于对阿拉伯数字进行数字整形。

1 个答案:

答案 0 :(得分:0)

这是可能的,但不是开箱即用。

你可以这样写:

require(["dojo/query", "dojo/domReady!"], function(query) {
  query("[shaper]").forEach(function(shaper) {

  });
});

这将查询具有shaper属性的所有元素并循环遍历它。在循环内部,您必须检索shaper属性的值(例如Contextual),您可以使用getAttribute()函数执行此操作,例如:

var shaperModule = shaper.getAttribute("shaper");

现在您有要加载的模块的名称,因此您可以在循环中编写类似的内容:

require([shaperModule], function(shaperModule) {

});

这将使用AMD来检索Contextual模块。现在剩下的就是将shaper功能包含在<div>内的所有小部件中。

首先,使用dijit/registry::findWidgets()可以检索特定DOM节点中的所有小部件,在这种情况下,您可以使用它来检索dijit/form/MultiSelect小部件:

registry.findWidgets(shaper);

然后,您可以遍历找到的小部件数组,并使用dojo/_base/lang::mixin()扩展具有另一个对象内容的对象,例如:

registry.findWidgets(shaper).forEach(function(widget) {
    lang.mixin(widget, shaperModule);
});

例如:http://jsfiddle.net/zLv7cvzt/

虽然这可能不完全有用(如果模块不存在或者小部件中的小部件怎么办,dijit/registry::byId()没有检测到),它确实可以让你知道如何实现它。


要回答你的第二个问题,如果可行或不可行,我会说这取决于。如果你用这样的另一个小部件扩展一个小部件,它实际上可能真的很奇怪,因为所有小部件都从提供小部件生命周期的dijit/_WidgetBase扩展,你可以在它们的生命周期中混合两个小部件。

此外,如果您最终这样做并且出现错误,如果您不熟悉自定义代码,则很难对其进行调试。