jjzjj

javascript - 将函数分配给 window.onerror 比 window.addEventListener ('error' 回调更可取)?

coder 2024-05-12 原文

将函数分配给 window.onerror 似乎是开始处理页面代码错误的一种非常简单的方法。但是,确保您没有覆盖预先存在的错误处理程序很重要,因此通常的做法是维护对先前值的引用并将其作为新函数的一部分调用。例如:

var old_onerror = window.onerror;
window.onerror = function() {
    // do something
    if (old_onerror) {
        old_onerror();
    }
};

我可以在网上找到的大多数文档/博客文章/等都建议这样做。他们为什么不建议为 'error' 事件添加事件处理程序呢?这允许在其中一个事件被触发时调用多个函数,并且不需要笨拙地维护对其他错误处理程序的引用。

window.addEventListener('error', function() {/* do something */});

编辑:我考虑过关注 the standard advice on this subject ,但是 window 上的 error 事件似乎是一个相当特殊的情况(例如,参见 JQuery 的 explicit lack of support for it(在该页面上搜索“onerror”))。我特别想了解为什么 onerror 似乎是一个特例。

最佳答案

由于历史原因,这些 window.onerror 有点特殊。其中大部分现已失效,我认为您必须回到 IE8 才能找到需要它们的浏览器。大约十年前,IE6 是王者,它根本不支持 addEventListener,许多事件仅由某些浏览器支持或具有不同的名称。 Web 开发过去非常不一致,发现像 window.onerror 这样的旧方法并不罕见。

出于向后兼容性的原因,window.onerror 有点奇怪,因为两种订阅事件的方式采用不同的参数。

因此遗留 onerror 将错误详细信息作为参数包含在内:

window.onerror = function(message, source, line, col, error) {
    ...

    return true; // This will prevent further event propagation
};

它仍然存在,这样已经存在的旧 JS 就不会崩溃 - 浏览器设计者希望 10 年前的网站基本上仍然可以在其最新版本中工作。

虽然(现在的最佳实践)事件监听器将它们作为事件的属性:

window.addEventListener('error', e => {

    // Get the error properties from the error event object
    const { message, filename, lineno, colno, error } = e; 
});

后者要好得多,因为您不需要获得任何先前的监听器,而且后续的监听器(比如来自浏览器扩展)也不会意外破坏您的监听器。如果你正在构建类似 SPA 的东西,你也可以删除你的监听器,你停留在一个页面上,只有一个 window 上下文。

所以,回答这个问题:

Most documentation/blog posts/etc I can find online recommends doing something like this. Why don't they recommend adding an event handler for the 'error' event instead?

因为它们已经过时了。使文档保持最新很难,而且 JS 发展很快。这 window.onerror 您描述的模式在某些需要支持极其过时的 IE 版本的企业环境中仍然是可以接受的折衷方案。对于绝大多数网络,addEventListener 方法要好得多。

see, for example, JQuery's explicit lack of support for it (search on that page for "onerror"

jQuery 。有些决定是在 2006-2008 年左右做出的,现在一直沿用至今,.on 对事件做出的一些假设就是其中之一。 jQuery 的 .on 在 2006 年非常棒,因为我们不必担心不同浏览器的事件实现——它可以将它们全部隐藏在一个通用接口(interface)后面。现在一切都使用 addEventListener,因此您不需要它(而且它比 .on 强大得多)。

关于javascript - 将函数分配给 window.onerror 比 window.addEventListener ('error' 回调更可取)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37933733/

