Javascript addEventListener在IE11中不工作
下面的javascript函数上载所选文件并更新网格。它在firefox中工作得很好,但在IE11中却不行。 观察到它没有在addEventListener中执行“ESignature/Registration”函数。我在注册函数中保留了断点。它不会被击中,也不会刷新网格。请指导我解决这个问题Javascript addEventListener在IE11中不工作,javascript,asp.net-mvc-4,internet-explorer,Javascript,Asp.net Mvc 4,Internet Explorer,下面的javascript函数上载所选文件并更新网格。它在firefox中工作得很好,但在IE11中却不行。 观察到它没有在addEventListener中执行“ESignature/Registration”函数。我在注册函数中保留了断点。它不会被击中,也不会刷新网格。请指导我解决这个问题 $("#lnkAddAttachment").click(function (e) { if (document.getElementById("txtFile").files[
$("#lnkAddAttachment").click(function (e) {
if (document.getElementById("txtFile").files[0] != null) {
oFiles = document.getElementById("txtFile").files[0];
nFiles = oFiles.size;
var selectedFile = document.getElementById("txtFile").files[0];
var xhr = new XMLHttpRequest();
var fd = new FormData();
var url = '@Url.Content("~/")' + "ESignature/getFile";
fd.append("file", document.getElementById('txtFile').files[0]);
$("#loadingwrapper").fadeIn();
xhr.open("POST", url, true);
xhr.send(fd);
xhr.addEventListener("load", function (event) {
var url = '@Url.Content("~/")' + "ESignature/Registration";
$('#gridAttachments').load(url + ' #gridAttachments');
$("#loadingwrapper").fadeOut();
}, false);
$('#txtDescription').val('');
$('#txtFile').val('');
return false;
}
});
很明显,您已经在使用jQuery了,我建议您直接使用而不是使用
XMLHttpRequest
,这几乎肯定会解决问题
但是,如果出于某种原因希望继续直接使用XMLHttpRequest
,则很可能需要使用readystatechange
,而不是load
;也许IE11不支持加载
,或者在它决定为您的页面使用的任何兼容性设置中都不支持它。如果您的页面正在以某种较旧的兼容模式加载,则XMLHttpRequest
对象上也不会有addEventListener
由于您没有与任何人共享XMLHttpRequest
实例,因此处理这两个潜在问题的简单方法是:
xhr.onreadystatechange = function () {
if (xhr.readystate === 4) { // Also consider checking `status`
var url = '@Url.Content("~/")' + "ESignature/Registration";
$('#gridAttachments').load(url + ' #gridAttachments');
$("#loadingwrapper").fadeOut();
}
};
然后,将该移动到调用.send
上方
但同样的:你正在使用一个库来为你处理这些事情。使用它。Firefox支持“addEventListener”方法,但IE可能不支持该方法。您需要使用“onreadystatechange”来处理完成请求的事件。另外,在调用“发送”之前,您还需要设置“onreadystatechange”处理程序;否则,对服务器的请求可能会在设置处理程序之前完成
我刚刚更改了url,如下所示。成功了。问题是,每当下面的url点击IE时,它都会从缓存中取出,而不会点击注册函数。为了使url每次都是唯一的,添加了名为check To url的新变量。它的值在每次点击注册函数时都是唯一的
var url = '@Url.Content("~/")' + "ESignature/Registration?check=" + new Date().getTime();
完整代码:
$("#lnkAddAttachment").click(function (e) {
if (document.getElementById("txtFile").files[0] != null) {
oFiles = document.getElementById("txtFile").files[0];
nFiles = oFiles.size;
var selectedFile = document.getElementById("txtFile").files[0];
var xhr = new XMLHttpRequest();
var fd = new FormData();
var url = '@Url.Content("~/")' + "ESignature/getFile";
fd.append("file", document.getElementById('txtFile').files[0]);
$("#loadingwrapper").fadeIn();
xhr.open("POST", url, true);
xhr.send(fd);
xhr.addEventListener("load", function (event) {
var url = '@Url.Content("~/")' + "ESignature/Registration?check=" + new Date().getTime();
$('#gridAttachments').load(url + ' #gridAttachments');
$("#loadingwrapper").fadeOut();
}, false);
$('#txtDescription').val('');
$('#txtFile').val('');
return false;
}
});
感谢T.J.Crowder和Chris的支持。首先,为什么不使用
onreadystatechange
,其次为什么不使用jQuery处理ajax请求?我用onreadystatechange替换了addEventListener函数,如下所示。Still注册函数未命中。xhr.onreadystatechange=function(){if(xhr.readyState==4){var url='@url.Content(“~/””)+“ESignature/Registration”;$('#gridAttachments')。加载(url+'#gridAttachments')$(“#装入包装器”).fadeOut();};xhr.send(fd)@拉瓦尼亚布:那么,我认为可以相当肯定的是,问题中没有显示的代码中有错误。例如,我想看看url
变量在浏览器内置调试器的客户端中有什么。一般来说,只需一步通过客户端代码就可以了解在何处发生了什么。令人惊讶的是,当我在IE中按F12打开调试器时,调试器会工作。如果我关闭调试器,它也会不工作。某物strange@lavanyab:这表明代码中的其他地方正在使用控制台
,它仅在调试器打开时存在于IE中,因此如果代码使用它,则在调试器关闭时失败。搜索代码,找到所有出现的控制台
,并将其删除(或将其放入if(控制台类型!=“未定义”)
保护中)。