Dijit优雅降级

时间:2010-12-02 21:54:46

标签: javascript dojo unobtrusive-javascript

我几年来一直是dojo(核心)用户。在dojo空间顶部构建自己的小部件;忽视了dijit和dojox。在我自己的世界里工作。这有它的优点,但我一直觉得我正在重新发明轮子,同时建立另一个标签面板,旋转木马或对话框。所以我决定使用dijit。

使用我自己的小部件,我设置了一些基本的规则

  1. 对于辅助功能和SEO
  2. ,窗口小部件必须正常降级[当没有加载js时]
  3. 加载js后应该没有重绘(在所有html之后总是包含在页面中,就在正文结束标记之前)
  4. 没有内联JS(脚本必须与HTML分开)
  5. 问题

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

    一个。 声明实例化

    看起来像是:

    <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>
    

    正如您所看到的,这显然打破了第3条规则(没有内联js)。

    程序化实例化

    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&amp; 2被打破了。 (1)无可访问性或SEO值(2)设置模板后,浏览器需要重绘整个页面。

    问题:使用dijit是否可行(并且实用),仍然遵循规则?

1 个答案:

答案 0 :(得分:1)

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

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

也许你可以弯曲#2,并允许它被修改和重新设计,但不是太多,以至于它改变了DOM对搜索引擎或语音阅读器的看法。

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

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