有关javascript - 将函数分配给 window.onerror 比 window.addEventListener ('error' 回调更可取)?的更多相关文章

  1. ruby - 在 Ruby 程序执行时阻止 Windows 7 PC 进入休眠状态 - 2

    我需要在客户计算机上运行Ruby应用程序。通常需要几天才能完成(复制大备份文件)。问题是如果启用sleep,它会中断应用程序。否则,计算机将持续运行数周,直到我下次访问为止。有什么方法可以防止执行期间休眠并让Windows在执行后休眠吗?欢迎任何疯狂的想法;-) 最佳答案 Here建议使用SetThreadExecutionStateWinAPI函数,使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入休眠状态或关闭显示。像这样的东西:require'Win32API'ES_AWAYMODE_REQUIRED=0x0

  2. ruby-on-rails - rails : "missing partial" when calling 'render' in RSpec test - 2

    我正在尝试测试是否存在表单。我是Rails新手。我的new.html.erb_spec.rb文件的内容是:require'spec_helper'describe"messages/new.html.erb"doit"shouldrendertheform"dorender'/messages/new.html.erb'reponse.shouldhave_form_putting_to(@message)with_submit_buttonendendView本身,new.html.erb,有代码:当我运行rspec时,它失败了:1)messages/new.html.erbshou

  3. ruby-on-rails - 'compass watch' 是如何工作的/它是如何与 rails 一起使用的 - 2

    我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t

  4. ruby-on-rails - Ruby on Rails : . 常量化 : wrong constant name error? - 2

    我正在使用这个:4.times{|i|assert_not_equal("content#{i+2}".constantize,object.first_content)}我之前声明过局部变量content1content2content3content4content5我得到的错误NameError:wrongconstantnamecontent2这个错误是什么意思?我很确定我想要content2=\ 最佳答案 你必须用一个大字母来调用ruby​​常量:Content2而不是content2。Aconstantnamestart

  5. ruby-on-rails - Rails 3.2.1 中 ActionMailer 中的未定义方法 'default_content_type=' - 2

    我在我的项目中添加了一个系统来重置用户密码并通过电子邮件将密码发送给他,以防他忘记密码。昨天它运行良好(当我实现它时)。当我今天尝试启动服务器时,出现以下错误。=>BootingWEBrick=>Rails3.2.1applicationstartingindevelopmentonhttp://0.0.0.0:3000=>Callwith-dtodetach=>Ctrl-CtoshutdownserverExiting/Users/vinayshenoy/.rvm/gems/ruby-1.9.3-p0/gems/actionmailer-3.2.1/lib/action_mailer

  6. ruby - 在 jRuby 中使用 'fork' 生成进程的替代方案? - 2

    在MRIRuby中我可以这样做:deftransferinternal_server=self.init_serverpid=forkdointernal_server.runend#Maketheserverprocessrunindependently.Process.detach(pid)internal_client=self.init_client#Dootherstuffwithconnectingtointernal_server...internal_client.post('somedata')ensure#KillserverProcess.kill('KILL',

  7. ruby - 主要 :Object when running build from sublime 的未定义方法 `require_relative' - 2

    我已经从我的命令行中获得了一切,所以我可以运行rubymyfile并且它可以正常工作。但是当我尝试从sublime中运行它时,我得到了undefinedmethod`require_relative'formain:Object有人知道我的sublime设置中缺少什么吗?我正在使用OSX并安装了rvm。 最佳答案 或者,您可以只使用“require”,它应该可以正常工作。我认为“require_relative”仅适用于ruby​​1.9+ 关于ruby-主要:Objectwhenrun

  8. ruby - 无法让 RSpec 工作—— 'require' : cannot load such file - 2

    我花了三天的时间用头撞墙,试图弄清楚为什么简单的“rake”不能通过我的规范文件。如果您遇到这种情况:任何文件夹路径中都不要有空格!。严重地。事实上,从现在开始,您命名的任何内容都没有空格。这是我的控制台输出:(在/Users/*****/Desktop/LearningRuby/learn_ruby)$rake/Users/*******/Desktop/LearningRuby/learn_ruby/00_hello/hello_spec.rb:116:in`require':cannotloadsuchfile--hello(LoadError) 最佳

  9. ruby-on-rails - 新 Rails 项目 : 'bundle install' can't install rails in gemfile - 2

    我已经像这样安装了一个新的Rails项目:$railsnewsite它执行并到达:bundleinstall但是当它似乎尝试安装依赖项时我得到了这个错误Gem::Ext::BuildError:ERROR:Failedtobuildgemnativeextension./System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/rubyextconf.rbcheckingforlibkern/OSAtomic.h...yescreatingMakefilemake"DESTDIR="cleanmake"DESTDIR="

  10. ruby-on-rails - rspec should have_select ('cars' , :options => ['volvo' , 'saab' ] 不工作 - 2

    关闭。这个问题需要detailsorclarity.它目前不接受答案。想改进这个问题吗?通过editingthispost添加细节并澄清问题.关闭8年前。Improvethisquestion在首页我有:汽车:VolvoSaabMercedesAudistatic_pages_spec.rb中的测试代码:it"shouldhavetherightselect"dovisithome_pathit{shouldhave_select('cars',:options=>['volvo','saab','mercedes','audi'])}end响应是rspec./spec/request

随机推荐