2010-12-02 72 views
0

我几年来一直是dojo(核心)用户。在道场空间上建立我自己的小部件;忽视dijit和dojox。在我自己的世界工作。这是它的优点,但我一直有这样的感觉,即在构建另一个选项卡式面板,旋转木马或对话框时,我正在重新发明轮子。所以我决定使用dijit。Dijit的优雅降解

用我自己的小部件,我给自己定一些基本规则

  1. 一个小部件都必须适当地[当没有JS加载]降解的可访问性和搜索引擎优化
  2. 应该有后无重画js的是(所有HTML之后总是包含在页面上,只是身体结束标记之前)加载
  3. 没有内嵌JS(脚本必须是独立于HTML)

问题

Dijit有两种被实例化的方法:声明式和编程式。无论哪种方式似乎打破了其中一个规则。

a。 声明实例

看起来要么是这样的:

<div dojoType="MyFirstWidget"> 
    <ul> 
    <li dojoAttachPoint="counter">0</li> 
    <li><a dojoAttachEvent="_updateCounter" href="#">Update</a></li> 
    </ul> 

    <script type="dojo/connect" event="onClick" args="evt"> 
    console.log("This will execute after of the Button dijit's onClick method has been called."); 
    </script> 
</div> 

正如你所看到的,这显然打破了第三个规则(没有内嵌的js)。

b。 编程实例

dojo.require("dijit._Widget"); 
dojo.require("dijit._Templated"); 

dojo.declare("MyFirstWidget", [dijit._Widget, dijit._Templated], { 
    templateString: "<div class='awesome'>0</div>", 

    postCreate: function() { 
    console.log("postCreate"); 
    } 
}); 

(new MyFirstWidget()).placeAt(dojo.body()); 

而这样一来,规则1 & 2被打破。 (1)没有可访问性或SEO价值(2)一旦模板被设置,浏览器将需要重新绘制整个页面。

问题:是否有可能(和实际)使用dijit,并仍然遵循规则?

回答

1

是的,这是既可行又实用。但是,您的规则#2使得很难使用任何预先构建的Dijits,因为它们被设计为附加到节点并使用“Dojo样式”重新构建它。你可以通过设计节点的样式来解决这个问题,使其看起来像最终的结果 - 但这似乎比它的价值更麻烦,但它是遵循这一规则并仍然使用一些必要组件的唯一方式(即很难做你自己)像FilteringSelect。

主要是因为#2,我会建议你不是使用* dijit._Templated *。只需使用* dijit._Widget *,而不是使用内部HTML,只需附加到文档中现有的HTML。

也许你可以弯曲#2,并允许它被修改和重新定义,但不会太多,它会改变DOM对于搜索引擎或语音阅读器的外观。

我从来没有做过#3自己,所以希望这不应该很难。

对于#1它取决于小部件。您可以使用标准浏览器选择并使用Dojo将其升级到FilteringSelect。