我有一个嵌入在其他网站上的 JavaScript 小部件(一段嵌入的 JS 和 HTML 代码)。我应该怎么做才能确保它的变量名不会与托管页面变量发生冲突?
我希望这个小部件与托管页面在同一页面上“内联”,而不是在 iframe 中,避免与托管页面发生名称冲突或与其他小部件发生冲突的最佳方法是什么?
名称冲突可能以多种方式发生:
- JavaScript 变量名
- JavaScript 函数名称
- DOM 元素标识符
- CSS 类名
- 也许更多...
我可以想到几种避免名称冲突的方法,但我想知道是否有最佳实践或其他一般性建议。所以这是我的2c:
- 只需使用长且尝试唯一的名称。这是丑陋的,不是完全证明,但在概念上很简单。
- 使用 iframe。但如前所述,我不想使用 iframe 有几个原因。我希望小部件从页面继承样式属性(例如默认字体和背景颜色),最重要的是,我不知道小部件会有多大。它取决于实时数据,可以是任意大小。
- 使用匿名函数以获得更好的范围,例如 (function(){my code here})()。这个解决方案虽然很优雅,但首先仍然不适用于我 b/c,它只解决了 JS 名称冲突而不是 DOM ID 或 CSS 类名称,其次,我还使用了 jsonp,我需要为其提供回调函数name,最终需要在全局范围内,所以不能嵌套在匿名函数范围内。
- 在 JavaScript 中创建一个命名空间机制,它将提供 JS 变量和函数的唯一性。样式 window['my_app'][variable_name] 或 window['my_app']function_name 的东西。这也有点难看,但至少我可以控制命名空间并且可以生成保证是唯一的命名空间。