HTML4 中的 Element.animate()

2024-01-24

Chrome 的人似乎已经占用 Element.animate() http://updates.html5rocks.com/2014/05/Web-Animations---element-animate-is-now-in-Chrome-36对于他们自己来说,使用类似的东西有效地破坏了所有现有的 HTML 页面onclick="animate();".

这对于 HTML 4/Transitional 规范下的浏览器来说合法吗?这是 W3C 正式拥有的权力吗?

小型网站所有者可以采取什么措施来防止此类违规行为进一步发生?

编辑: 测试用例:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
    "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
    <title>test</title>
    <script type="text/javascript">
        function animate() {
            alert('this should work');
        }
    </script>
</head>
<body>
    <input type="button" onclick="animate();" value="push me!">
</body>
</html>

结果是Uncaught TypeError: Failed to execute 'animate' on 'Element': 1 argument required, but only 0 present.适用于 Chrome,但适用于 FireFox。


你所指的改变并非谷歌单方面的举动,而是谷歌计划的一部分。名为 Web Animations 1.0 的 W3C 标准草案 http://dev.w3.org/fxtf/web-animations/。您遇到麻烦的具体修改是DOM 的扩展Element界面 http://dev.w3.org/fxtf/web-animations/#extensions-to-the-element-interface其中添加了三个新方法,包括animate():

由于 DOM Elements 可能是动画的目标,因此 Element 接口 [DOM4] 扩展如下:Element implements Animatable;

这允许以下类型的使用。elem.animate({ color: 'red' }, 2000);

这里的 DOM 代表“文档对象模型”,即另一个标准,与 HTML 分开 http://www.w3.org/TR/dom/它定义了 JavaScript 和其他语言应如何公开 HTML、XML 或类似文档并与之交互。该标准多年来已进行了多次扩展,因此添加此新方法Element这些物体绝不是史无前例的,也不可能引起争议。


您的具体问题是之一命名空间冲突。 JavaScript 的作用域规则在任何情况下都相对复杂,当您在 HTML 属性中嵌入事件处理程序时,会出现一些特殊的逻辑,如这篇关于“事件属性”的 MDN 文章 https://developer.mozilla.org/en-US/docs/Web/Guide/HTML/Event_attributes.

结果是,当你写onclick="animate();", animate被查找为多个作用域或命名空间中的属性,包括:

  • 作为被单击元素的属性,该元素已绑定到this;如果发现,animate()将表现得与this.animate()
  • 作为全球财产window对象,在任何情况下始终是最后检查的范围;因此,如果没有找到其他东西,animate()将相当于window.animate()

你的问题是你依赖于从全局命名空间调用的东西,但是对 DOM 的更改意味着它现在定义在this以及(具体来说,它是在所有后代的原型中Element)。由于新函数优先于现有函数,因此会发生意外的行为变化。

