【问题标题】:Can we delete the "getContext" property of HTML5 Canvas tag through script?我们可以通过脚本删除 HTML5 Canvas 标签的“getContext”属性吗?
【发布时间】:2011-09-30 18:26:20
【问题描述】:

有一个HTML5 conformance test suiteHTMLCanvasElement 的原型进行测试。

此测试在 Safari、Firefox 上失败,但在 Windows 7 上通过 Opera。

测试有一个脚本试图删除HTMLCanvasElementgetContext 属性,并进一步尝试读取getContext 应该给出undefined

delete window.HTMLCanvasElement.prototype.getContext;
_assertSame(window.HTMLCanvasElement.prototype.getContext, undefined, "window.HTMLCanvasElement.prototype.getContext", "undefined");

此测试对于 WebKit (Safari) 失败,因为 getContext 属性具有 DontDelete 属性,因此它不允许脚本删除此属性。

HTML5 规范中是否有说明通过脚本删除getContext 属性是有效的?

【问题讨论】:

  • DontDelete 似乎没用,因为在 WebKit 中可以只做window.HTMLCanvasElement.prototype.getContext = null
  • 是的,即使我们可以用 NULL 覆盖或替换属性 (getContext) 的值,属性“getContext”仍然存在,它保存着从 JS 绑定层查询到的最后分配的值或默认值。这个测试说的是,查询 window.HTMLCanvasElement.prototype.getContext 应该在它被删除后返回一个未定义的值(属性不存在)。

标签: javascript html canvas html5-canvas


【解决方案1】:

HTML5 规范中是否有说明通过脚本删除 getContext 属性是有效的?

不,规范中没有明确说明。不知道为什么这里的 webkit 与 FF/Opera 不同(Chrome 也不允许删除),但规范本身并不要求 Canvas 上的任何内容都使用 DontDelete。 ECMAScript 规范中的其他内容可能会。

Firefox 7 和 8 alpha 不会删除 window.HTMLCanvasElement.prototype.getContext。他们只是返回 true,但 getContext 仍然存在。换句话说,您链接到的测试在完全相同的地方因相同的原因而失败。

Webkit 当然仍然允许你覆盖任何你想要的东西:window.HTMLCanvasElement.prototype.getContext = undefined

【讨论】:

  • 决定哪些属性可以删除哪些不能删除的具体标准是什么?是否有任何链接解释了决定可以删除 HTML 元素的哪些属性集的规范??
【解决方案2】:

据我了解,getContext 方法的可配置性(ES3 中的 [[DontDelete]],ES5 中的 [[Configurable]])在 WebIDL 中进行了描述——就像任何其他 CanvasRenderingContext2D 方法一样。

看看"Interface Prototype Object" 部分,上面写着:

每个定义的接口都必须存在一个接口原型对象,无论该接口是否使用 [NoInterfaceObject] 扩展属性声明。特定接口的接口原型对象具有与该接口上定义的属性和操作相对应的属性。这些属性在下面的 4.5.5 和 4.5.6 节中有更详细的描述。

而在4.5.6,你可以看到:

接口上定义的每一个操作的唯一标识,在接口原型对象(如果是常规操作)或接口对象(如果是静态操作)上都必须有对应的属性,除非有效为该标识符和操作设置的重载集以及参数计数为 0(对于 ECMAScript 语言绑定)没有条目。

此类对应属性的特点如下:

属性的名称是标识符。

该属性具有属性 { [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: true }。

注意“[[Configurable]]: true”位(强调我的)。

【讨论】:

  • 有趣; ES5 的规范将[[Configurable]] 定义为If false, attempts to delete the property, change the property to be an accessor property, or change its attributes (other than [[Value]]) will fail. 看起来[[Condigurable]] 如果不应该被删除应该是假的。
  • 没错。这就是为什么OP提到的一致性测试期望值为undefined([[Configurable]]是true,因此可以删除属性)。
猜你喜欢
  • 2011-08-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-02
  • 1970-01-01
  • 2011-04-12
  • 2017-02-14
  • 2014-09-27
  • 2018-03-08
相关资源
最近更新 更多