任何人都可以解释原因:
function doAjax() {
var xmlHttpReq = false;
try { // Firefox, Opera 8.0+ and Safari
xmlHttpReq = new XMLHttpRequest();
}
catch (e) { // Internet Explorer
try {
xmlHttpReq = new ActiveXObject("Msxml2.XMLHTTP");
}
catch (e) {
try {
xmlHttpReq = new ActiveXObject("Microsoft.XMLHTTP");
}
catch (e) {
alert("Your browser does not support AJAX. Please use an AJAX compatible browser.");
return false;
}
}
}
xmlHttpReq.open('GET', 'handler.php', true);
xmlHttpReq.onreadystatechange = function() {
if (xmlHttpReq.readyState == 4) {
var response = xmlHttpReq.responseText;
handleAjaxResponse(response);
}
};
xmlHttpReq.send(null);
return true;
}
导致以下验证错误:
Error:
Implied global: ActiveXObject 8, XMLHttpRequest 4, alert 15, handleAjaxResponse 24
Problem at line 10 character 16: 'e' is already defined.
catch (e) {
Problem at line 14 character 20: 'e' is already defined.
catch (e) {
由JSlint.com javascript验证器
答案 0 :(得分:6)
关于第一个错误,这是一个exerpt from the JSLint Documentation:
未定义的变量和函数
JavaScript最大的问题是它 对全局变量的依赖, 特别是隐含的全局变量。 如果变量未明确 声明(通常使用var 声明),然后JavaScript假设 变量是全局的。这个可以 掩盖拼写错误的名字和其他 问题。
JSLint期望所有变量和 函数在它们之前被声明 使用或调用。这允许它 检测隐含的全局变量。它是 也是好的做法,因为它使 程序更容易阅读。
有时文件依赖于 全局变量和函数 在别处定义。您可以 通过包含来识别这些到JSLint 您的文件中的注释列出了 你的全局函数和对象 程序取决于,但事实并非如此 在您的程序或脚本中定义 文件。
全局声明可能看起来像 这样:
/*global getElementByAttribute, breakCycles, hanoi */
全球声明始于
/*global
。请注意,没有 在g之前的空间。你可以拥有 很多/*global
条评论。 它们必须在使用之前出现 他们指定的变量。
关于您的问题,以下部分最有可能帮助您解决错误:
可以为其预定义一些全局变量 您。选择“假定浏览器” (浏览器)选项(参见下面的选项) 预定义标准全局 由web提供的属性 浏览器,例如窗口和文档 和警报。选择假设Rhino (rhino)选项预定义全局 犀牛提供的物业 环境。选择假设雅虎 Widget(小部件)选项预定义 由...提供的全球属性 雅虎小部件环境。
出现第二个错误,因为您为每个异常重复使用变量“e
”,包括嵌套的异常。重命名每个异常的变量以避免这种情况。
答案 1 :(得分:4)
使用像jQuery这样的框架更为明智(特别是如果你真的想要支持旧版本的IE(v6之前的版本)),但我会假设你没有这样做。
如果a)你没有嵌套try-catches并且b)你考虑了一组函数,即一个函数来获取一个Xhr对象,另一个函数使用一个Xhr对象来制作一个通用的ajax请求,那么会更好。外部“doAjax”函数执行您想要进行的特定ajax调用: -
function getXHR()
{
var result = null
if (window.XMLHttpRequest)
{
result = new XMLHttpRequest();
}
else
{
try { result = new ActiveXObject("MSXML2.XMLHTTP.3.0") }
catch (e) { }
if (result == null)
{
try { result = new ActiveXObject("Microsoft.XMLHTTP") }
catch (e) { }
}
}
return result;
}
function ajaxRequest(url, data, callBack)
{
var xmlHttpReq = getXHR();
if (xmlHttpReq)
{
xmlHttpReq.open(data != null ? 'GET' : 'POST', url, true);
xmlHttpReq.onreadystatechange = function()
{
if (xmlHttpReq.readyState == 4)
{
//what happens if status is not 200
callBack(xmlHttpReq.responseText);
}
};
xmlHttpReq.send(null);
return true;
}
else
{
return false;
}
}
function doAjax()
{
var result = ajaxRequest('handler.php', null, handleAjaxResponse);
if (!result) alert("Your browser does not support AJAX. Please use an AJAX compatible browser.");
return result;
}
进一步的改进是使回调接受XHR对象而不是基本的responseText。这会给你更多的灵活性。如果回调函数只需要文本,则可以使用此函数: -
function getTextFromXhr(xhr)
{
xhr.onreadystatechange = fnVoid;
if (xhr.status == 200)
{
return xhr.responseText;
}
else
{
throw {number: xhr.status,
description: xhr.statusText,
responseText: xhr.responseText
}
}
}
答案 2 :(得分:3)
您正在每个try / catch块中重用变量e。尝试重命名它们以避免碰撞。其他问题只是警告你正在使用需要在别处定义的东西。
答案 3 :(得分:1)
JSlint通常会给出很多错误......
'e'已定义似乎对我很清楚:)你对所有的try-catch语句使用相同的变量。