为AJAX运用程序构建一个谬误提交系统
为AJAX运用程序构建一个谬误提交系统
摘要 当一些运用程序解体时,它们往往向用户提供一个时机来提交关于该谬误的信息。该信息可以协助开发者追踪并批改谬误。本文将向你展示如何在你的JavaScript/AJAX运用程序中完成这样的性能。
一、 引言
假设可能存取终端用户的计算机的话,那么终端用户的JavaScript谬误就很容易调试。既然你不能完成这样的操作,那么你可能采取下面这样的措施:让用户向你发送你批改该成绩需求的内容。
当象Mozilla阅读器这样的运用程序解体时,它们会启动一个谬误提交程序。这些程序将讯问用户能否情愿提交错误报告。假设用户情愿的话,该程序将要求他们输入无关他们的程序解体时的尽能够多的信息。这个信息,连同该谬误提交程序本人的剖析数据,一起提交到电子邮件中心以便开发人员和工程经理读取剖析。
这种性能对于开发者是极端有用的。既然该程序运转于客户端机器上,这是惟一取得无关于开发者不能在他们本人的开发系统上重重生成相反的谬误信息的模式。他们还可以监督该特定的谬误的频率和重大性以便决议应该首先批改哪些谬误。
本文将向你展示如何在JavaScript/AJAX程序中支持这种谬误提交性能。当在你的代码中发生一个谬误时,该系统将弹出一个用户可以提交错误信息的窗口。
二、 成绩
如何在我的JavaScript/AJAX运用程序中装置一个用户谬误提交程序?
三、 解答
把代码放到一个包装程序中,该包装程序容许用户提交一个蕴含具体谬误信息的电子邮件。
(一) 捕获谬误
下列文件被包括在本文相应的下载源代码中,你可能应用它们来完成上面的处理计划:
·talkback.js-这个文件包括本系统的残缺源码
·test.html-一个利用talkback.js来解决一个发现谬误的示例脚本
这里的test.html页面蕴含一些JavaScript代码,其中抛出一个同样。这个页面把函数fun_a()装置为body局部的onload解决器。该fun_a()函数又调用fun_b(),fun_b()又调用fun_c()。最后,fun_c()存取一个不存在的对象中的不存在的域,并触发一个真正的JavaScript同样。
首先,在用户可以看到这个谬误之前你需求捕获它。这样以来,你就可以利用户有一个时机来提交错误信息;然而,你不想让他或她的看到任何其它内容。咱们的指标是尽量缩小该谬误向用户裸露的内容。
这是很容易完成的。假如主程序可能经由下列函数激活:
function fun()
{
//程序在此.
}
fun = tb_wrap( fun);
请留意这里对tb_wrap()的调用。这样以来,就可能把fun()函数放到一个可以捕获任何同样并且解决它们的包装器中。而且,这样以来,该用户就不会看到任何发生在fun()中的同样。
(二) 搜集谬误信息
一旦你捕获了谬误,那么你需求提取尽能够多的信息。你把越多的谬误数据发送回开发者,他们越有能够发现并批改该谬误。
遗憾的是,依据用户运转的阅读器不同,谬误对象具备不同的属性。大少数情况下,你可以依赖name和message属性。留意,stack属性中蕴含一个极端有用的栈形迹,只是它仅可用于最近版本的基于Mozilla的阅读器中。
(三) 创建一个Mailto:链接
为了利用户可以向你发送关于该谬误的信息,你应该提供给他们一个他们可以点击的链接。这样很好,由于它让这些用户本人决议愿不情愿受费事,而且他们可以避免发送多份相反的谬误报告。
这个mailto:链接可以打开用户的电子邮件程序,然后就象下面这样填充邮件的Subject和Body域:
Subject: Error from ?id=234
Body:
ReferenceError: nonexistent_variable is not defined
fun_c()@?id=234:19
fun_b()@?id=234:14
fun_a()@?id=234:9
apply(null,[object Object])@:0
()@:106
onload([object Event])@:0 @:0
用户可以减少他们青睐的另外的任何信息,然后发送该消息。
(四) 完成细节
下面这些函数定义在talkback.js文件中:
◆tb_wrap(fun)-这个函数担任把函数fun放到一个包装器中,由该包装器捕获任何同样并且向用户提供一个时机来把这些谬误发送回开发者。当发生一个同样时,它把该谬误对象减少到一个同样列表并且向该用户提供一个提交链接。假设任何更深的同样发生,那么它将把它们减少到同样列表和提交链接。
◆tb_show_talkback_link()-这个函数显示一个小型浮动窗口,它可以向用户提供一个时机来提交一个谬误:"An error has occurred in this page. To report this error, please click here: Report Error"。