跨浏览器事件处理

2023-12-27

我需要一个跨浏览器功能来注册事件处理程序和(大部分)一致的处理程序体验。我不需要 jQuery 等库的全部功能或功能,因此我编写了自己的库。我相信我已经用下面的代码实现了我的目标,到目前为止我的测试已经成功,但我已经盯着它太久了。我的逻辑是否存在任何缺陷或我遗漏的陷阱?

EDIT 1:为了清楚起见,用浏览器意图注释了每个块。更新了 IE 块以不调用func马上(感谢Andy E 敏锐的目光 https://stackoverflow.com/questions/3568753/3568827#3568827).

EDIT 2:更新了 IE 块以进行调用func.call() with this代替elem.

EDIT 3:更新为通过JSLint http://www.jslint.com/与“好的部分”。

function hookEvent(elem, evt, func)
{
    if (typeof elem === "string")
    {
        elem = document.getElementById(elem);
    }
    if (!elem)
    {
        return null;
    }
    var old, r;
    if (elem.addEventListener)  //w3c
    {
        elem.addEventListener(evt, func, false);
        r = true;
    }
    else if (elem.attachEvent)  //ie
    {
        elem[evt + func] = function ()
        {
            func.call(this, window.event);
        };
        r = elem.attachEvent("on" + evt, elem[evt + func]);
    }
    else                        //old
    {
        old = elem["on" + evt] ? elem["on" + evt] : function (e) { };
        elem["on" + evt] = function (e)
        {
            if (!e)
            {
                e = window.event;
            }
            old.call(this, e);
            func.call(this, e);
        };
        r = true;
    }
    return r;
}

这条线上有一个问题:

r = elem.attachEvent("on" + evt, func.call(elem, window.event));

这将执行func()立即,而不是将其附加为事件的处理程序。相反,返回值func()将被分配给事件,如果它的类型不是,则会抛出错误"function".

我可以理解你不想使用框架,但是很多(many)其他人编写了跨浏览器事件处理片段。约翰·雷西格 http://ejohn.org/blog/flexible-javascript-events/有一个版本,Google 搜索“javascript addEvent”还有更多版本。

http://www.google.com/search?q=javascript+addevent http://www.google.com/search?q=javascript+addevent

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

跨浏览器事件处理 的相关文章

  • 如何用js获取一个月的4个星期一?

    我正在构建一个图表 其中 x 轴应该是一个月的四个星期 我只想显示该月的四个星期一 我已经有了currentMonth和currentYear变量 而且我知道如何获取该月的第一天 我所需要的只是将一个月的四个星期一放入数组中 所有这些都在同
  • 如何删除事件监听器?

    下面是我的事件监听器代码 window addEventListener beforeunload function e if sessionStorage token abide call api 如果我想删除这个事件监听器 我该怎么办
  • jqgrid 在编辑框中选择不正确的下拉选项值

    我正在使用表单编辑 表单中有两个选择框 一个选择框是国家 地区 另一个选择框是州 州选择框取决于所选的国家 地区 并将动态填充 例如 Country 美国 期权价值 1 英国 期权价值 2 美国的状态 阿拉巴马州 选项值 1 加利福尼亚州
  • $scope.$digest 之后立即触发事件

    在我的 AngularJS 应用程序中 有几个点我想等待 scope被处理到 DOM 中 然后在其上运行一些代码 就像 jQueryfadeIn 例如 有没有办法监听某种 digestComplete 消息 我当前的方法是 设置后立即 sc
  • 如何在 jQuery 中使用 CSS“background-image”属性添加的图像上绑定单击事件

    这是我的小提琴link http jsbin com otisur 1 edit 我想我的问题通过标题本身就很清楚了 尽管如此 我正在寻找一种绑定的方法click使用 css 添加的图像上的事件background image财产 我知道
  • Angular - Safari 无法正确显示 DOM

    我是 Angular 的新手 使用 Angular 4 我尝试通过在关联的组件类文件中设置属性来更新特定元素 但是 除非我尝试强制重新绘制网页 通过调整窗口大小等 否则页面不会更新 我打开检查器 看到 DOM 已更改 但显示与元素检查器中的
  • 如何按单个整数字段对 JSON 进行排序? [复制]

    这个问题在这里已经有答案了 我有以下 JSON title title order 0 order 9 order 2 JSON 包含很多字段 我如何根据字段对它们进行排序order field 我一直在寻找 Nodejs 中内置的东西 但
  • JQuery 可排序嵌套可排序 div

    这个问题与这个有关Nest jQuery UI 可排序 https stackoverflow com questions 19129476 nest jquery ui sortables 但我无法解决我的问题 问题是 我有一个包含项目的
  • Backbone.js 与 Google 地图 - 有关此问题和侦听器的问题

    我有一个为 Google Maps v3 创建的模块 我正在尝试将其转换为 Backbone js 视图构造函数 到目前为止 这是我的视图模块 我将解释代码后遇到的问题 pg views CreateMap Backbone View ex
  • 设置股票数据 Highcharts xAxis 的格式

    我已经浏览了需要为 xAxis 属性设置的 Highcharts 选项来格式化时间标签 但没有运气了解这对于这种情况到底是如何工作的 我在白天 盘中 检索了股票的动态数据 我需要显示这些数据 因为检索的数据每天从 9 30 开始到 17 0
  • 测量填写部分的时间 - 谷歌表单

    我正在尝试使用谷歌表单进行研究调查问卷 对于某些部分 我想自动测量用户填写所需的时间 谷歌表单中没有这样的选项 我尝试复制表单源 并用 javascript 填充时间 但它不起作用 跨源问题 未能成功托管复制的表单 如何做到 我如何衡量回答
  • 将数字限制为段的最优雅的方法是什么?

    比方说x a and b是数字 我需要限制x到段的边界 a b 换句话说 我需要一个钳位功能 https math stackexchange com q 1336636 clamp x max a min x b 有人能想出一个更易读的版
  • 您网站上的自定义 jQuery 脚本有多少行代码?多少才算是太多呢?

    对于我们的网站 我使用了大量 jQuery 现在我正在查看基础库顶部的 340 行 jQuery 代码 多少是太多了 我将添加更多内容 我什么时候开始尝试压缩代码并最终转向 OOP 行数并不意味着什么 重要的是你实际上在做什么 您可能拥有
  • 两个日期之间间隔 15 分钟 javascript

    问题 我需要将两个日期 时间戳之间的所有 15 分钟时隙 日期格式 2016 08 10 16 00 00 创建为 HH mm 格式的数组 其中分钟限制为 00 15 30 45 示例 中午 12 30 到下午 2 30 将 gt 12 3
  • 是否可以让 webpacks System.import 使用 ajax (用于进度事件)?

    所以我刚刚更新到 webpack 2 并进行了第一个工作设置 其中 webpack 通过查看 System import 调用自动创建块 相当甜蜜 但是 我使用 ajax 调用加载初始块 以便我可以加载时显示进度 https stackov
  • 我将 X Y Z 坐标转换为屏幕 X Y 坐标有什么问题吗?

    我正在制作 3D 空间中弹跳的球体的 HTML5 Canvas 演示 这非常简单 每个球都有 X Y 和 Z 坐标 然后 这些坐标将转换为我在此处阅读的屏幕 X 和 Y 坐标 http answers google com answers
  • 在部分渲染时执行 JavaScript

    我有一些 JavaScript 代码 我想在用户单击其文件夹之一后执行 它会触发 show 操作和 show js erb 从而呈 现部分内容 Show js erb 当用户单击其文件夹之一时触发 如下所示 body append 它成功注
  • React TypeError:x 不是函数

    我在子组件中从父组件调用函数 booksRefresh 但出现错误 类型错误 booksRefresh 不是函数 我不知道为什么 因为 booksRefresh 是一个函数 有人可以帮我解释为什么会出现这个错误吗 这是我的代码 import
  • 在 React JSX 中返回配对元素

    问题 在 React 中 您希望通过映射数组来创建 DOM 结构 但数组中的每个项目应返回 2 个元素 例如 import React from react import from lodash let Component React ex
  • 开玩笑 setTimeout 不暂停测试

    it has working hooks async gt setTimeout gt console log Why don t I run expect true toBe true 15000 我已经查看了这个答案 Jest 文档和几

随机推荐

  • 如何确定 Android OpenGL ES 上的最大纹理内存

    我正在 Android 上编写混合 2D 3D 游戏 但无法确定可以使用多少纹理内存 有没有办法确定 OpenGL ES 中的最大纹理内存 我有自己的纹理缓存 想知道纹理内存的最大阈值 我正在使用进行近似估计activityManager
  • IFrame调用父函数

    iframe 是否可以调用父级的函数 即使它们不在同一个域中 当它们不在同一域中时 我的实际方法会引发安全错误 在 iframe 内我会这样做 非常感谢 您不能直接调用该函数 由于同源政策 http en wikipedia org wik
  • 使用 SSPI 从 Windows 上运行的 Java 应用程序获取 SSO

    我有一个在 Windows 上运行的 Java 应用程序 需要使用 Kerberos SPNEGO 对 Web 应用程序进行身份验证 我知道如何配置 JAAS 来实现此目的 但我发现 Java JDK6 和 JDK7beta Kerbero
  • Windows xcopy 无法在 python 中运行

    当我在做的时候 xcopy D Accessories My File read me rtf D Any Folder Destn 复印效果很好 我在 python 2 7 中做同样的事情 import os source D Acces
  • 无法让 Coverity Scan 工作(Windows 和 Travis 上的 Java/Kotlin/Gradle 3.3)

    更新 请参阅 Caleb 的答案中的解决方案 我正在非常努力地让 Coverity 为我的构建工作 但到目前为止收效甚微 首先是细节 我的项目是普通的 java 库 没有 Web 或花哨的容器 只有很少的编译依赖项 使用 Gradle 构建
  • 字典有密钥长度限制吗?

    我想知道Python是否对字典键的长度有限制 为了澄清起见 我不是在谈论密钥的数量 而是每个密钥的长度 我将根据动态值 验证后 构建我的字典 但我不确定在这种情况下是否应该考虑长度 对于字典键没有这样的限制 由于 python 对数字类型也
  • Angularjs - 隐藏内容直到 DOM 加载

    我在 Angularjs 中遇到一个问题 在我的数据从服务器返回之前 我的 HTML 中出现闪烁 这是演示该问题的视频 http youtu be husTG3dMFOM http youtu be husTG3dMFOM 注意 和右侧的灰
  • NotificationCompat 无法解析为类型

    我是 Android 新手 收到错误消息 NotificationCompat 无法解析为类型 MinSDK 9 TargetSDK 18 到目前为止 所有消息来源对于如何解决这个问题都非常模糊 只是简单地注明 更新 JAR 文件 我需要什
  • 排序数据透视表(多索引)

    在数据透视表上放置两个 行标签 Excel 术语 后 我尝试按降序对数据透视表的值进行排序 样本数据 x pd DataFrame col1 a a b c c a b c a b c col2 1 1 1 1 1 2 2 2 3 3 3
  • 使用 UIImagePicker 一次后出现内存警告

    我提到了这个非常好的参考 https stackoverflow com questions 1282830 uiimagepickercontroller uiimage memory and more https stackoverfl
  • 在哪里放置InternalsVisibleTo

    与这个问题相关的是 AssemblyInfo 的生成是如何工作的 我一直把InternalsVisibleTo在程序集第一类的文件中 我意识到它会很有用 将 AssemblyInfo 与其他程序集属性放在一起似乎更合适 但我不希望它被无意中
  • 让 mysql select 语句返回完全限定的列名,例如 table.field

    有没有办法让 mysql select 语句返回完全限定的列名 如 table field 而不用对每个字段使用 AS like so SELECT FROM table1 LEFT JOIN table2 on table1 f ID t
  • iOS 6:收到推送通知后更新视图,但应用程序已关闭

    应用程序收到推送通知后 我想更改主屏幕上一些按钮的标题ViewController 为了实现这种行为 我在我的应用程序委托中覆盖了该方法application didReceiveRemoteNotification 重新实例化UINavi
  • 内连接mysql表

    好的 就在这里 我有两个表 产品和产品尺寸 所以基本上我的产品表有 id 主键 名称 产品名称 和 size id 来自 Product sizes 的外键 我的product sizes 表有预定值 size id name 1 1x1
  • NumPy - 涉及范围迭代器的矢量化循环

    有什么方法可以在没有 for 循环的情况下完成这项工作吗 import import numpy as np import matplotlib pyplot as plt L 1 N 255 dh 2 L N dh2 dh dh phi
  • 每种类型都有独特的变质作用吗?

    最近我终于开始觉得我理解了变形论 我写了一些关于他们的文章最近的一个答案 https stackoverflow com a 46555360 625403 但简单地说 类型的变形是递归遍历该类型的值的过程的抽象 该类型上的模式匹配具体化为
  • Yii2 重定向到上一页

    现在我的应用程序正在使用 gridview 列出所有信息 并且它也有分页 当用户单击分页号 然后单击编辑然后保存时 它将用户重定向到查看页面 我想做的是将用户重定向到上一页 带有分页号的网址 你可以使用Yii app gt request
  • 检测更改的输入文本框

    我查看了许多其他问题并找到了非常简单的答案 包括下面的代码 我只是想检测有人更改文本框的内容 但由于某种原因它不起作用 我没有收到控制台错误 当我在浏览器中设置断点时change 函数它永远不会击中它 inputDatabaseName c
  • System.Net.Mail 引用不存在

    我在创建发送电子邮件的应用程序时遇到问题 我已经有一个作为 Windows 窗体应用程序工作 然后决定从空项目中执行相同的操作 因为我现在需要创建一个后台应用程序 我用的是System Net MailWindows 窗体中的名称空间 然后
  • 跨浏览器事件处理

    我需要一个跨浏览器功能来注册事件处理程序和 大部分 一致的处理程序体验 我不需要 jQuery 等库的全部功能或功能 因此我编写了自己的库 我相信我已经用下面的代码实现了我的目标 到目前为止我的测试已经成功 但我已经盯着它太久了 我的逻辑是