`

js提交带file的form表单被IE拒绝的解决方法

阅读更多

         在编写一个文件上传功能时,想通过点击一个链接来上传文件,选择文件后自动提交,而不用用户再点击提交按钮,原本的实现如下:

 

<form method="post" name="fileform" id="fileform" enctype="multipart/form-data" action="">
<input type="file" name="examineFile" id="examineFile" 
 onchange="this.form.submit();" style="display:none" class="required" accept="application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.ms-excel.sheet.macroEnabled.12"/>
<input id="uploadbutton" type="submit" style="display:none" />
</form>
<a href='javascript:void(0);' onclick="document.getElementById('examineFile').click();return false;">[上传审核列表文件]</a>

        这样实现在chrome和firefox下都没问题,但是IE浏览器(IE10)拒绝提交,网上查了说是考虑到安全的问题,不得不换一种解决办法。百度了好久没找到解决方法,后来在谷歌通过英文查找找到了解决方法。解决方法如下:

 

<!DOCTYPE html>
<html>
<head>
  <meta http-equiv="content-type" content="text/html; charset=UTF-8">
  <title> - jsFiddle demo</title>
  
  <script type='text/javascript' src='http://code.jquery.com/jquery-1.8.3.js'></script>
  <link rel="stylesheet" type="text/css" href="/css/normalize.css">
  
  
  <link rel="stylesheet" type="text/css" href="/css/result-light.css">
  
  <style type='text/css'>
    body { font-family: Helvetica; }

/* hide the file input. important to position it offscreen as opposed display:none. some browsers don't like that */
#fileinput { position: absolute; left: -9999em; }

/* an example of styling your label to look/behave like a link */
#link { color: #2a9dcf; font-size: 16px; }
#link:hover { text-decoration: underline; cursor: pointer; }

/* an example of styling your label to look like a button */
#button {
    display: block;
    width: 31px;
    height: 27px;
    text-indent: -9999em;
    background: transparent url(http://www.afar.com/assets/profile_sprite.png) 0 0 no-repeat;
}

#button:hover {
    cursor: pointer;
}


  </style>
  


<script type='text/javascript'>
$(window).load(function(){
/* 

The Goals:
 1) allow user to upload a file by using standard html file input control
 2) hide standard html file input control and apply own styling
 3) after user selects file to upload, automatically submit the form

The Browsers:
 - Firefox, Chrome, IE8/9, Safari
 - IE7 didn't work, but it might if you add that browser to the workaround detailed at the bottom

The Initial Solution
 1) Hide the file input by positioning it offscreen. Important not to display:none as some browsers won't like this.
 2) Add another styled element to the page (link, button). 
 3) Listen for a click on that element, then programmatically send a click to the file input to trigger the native 'file explorer'
 4) Listen for the file input's onchange event (occurs after a user chooses their file) 
 5) Submit the form

The Problem:
 1) IE: if you programmatically send a click to a file input in order to activate it (2), programmatically submitting the form (5) will throw a security error

The Workaround Solution
 1) Same as above
 2) Take advantage of the accessibility features built in to the <label> tag (clicking on a label will activate it's associated control) by styling 
    a <label> tag instead of a link/button
 3) Listen for the file input's onchange event
 4) Submit the form
 5) For some reason Mozilla browsers won't activate a file input by clicking on it's <label>. For Mozilla, listen for the click on the label and send a click
    event to the file input to activate it.

*/

// after the user selects the file they want to upload, submit the form
$('#fileinput').on("change", function() {
    $('#uploader-form').submit();
});


// mozilla won't focus a file input with the click of a corresponding
// label, but all other browsers do. if we detect mozilla, listen for
// the label click and send a click to the file input programmatically
if($.browser.mozilla) {
    $('.trigger-file-input').click(function() {
      $('#fileinput').click();                             
    });
}

}); 

</script>


</head>
<body>
  <form id="uploader-form" action="http://hotblocks.nl/_http_server.php">
    <label for="fileinput" id="link" class="trigger-file-input">Link Label</label>
    <br />
    <label for="fileinput" id="button" class="trigger-file-input">Button Label</label>
    <input type="file" id="fileinput" />
</form>
  
</body>


</html>

 参考资料:http://jsfiddle.net/djibouti33/uP7A9/

        http://stackoverflow.com/questions/9396411/ie-javascript-form-submit-with-file-input

分享到:
评论

相关推荐

    不用form提交表单,用ajax上传文件

    "不用form提交表单,用ajax上传文件"是这种需求的一个典型场景。这种方式可以让用户在上传文件时无需等待页面刷新,而是通过Ajax(Asynchronous JavaScript and XML)技术实现实时反馈,提升交互体验。 在JDK 8版本...

    jquery-form - jQuery表单生成插件

    然后,通过选择器找到目标表单,调用`.ajaxForm()`或`.ajaxSubmit()`方法来启用Ajax提交功能。例如: ```html &lt;script src="jquery.js"&gt; &lt;script src="jquery.form.js"&gt; $(document).ready(function() { $('#...

    HTML input type=file文件选择表单元素.docx

    因此,许多场景下,使用 swfupload.js 来代替原生的 file input 表单元素。 二、HTML5 中的 input type=file 文件选择表单元素 随着 HTML5 的出现,原生的 file input 表单元素迎来了新的升级。HTML5 中的 input ...

    jquery-form.js

    jQuery Form Plugin是一款强大的JavaScript库,专为了解决使用jQuery进行异步表单提交(Ajax Form Submission)和文件上传的问题。它通过扩展jQuery的功能,使得处理复杂的表单交互变得更加简单、直观。在本文中,...

    js清空form表单中的内容示例

    在JavaScript中,清空表单(form)的内容是常见的需求,尤其在用户完成表单提交或者需要重置表单时。本示例提供了一个全面的方法,涵盖了多种表单元素类型,确保可以有效地清除所有相关数据。以下是详细的知识点解析...

    兼容ie8的上传源码

    总的来说,"兼容ie8的上传源码"是一个针对旧版浏览器的文件上传解决方案,它利用了当时的技术,如IFrame、ActiveX控件,以及传统的表单提交,以实现与现代浏览器类似的功能。理解并分析这样的源码可以帮助我们更好地...

    JQuery.form文件上传及管理

    `jQuery.Form.js`是jQuery的一个插件,专门用于处理表单提交,尤其是文件上传。它支持异步文件上传、进度条显示等功能,并且兼容多种浏览器,包括IE6+。 ### 2. 文件上传流程 - **初始化表单**: 首先,需要在HTML...

    IE 6文件上传慢终极解决方案

    在IE6中,文件上传通常依赖于表单的`&lt;input type="file"&gt;`元素,它使用POST请求将文件数据发送到服务器。然而,IE6不支持多部分的HTTP请求(Multipart/form-data),这意味着整个文件会被作为请求体的一部分一次性...

    图片上传兼容IE

    使用JavaScript的File对象属性,如`file.type`和`file.size`,并在IE中采用类似的方法。 7. 考虑服务器端兼容性:除了前端,服务器端也需要处理IE上传的文件。例如,IE可能会在文件名中添加额外的字符,如`C:\...

    Form-File-Upload:Form-File-Upload 是一个非常轻量级的模块,用于在表单中实现拖放文件上传

    Form-File-Upload 是一个非常轻量级的模块,用于在您的表单中实现拖放文件上传。 它尽可能轻量级,因此没有 jQuery(如果需要,该模块仍然可以处理 jQuery 对象)并且没有其他依赖项。 它甚至不支持通过 Ajax 异步...

    jQuery表单插件ajaxForm实例详解

    **jQuery表单插件ajaxForm** 是一个非常实用的工具,尤其在前端开发中处理表单提交和文件上传时,能极大地提升用户体验。通过使用ajaxForm,你可以实现无刷新页面的表单提交,使得交互更加流畅。以下是关于ajaxForm...

    jsp 文件上传浏览,支持ie6,ie7,ie8.docx

    &lt;input type="file" name="file" onchange="javascript:PreviewImg(this);" style="border:1px #FFFFFF solid;background:#efefef"/&gt; * &lt;div id="newPreview"&gt;&lt;/div&gt; &lt;td class="left_title_1"&gt;&lt;input ...

    基于SpringMVC的文件上传(兼容IE8)

    由于IE8的AJAX提交文件不兼容,我们可以借助jQuery Form插件实现异步文件上传。首先引入jQuery和jQuery Form插件的库,然后编写JavaScript代码: ```javascript $("#uploadForm").ajaxForm({ success: function...

    js打开浏览器文件下载框

    在JavaScript(JS)中,实现浏览器文件下载功能是常见的需求,尤其在开发Web应用时。本文将深入探讨如何使用JS来打开浏览器的文件下载框,让用户能够选择并下载服务器上的文件。首先,我们需要理解浏览器的安全策略...

    兼容多个浏览器的单文件上传

    然而,对于不支持File API的老版IE浏览器,我们需要使用传统的方式——form表单的提交来模拟异步上传。 1. **隐藏式form表单**:在页面中创建一个隐藏的form表单,设置其`enctype`为`multipart/form-data`,以支持...

    解析使用JS 清空File控件的路径值

    File控件让用户能够选择本地计算机上的文件,通过HTML表单提交到服务器。在某些场景下,开发者可能需要通过JavaScript清空用户已经选择的文件路径值,特别是当用户想要取消已经选择的文件时。但由于浏览器安全性的...

    js动态在form上插入enctype=multipart/form-data的问题

    问题的核心在于这些旧版本的IE浏览器不支持直接通过JavaScript的attr()方法设置表单的enctype属性为multipart/form-data。为了确保文件能正确上传到服务器,必须正确设置表单的enctype属性为multipart/form-data,...

    JS异步文件上传(兼容IE8+)

    当使用form表单提交文件时,浏览器会基于响应内容的类型和状态决定如何处理结果,这可能导致页面的刷新或者下载,显然这不是我们想要的结果。 为了解决这个问题,我们可以创建一个隐藏的`iframe`,并设置表单的`...

Global site tag (gtag.js) - Google Analytics