Jez*_*Jez 6 javascript firefox namespaces firefox-addon jsm
在开发Firefox扩展时,我一直在阅读有关全局命名空间污染的内容,我想在扩展中尽可能地避免使用它.有几种解决方案,但一般来说,解决方案似乎只围绕为您的扩展声明一个全局变量,并将所有内容放入其中.因此,您只需向全局命名空间添加一个额外的变量,这也不算太糟糕.
简而言之,我已经向我提出了一个解决方案,避免将任何额外的变量放入全局命名空间; 将所有内容包装在函数中.这里的问题是你的XUL叠加层没有任何内容可以引用.你必须在叠加层中声明元素,然后在JS中添加大量的addEventListeners来替换oncommand="..."在XUL中类似的东西.我不想这样做; 我绝对希望我的XUL在XUL中包含事件,因为我觉得它看起来更干净,所以这对我来说不是一个解决方案.因此,我需要至少1个XUL oncommand="..."属性的全局变量来引用.
因此,共识似乎是为您的扩展添加一个(并且只有一个)变量,并将所有代码放在其中.这就是问题所在:通常,人们建议将该变量命名为一个漂亮的长而唯一的名称,以便几乎没有机会与其他变量发生冲突.因此,如果我的扩展程序的ID是myextension@mycompany.com,我可以命名我的变量myextensionAtMycompanyDotCom,或者com.mycompany.myextension.这有助于避免全局命名空间中的冲突,但是有一个问题; 变量名称冗长且难以处理.我的XUL将充斥着对事件处理程序的引用oncommand="myextensionAtMycompanyDotCom.doSomeEvent".没有办法避免在我的XUL叠加层中引用全局命名空间,因为叠加层只是被添加到浏览器窗口的DOM中; 它没有自己的命名空间,所以我们不能以某种方式将扩展的变量范围限制为我们自己的叠加层.所以,正如我所看到的,有四种解决方案:
这导致相当笨拙,冗长的XUL代码,如:
<statusbarpanel id="myStatusBar" onmousedown="myextensionAtMycompanyDotCom.onMyStatusBarClick();">
Run Code Online (Sandbox Code Playgroud)
我们为扩展提出了一个更好的短变量名称,比方说myExt,并添加一些随机字符,使其几乎肯定是唯一的,例如myExtAX8T9.然后在XUL中,我们有:
<statusbarpanel id="myStatusBar" onmousedown="myExtAX8T9.onMyStatusBarClick();">
Run Code Online (Sandbox Code Playgroud)
显然,这会导致相当丑陋甚至令人困惑的代码,因为随机字符看起来很奇怪,并使它看起来像某种临时变量.
你可以将所有内容包装在函数中.当然,这意味着您的XUL中没有任何内容可供参考,因此必须使用addEventListenerJavaScript代码将每个事件附加到XUL元素.我不喜欢这个解决方案,因为如上所述,我认为在XUL代码中引用事件而不是必须搜索大量的JS代码来查找哪些事件附加到哪个XUL元素更清晰.
我可以调用我的扩展变量myExt,然后我得到了很好的XUL代码,如:
<statusbarpanel id="myStatusBar" onmousedown="myExt.onMyStatusBarClick();">
Run Code Online (Sandbox Code Playgroud)
当然,这个简短的名称更有可能与全局命名空间中的其他内容发生冲突,因此并不理想.
那么,我错过了什么吗?我上面提出的4种解决方案有其他替代方案吗?如果没有,4中最好的是什么(鉴于#3对我来说基本上是不可接受的),为什么?
我们使用此博客文章中描述的JavaScript模块模式:http://www.adequatelygood.com/2010/3/JavaScript-Module-Pattern-In-Depth.您可以按照描述导出要在XUL处理程序中使用的符号.
此外,我们使用反向主机名作为模块名称前缀,以确保我们控制命名空间:
/* Set up the global namespace. */
if (typeof(com) == "undefined") var com = {};
if (!com.salsitasoft) com.salsitasoft = {};
/* Main namespace. */
com.salsitasoft.myExtensionGlobalStuffGoesHere = (function (my) {
return my;
})(com.salsitasoft.myExtensionGlobalStuffGoesHere || {});
Run Code Online (Sandbox Code Playgroud)
更新:我将此更改为将com.salsitasoft.myExtensionGlobalStuffGoesHere传递到闭包中(如果它已经存在),以便命名空间可以分布在多个文件中.
| 归档时间: |
|
| 查看次数: |
595 次 |
| 最近记录: |