我在Prototype.js中编写了相当多的代码,如果找不到DOM-id,则返回null。
$("someId").show();
如果someId
不存在,则会在null上调用一个方法,该方法会暂停整个程序,实际上会在错误后禁用所有JS效果。我可以在执行这样的声明之前检查null,但这很累。
我想抓住一个例外,但我不确定它是哪一个。 MDC列出了以下ECMA Script错误类型,但乍一看似乎没有一个是我想要的:
* Error
* EvalError
* RangeError
* ReferenceError
* SyntaxError
* TypeError
* URIError
* DOMException
* EventException
* RangeException
另外,浏览器是否有统一的方法来处理null的方法调用?
答案 0 :(得分:2)
我不相信有统一性。 Chrome会抛出一个TypeError,但IE会抛出一个错误,所以你可能不得不抓住所有内容并做出严格的假设。最好先检查是否为空。
var element = $('someId');
if (element) {
element.show();
// whatever else...
}
如果element.show()
是你唯一需要它的东西,那么它显然可以写得更短,但在大多数情况下这是合适的。
答案 1 :(得分:1)
如果您要在show()
上链接。$("someId")
,请先检查其结果。
if ($("someId"))
$("someId").show();
or
$("someId") && $("someId").show();
or
if (someVar = $("someId"))
someVar.show();
如果由于某种原因你确实需要识别它们,你可以包装$()并抛出一个自定义异常:
function NullReferenceException(id) {this.id = id}
function $my(id) {
var el = $(id);
if (!el)
throw new NullReferenceException(id);
return el
}
try {
$my("iDontExistId").show();
} catch (e) {
if (e instanceof NullReferenceException)
alert(e.id + " doesn't exist");
}
答案 2 :(得分:1)
处理此问题的正确方法是在对对象执行操作之前检查null。有几种简便的方法可以做到这一点,最短的是(正如Alex K所写)
$("someId") && $("someId").show();
但在我看来这更难阅读。
直接回答您的问题,您可以
try { $('someId').show(); } catch (e) {}
但这看起来很业余。您应该明确编程,因为稍后其他人不会知道您编写奇怪代码的原因。第一个示例略微不透明,但至少首先包含null测试,并且不会隐藏show()
方法中的错误。
顺便说一句,如果您使用的是JQuery而不是Prototype,即使没有id为'someId'的对象,此代码也可以正常运行:
$('#someId').show()
这是因为JQuery中的$()函数返回的集合可能为空但从不为null。
答案 3 :(得分:0)
只要忽略它是哪个例外......
try
{
null.hey()
}
catch(e)
{
//handle it here
}