Js模拟Ajax无刷新提交

最近在做一个模拟Ajax提交的功能,原理很简单,就是动态创建一个form,并指定其target为页面中的一个隐藏的iframe,当form提交时会提交到这个iframe中,从而实现提交数据,而不刷新当前页面的功能,这个方法多用来做图片或文件上传的功能。

首先要创建一个iframe:

var iframe = document.createElement(‘iframe’);
iframe.id = ‘uploadIframe’;
iframe.name = ‘uploadIframe’;
iframe.style.display = ‘none’;
document.body.insertBefore(iframe, document.body.firstChild);

提交我们的form表单:

<form id=”form” enctype=”multipart/form-data” method=”POST” action=”” target=”uploadIframe”>
<input type=”file” hidefocus=”true” name=”pic”/>
</form>

document.getElementById(“form”).submit();
在FF、Chrome、Safari下都正常,而在IE下却发现,form提交时却新打开了一个窗口。

这是怎么回事呢,我iframe的name也设置了,form的target也指向了iframe。调试了一下,发现在IE里是iframe.name = ‘uploadIframe’; 这行代码无效。

于是上网搜索了下,发现可以这样来创建iframe:

iframe = document.createElement(‘<iframe name=”uploadIframe”>’);

但这样的代码会在非IE下抛出异常,于是增加下判断,代码变成这样:

var iframe;
if(/msie/.test(navigator.userAgent.toLowerCase())) { //IE
iframe = document.createElement(‘<iframe name=”uploadIframe”>’);
} else {//FF…
iframe = document.createElement(‘iframe’);
}
iframe.id = ‘uploadIframe’;
iframe.name = ‘uploadIframe’;
iframe.style.display = ‘none’;
document.body.insertBefore(iframe, document.body.firstChild);

也有人用:

var iframe;
try{//IE
iframe = document.createElement(‘<iframe name=”uploadIframe”>’);
} catch(e) {//FF…
iframe = document.createElement(‘iframe’);
}
iframe.id = ‘uploadIframe’;
iframe.name = ‘uploadIframe’;
iframe.style.display = ‘none’;
document.body.insertBefore(iframe, document.body.firstChild);

这样就兼容了,再提交form时就没有问题了。

这个问题是个容易被忽略的问题,大家在开发中要注意下。