为什么使用createElement而不是XUL描述?

时间:2013-06-01 02:55:43

标签: javascript performance firefox xul firefox-developer-tools

我在Firefox Devtools中扩展了css规则查看器,发现了一些有趣的东西: 这是chrome的内容://browser/content/devtools/cssruleview.xul:

<?xml version="1.0"?>
<!-- This Source Code Form is subject to the terms of the Mozilla Public
   - License, v. 2.0. If a copy of the MPL was not distributed with this
   - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
<?xml-stylesheet href="chrome://global/skin/global.css"?>
<?xml-stylesheet href="chrome://browser/content/devtools/styleinspector.css" type="text/css"?>
<?xml-stylesheet href="chrome://browser/skin/devtools/csshtmltree.css" type="text/css"?>
<?xml-stylesheet href="chrome://browser/skin/devtools/common.css" type="text/css"?>

<!DOCTYPE window [
  <!ENTITY % inspectorDTD SYSTEM "chrome://browser/locale/devtools/styleinspector.dtd">
  %inspectorDTD;
]>
<window xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" title="&ruleViewTitle;">
  <script type="application/javascript;version=1.8">
    window.setPanel = function(panel, iframe) {
      Components.utils.import("resource:///modules/devtools/StyleInspector.jsm");
      this.ruleview = new RuleViewTool(panel, window, iframe);
    }
    window.onunload = function() {
      if (this.ruleview) {
        this.ruleview.destroy();
      }
    }
  </script>
</window>

然而,DOM检查器显示了许多不同的元素,一个带有上下文菜单项的menupopup等。我试图用这个覆盖文件,但它不起作用..可能是因为它是动态生成的。这不起作用:

<?xml version="1.0" encoding="utf-8"?>
<overlay id="cssInspectorOverlay" xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">


<menupopup id="rule-view-context-menu">
    <menuitem id="new-rule-devtooltweak"
        label="New Rule..."
        accesskey="N"
        oncommand="alert('yahoo')"/>
</menupopup>

</overlay>

在Mozilla中查看CssRuleView.jsm,我发现元素是使用createElement创建的,而不是xul文件!我想知道为什么他们这样做 - 出于性能问题或其他原因?

1 个答案:

答案 0 :(得分:0)

你在这里要求猜测。有问题的代码最初是在bug 703643中引入的,我没有看到有关该方法的讨论--Michael Ratcliffe显然认为这是最好的方法,没有人有任何担忧。开发人员工具通常更喜欢动态生成内容并仅使用最小的初始XUL / HTML内容 - 通常这是合理的,因为他们显示的大多数内容都是动态的。因此,在严格必要的情况下,开发人员滥用动态内容生成并不奇怪。

我可以在这里看到另外两个动态生成内容的原因:

  • 所有本地化数据都可以保存在.properties个文件中,而不是在.properties.dtd之间分开。
  • 您必须动态附加事件处理程序,因为XUL文档无法&#34;请参阅&#34; JS模块的功能。