因此,对代码最简单的修复是更具体地限定您的事件,如下所示onclick="window.animate();"。您不仅应该对您知道现在存在冲突的方法和变量执行此操作,还应该对所有这些方法和变量执行此操作,以便将来它们不会受到 DOM 的其他更改的影响。 (这是该方法的演示 http://jsfiddle.net/bKB8E/4/.)


但是,如果您想让代码更加健壮,则应该进行更广泛的更改,以使其符合最新的编码实践:

  • 而不是使用“事件属性”,例如onclick,以编程方式添加事件侦听器。现代 API 是addEventListener https://developer.mozilla.org/en-US/docs/Web/API/EventTarget.addEventListener,尽管很多人更喜欢像这样的图书馆jQuery http://jquery.com/这使得使用不同的浏览器变得更容易,并简化了常见任务(在这种情况下,您可以使用the .on() method http://api.jquery.com/on/).
  • 不要将函数放入全局作用域,而是将它们设置为某个对象的属性,以便您可以跟踪自己的名称空间。更好的是,如果将它们与 HTML 分开(使用类似addEventListener或者 jQuery 的.on),你可以让它们private变量,甚至无法从全局范围访问,通过使用IIFE https://en.wikipedia.org/wiki/IIFE(一个封闭函数,其存在只是为了创建一个新的变量范围)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

HTML4 中的 Element.animate() 的相关文章

随机推荐

  • WPF 装饰器有什么意义?

    我最近为我的公司开发了一个绘图组件 其中包含一个画布 您可以在上面通过单击并拖动来绘制某些形状 对于每个形状 我在其 AdornerLayer 上放置了两个装饰器 一个用于增加命中检测 基本上是一个会超出形状边界几个像素的透明矩形 另一个用
  • 什么是

    我对 Vue js 完全陌生 我想我对路由器如何处理以下内容有一些了解
  • 使用 dateutil 解析器从字符串中解析日期

    我正在尝试解析字符串格式的日期 u 2015 年 6 月 11 日 12 26 小时 美国标准时间 但是当我使用 dateutil 解析器来解析时出现错误 from dateutil parser import parse parse u
  • SQL:NOLOCK 导致查询速度变慢

    向查询添加 nolock 是否有任何原因会导致执行时间增加 UPDATE TargetTable SET col1 c1 RowCnt col2 c2 RowCnt from TargetTable tt join select col3
  • 为什么在快速排序中选择随机主元

    So choosing a pivot at random has O n2 running at worst case but when the pivot is chosen as the average of min value an
  • 如何在 JPopupMenu 中获得焦点

    我是一名经验丰富的 Java 程序员 但还是一名 Swing 新手 所以请耐心等待 我希望有一个具有键盘焦点的 JPopupWindow 我想响应箭头键 Escape 关闭菜单 和 Enter 调用该项目 我是否必须在菜单中添加一个 Key
  • 如何使用 MS Ole DB 提供程序在两个 FoxPro 数据库之间创建联接?

    问题 我正在使用现有的商业 MS Visual Foxpro 应用程序 并且需要使用 C 应用程序直接从数据库中提取数据 不幸的是 并非所有表都存储在同一个数据库中 一些记录存储在按年份细分的数据库中 如何使用单个联接创建针对这两个数据库的
  • 这是检测反应组件中第一次渲染的正确方法

    我有一个场景 我需要检测组件的第一次渲染 我在这里构建了一个小例子 有人可以向我解释什么是正确的方法吗 为什么大多数人建议使用ref而不是一个简单的状态 https codesandbox io s condescending burnel
  • struct String() 实现导致堆栈溢出并带有 Sprintf“+”标志

    Golang菜鸟问题 为什么我可以not使用 v String 实现方法中结构的标志 我有一个结构 我想在其中实现String 漂亮打印的方法 我喜欢给出的答案here https stackoverflow com a 33252434
  • 错误的状态类——在带有自定义视图的 Android 1.5 中期望视图状态异常

    当我切换到横向模式时 以下自定义视图在 Android 1 5r3 cupcake 中引发异常 java lang RuntimeException Unable to start activity ComponentInfo com op
  • 重写 git 历史记录,替换每个文件中的一个单词

    我想用 git filter branch 重写我的存储库的 git 历史记录 以将所有文件中所有出现的 foo bar 替换为 bar foo 我怎样才能实现这个目标 Update 我一直在使用 tree filter 参数 并且我已经能
  • 映射到任一左侧

    在我的应用程序中的某个地方我收到Either ParserError MyParseResult从秒差距 在下游 此结果通过使用其他库完成了一些其他解析 在解析的第二阶段 也可能会发生某种错误 我想将其作为Left String 但为此我需
  • 即使捕获错误,Observable 也会停止触发

    我在我的项目中遇到了一个非常奇怪的行为 我有一个简单的 Angular 服务 代码如下 seatClick new Subject
  • 求 hh:mm:ss 的时间平均值

    我有这个小提琴可以计算以毫秒为单位的平均时间 但是 我的数据库以 hh mm ss 格式存储数据 fiddle http jsfiddle net 3yVMK 1 var times 00 00 03 00 00 00 05 00 00 0
  • Sys.WebForms.PageRequestManagerServerErrorException:输入字符串的格式不正确

    嗨 我收到错误 Sys WebForms PageRequestManagerServerErrorException 输入字符串的格式不正确 当按下删除按钮时 但此错误仅出现在一台 Web 服务器中 在其他服务器上它工作正常 同样 当本地
  • !!布尔值表达式

    我正在读约翰 雷西格的书JavaScript 忍者的秘密并看到了这段代码 function Ninja this swung false Should return true this swingSword function return
  • Microsoft Graph APi 未返回“已取消”事件

    我正在尝试使用 Microsoft 图形 API 获取会议室日历中的所有事件 给定 startDateTime 和 endDateTime 我尝试了以下 API 1 https graph microsoft com v1 0 users
  • 如何获取 Python 多处理池剩余的“工作”量?

    到目前为止 每当我需要使用multiprocessing http docs python org 2 library multiprocessing htm我通过手动创建 进程池 并与所有子进程共享工作队列来完成此操作 例如 from m
  • 如何用c++解析http请求

    我正在尝试编写一个小型 C Web 服务器来处理 GET POST HEAD 请求 我的问题是我不知道如何解析标头 消息正文等 它正在监听套接字 我什至可以将内容写入浏览器 但我很好奇我应该如何在 C 中执行此操作 据我所知 标准的 GET
  • HTML4 中的 Element.animate()

    Chrome 的人似乎已经占用 Element animate http updates html5rocks com 2014 05 Web Animations element animate is now in Chrome 36对于