Javascript addEventListener在IE11中不工作

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[

下面的javascript函数上载所选文件并更新网格。它在firefox中工作得很好,但在IE11中却不行。 观察到它没有在addEventListener中执行“ESignature/Registration”函数。我在注册函数中保留了断点。它不会被击中,也不会刷新网格。请指导我解决这个问题

     $("#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(控制台类型!=“未定义”)
保护中)。