如何在没有浏览器检测的情况下识别“输入”事件中的错误行为?

2024-02-07

我将从问题开始。当特定浏览器的某个功能的实现有错误,并且您的 JavaScript 需要知道当前浏览器是否有该有错误的实现,以便它可以使用替代策略时,如何在不进行浏览器类型嗅探的情况下确定该实现是否有错误(这通常被认为是不好的)?

整个情况是这样的。

我正在编写一些想要使用的代码“输入”事件 https://developer.mozilla.org/en-US/docs/DOM/DOM_event_reference/input用于获取用户更改的通知<input type="text">字段(比“更改”事件更加活跃),但是当不支持该事件时,它使用涉及一堆其他事件的更复杂的方案。

由于“输入”事件仅在某些浏览器中受支持,因此我开始寻找一种对该事件进行特征检测的方法(而不是浏览器用户代理嗅探),因为特征检测通常是一种更稳健的处理方式。因此,我遇到了这篇很棒的文章 http://perfectionkills.com/detecting-event-support-without-browser-sniffing/为了做到这一点,这段代码似乎有效:

var isEventSupported = (function(){
    var TAGNAMES = {
      'select':'input','change':'input',
      'submit':'form','reset':'form',
      'error':'img','load':'img','abort':'img'
    }
    function isEventSupported(eventName) {
      var el = document.createElement(TAGNAMES[eventName] || 'div');
      eventName = 'on' + eventName;
      var isSupported = (eventName in el);
      if (!isSupported) {
        el.setAttribute(eventName, 'return;');
        isSupported = typeof el[eventName] == 'function';
      }
      el = null;
      return isSupported;
    }
    return isEventSupported;
  })();

然后,我遇到了 IE 的问题(惊讶,惊讶)。虽然 IE 声称支持“输入”事件,并且它通过了上面的功能测试并且在大多数情况下都可以工作,但 IE 的支持却存在很多问题。当用户按下退格键(以及其他缺失的行为)时,它甚至不会触发事件。因此,我不能在 IE 中依赖它。因此,我构建了这个漂亮干净的代码,对“输入”事件进行了功能测试,并在存在时使用非常干净的实现,在不存在时使用这种更丑陋的解决方法,涉及监视其他八个事件。现在,它在 IE 中被破坏了,因为“输入”事件的功能测试通过了,所以代码尝试使用它,但它有很多错误,所以它不起作用。

由于这些 IE 错误出现在用户操作中,我想不出任何方法来设计 javascript 功能测试来识别错误行为。因此,我当前唯一的途径是诉诸浏览器嗅探,并且如果浏览器是 IE,则拒绝依赖“input”标签。

除了浏览器嗅探之外,还有其他选项可以识别“输入”事件中的错误行为吗?如果必须进行浏览器嗅探,是否有一种方法可以通过行为来识别 IE,而不是通过可以自由欺骗且不能保证准确的用户代理字符串?


jamie-pate 建议这样:

   var broken = false,
        ta = angular.element('<textarea>').on('input', function(evt) {
            broken = true;
        });
    ta.attr('placeholder', 'IESUCKS');

因此,您可以在代码中检查“支持输入事件并且没有‘损坏’”。

See https://github.com/angular/angular.js/issues/2614?source=c https://github.com/angular/angular.js/issues/2614?source=c

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

如何在没有浏览器检测的情况下识别“输入”事件中的错误行为? 的相关文章

