首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >全球识别的元素、类型记录和仅限Safari的bug?

全球识别的元素、类型记录和仅限Safari的bug?
EN

Stack Overflow用户
提问于 2015-09-28 19:11:35
回答 1查看 402关注 0票数 1

假设您有这样一个select元素:

代码语言:javascript
复制
<select id="Stooge" name="Stooge">
    <option value="0">Moe</option>
    <option value="1">Larry</option>
    <option value="2">Curly</option>
</select>

根据等级库,当浏览器解析此页面时,它会创建一个全局范围的javascript变量window.Stooge。到目前一切尚好。

在我的TypeScript代码中,我想以强类型的方式引用这些选项,因此我有以下内容:

代码语言:javascript
复制
enum Stooge
{
  Moe,
  Larry,
  Curly
}

它被编译成javascript,如下所示:

代码语言:javascript
复制
var Stooge;
(function (Stooge) {
    Stooge[Stooge["Moe"] = 0] = "Moe";
    Stooge[Stooge["Larry"] = 1] = "Larry";
    Stooge[Stooge["Curly"] = 2] = "Curly";
 })(Stooge || (Stooge = {}));  <---error here

我的问题是:在每个浏览器中,除了 Safari之外,这一切都很好。但是在Safari中,我得到了以下错误:

代码语言:javascript
复制
YourFile.js:[Line X]TYPE_MISMATCH_ERR: DOM Exception 17: The type of an object was incompatible with the expected type of the parameter associated to the object.

这只发生在与DOM元素具有相同名称的枚举中,我猜想这是因为这两个定义之间存在冲突,但除了在Safari中以外,相同的代码不会导致任何其他错误。

那么,为什么它能在其他浏览器中工作,在Safari中有什么方法可以解决这个问题呢?(我可以重命名枚举或DOM元素,但如果可能的话,我希望避免人工命名约定的需要。)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-09-28 19:46:18

只要有可能,就应该避免在全局范围内放置任何内容。外部模块(很快将被重命名为更简单的名称,模块)是一种很好的方法。使用外部模块,您的enum将安全地隐藏在模块的范围内,不应该与其他任何东西发生冲突。

另一种解决方案是使用常量枚举,将其转换为普通数字(即删除枚举类型)。例如,下面的TypeScript:

代码语言:javascript
复制
const enum Stooge
{
  Moe,
  Larry,
  Curly
}

var x = Stooge.Curly;

JavaScript的结果如下:

代码语言:javascript
复制
var x = 2 /* Curly */;

您的最后一个选择是避免可能发生冲突的名称。在全局范围内放置某物时,它有助于尽可能具体地将碰撞的风险降到最低。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32830126

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档