gpt4 book ai didi

javascript - Firefox 17 报告使用 "typeof"时将 DOM 元素 (HTMLObjectElement) 创建为函数

转载 作者:行者123 更新时间:2023-11-28 02:32:50 24 4
gpt4 key购买 nike

我创建了一个 Flash 对象 (HTMLObjectElement)(使用 jQuery)并将其添加到 DOM 中。这在所有浏览器中都工作正常。该对象保存/存储在名为“o.data.cam”的变量中。其他函数检查该变量是否有效。

例如:

if( typeof o.data.cam == "object")
{ do this }

这在除 Firefox 之外的所有浏览器中都可以正常工作。 o.data.cam 是一个函数而不是一个对象。我认为这是一个奇怪的行为,因为对象已创建,为什么将其报告为函数?

在 Firefox 17.0.1(最新)中,创建的 HTMLObjectElement(对象标签)在转储时返回 [object HTMLObjectElement]。我可以理解这一点(?),因为它可以与 native 函数( protected )相同,例如 native 函数=> [ native 函数]。否则有点奇怪,因为大多数 DOM 元素都可以被检查,为什么不是他的元素呢?

但是与其他浏览器相比,有一些差异需要注意:

                        Firefox                       Chrome     MSIE      Opera
___________________________________________________________________________________________
dump o.data.cam [object HTMLObjectElement] Object* Object* Object*
typeof o.data.cam "function" "Object" "Object" "Object"
typeof HTMLObjectElement "object" "function" "Object" "function"
  • (星号)= 打印对象树

注意:- 引号之间是一个字符串,一个“typeof”结果。

typeof 评估在所有浏览器中返回“Object”(Firefox 除外),我认为这是正确的,因为当它是一个函数并作为类(新函数)创建时,它必须被报告为对象(我认为?)

我的问题是:这是一个错误还是我遗漏了什么?

编辑:创建此函数来检查它是否是有效的 DOM 元素。这样做安全吗?现在 Firefox 返回 true。

function isDOM(oo)
{
if( oo )
{
if( typeof oo instanceof jQuery )
{ return !!oo[0]; }
if( typeof oo == 'object' || typeof oo == 'function' )
{ return ( typeof oo.tagName == 'string' && oo.tagName.length > 0 ); }
}
return false;
}

最佳答案

根据 EcmaScript 规范,所有具有 [[Call]] 内部方法的对象都必须返回 typeof 的“function”。

HTMLObjectElement 的实例可以有一个 [[Call]] 内部方法,因为插件可以使它们实例化的对象可调用。

因此,唯一的问题是,如果插件不想被调用,该对象是否应该始终可调用并抛出异常,或者是否应该根据插件的内容在“对象”和“函数”之间动态更改类型在做。我猜还有第三种选择,即忽略规范并报告“对象”,即使存在 [[Call]]。

Firefox 执行前者:始终有一个 [[Call]],因此 typeof 报告“函数”。其他浏览器可能要么让 [[Call]] 动态出现和消失,要么完全违反规范。

关于javascript - Firefox 17 报告使用 "typeof"时将 DOM 元素 (HTMLObjectElement) 创建为函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13873684/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com