随机推荐

  • 如何下载 Cassini 网络服务器源代码?

    如何下载 Cassini 网络服务器源代码 MSDN 说它可以在http www asp net Projects Cassini Download http www asp net Projects Cassini Download 但这
  • 房间多表同一个对象(多语言数据库)

    我正在开发一个 android 项目 该项目必须在本地数据库 房间 中存储一些数据 我必须提供的功能之一是以不同语言将数据存储在本地数据库中 例如 如果我有食物信息 则该信息必须以英语 德语 法语等存储 我的数据库的结构是这样的 Entit
  • 将父范围值传递到 Angular 中的 ng-repeat 循环中

    这应该是一个非常简单的问题 但我发现的所有解决方法都很复杂 我在模板中使用 ng repeat 循环遍历对象数组 如下所示 div class row fluid message subject campaign name div 由于 n
  • CakePHP 与 Google 的 OAuth

    我想在我的 cakePHP 应用程序中使用 Google OAuth 让用户使用他们的 google 帐户登录 我查看了以下组件 http code 42dh com oauth http code 42dh com oauth 不知怎的
  • 适用于 Android 的 VoIP 库 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我需要在我的 Android 应用程序中集成 VoIP 服务 有没有免费的 最好的开源 库 我需要图书馆至少允许通过互联网进行语音通话 而
  • 重写 Android 方法时,Eclipse 插入 arg0、arg1 等而不是正确的参数名称

    当我在 Eclipse 中重写 Android 类的方法时 我得到无用的参数名称 如 arg0 arg1 等 例如 当重写来自SQLiteOpenHelper I get Override public void onCreate SQLi
  • 如何防止浏览器标题中出现 blob + guid

    基本上 我正在做的是在服务器上生成一个 PDF 文件并通过 javascript 在浏览器中显示它 如下所示 file new window Blob data type application pdf var fileUrl URL cr
  • Safari 添加尾部斜杠

    我有一个 ASP NET 网站 它使用 URLRewrite 2 删除 URL 中的尾部斜杠 我们注意到 Mac 上的 Safari 不遵守此规则 它始终在 URL 中留下尾部斜杠 SEO Moz 显示两个 URL 这似乎是潜在的重复内容问
  • 为什么不再有 PECL 扩展(例如 pecl_http)的 Windows 二进制文件?

    我正在开发一个在 Windows 上运行的 PHP 项目 能够使用 pecl http 而不是使用 cURL 并重新发明轮子来完成 pecl 扩展所做的所有很酷的事情 例如解析标头 会非常方便等等 我在所有地方 包括 PHP 站点 都读到
  • Kafka简单消费者间歇性丢失消息

    我有一个 Kafka 应用程序 我一直在其中使用 kafka console consumer sh 消费消息 如下所示 kafka console consumer sh zookeeper zookeeperhost 2181 topi
  • Scikit 学习如何打印混淆矩阵标签?

    所以我使用 sci kit learn 对一些数据进行分类 我有 13 个不同的类值 类别来对数据进行分类 现在我已经能够使用交叉验证并打印混淆矩阵 但是 它只显示 TP 和 FP 等 没有类标签 所以我不知道哪个类是什么 下面是我的代码和
  • 如何在局域网中找到我的服务器?

    我有两个自己的 C 和 Java 应用程序 服务器和客户端 它既在一个局域网内 又可以通过指定的端口传输数据 我想让客户端可以找到服务器的IP 但怎么办呢 使用地址掩码枚举所有可能的 IP 坏主意 这会花费很多时间 可能存在某种方式 我可以
  • 在控制器中找不到名称空间内的 Ruby on Rails 模型

    我是 Rails 新手 无法解决这个问题 我有一个控制器 Admin Blog EntriesController 定义在app controllers admin blog entries controller rb 我有一个模型叫 Bl
  • 无法在 Ubuntu 22.04 操作系统上通过 vscode sftp 扩展连接到 AWS EC2 服务器

    我曾经连接 Linode 和 GCP 提供的远程服务器 并通过 Sftp 扩展使用 Visual Studio Code 一切正常 但是 使用相同的配置集 我无法连接到我的 Aws EC2 服务器 以下是sftp json 敏感信息已更改
  • 如何将多个属性传递到 Angular.js 属性指令中?

    我有一个属性指令限制如下 restrict A 我需要传入两个属性 一个数字和一个函数 回调 使用指令在指令中访问它们attrs object 如果指令是元素指令 则受限制 E 我可以这样
  • std::call_once 是无锁的吗?

    我想知道 std call once 锁是否已释放 There https codereview stackexchange com questions 117468 stdonce flag and stdcall once implem
  • C# SSL 安全套接字

    我有一个用 C 编写的 运行良好的通信器应用程序 现在我需要实现与服务器的安全连接 我尝试将 Socket 和 TcpClient 对象更改为 SslStream 但出现了一些错误 首先 我使用 makecert 生成了一个 cer 证书
  • 将方法作为参数传递与直接调用方法

    我在一些示例中看到了作为参数传递的方法 如果我可以从另一种方法调用一种方法 为什么我应该将方法作为参数传递 这个设计背后的目的是什么 从一种方法调用另一种方法 使用委托或将方法作为参数传递Action 将方法作为参数传递可用于防止依赖和耦合
  • 如何仅使用 CSS 来圆化我的 div 标签区域的角?

    我使用 div 标签来定义网页中的区域 我设置了所有明显的东西 如背景 大小 填充等 但它都是非常方形的 我该如何使用onlyCSS 圆角 这里有一个简单的 HTML 文档来演示如何仅通过 CSS 来实现它
  • 如何在没有浏览器检测的情况下识别“输入”事件中的错误行为?

    我将从问题开始 当特定浏览器的某个功能的实现有错误 并且您的 JavaScript 需要知道当前浏览器是否有该有错误的实现 以便它可以使用替代策略时 如何在不进行浏览器类型嗅探的情况下确定该实现是否有错误 这通常被认为是不好的 整个情况是这