本文对比了 dojo.io.iframe 和 dojo.request.iframe 实现相同功能的用法,同时还给出了使用一般form来实现同样功能的代码。dojo.io.iframe的代码出自:fun with dojo.io.iframe这篇博文,该博文介绍了使用dfd解决脚本加载后iframe不能多次执行send请求的问题,比设置timeout更合理。dojo.request.iframe 和 dojo form的代码出自我的博文:Dojo导出Chart到PDF文件,如果想了解本文三段代码使用的情景,可以查看该博文。使用dojo 1.8发行版时,如果使用第二段dojo.request.iframe代码有问题,可以到Dojo SVN站点下载最新的iframe文件替换掉旧的iframe文件,dojo.request.iframe就可以正常工作了。
dojo.io.iframe:
// dfd used for save the return value of iframe.send
var dfd;
var sendSVGToServer = function (svg, title) {
// sanitize svg, if doesn't santize svg before post, cannot work in Chrome
svg = svg.replace(/ /g, ' ');
// create a form with method post
var form = document.createElement('form');
dojo.attr(form, 'name', 'svg_submit_form');
dojo.attr(form, 'method', 'post');
dojo.attr(form, 'multipart/form-data');
document.body.appendChild(form);
// create my postdata
var content = {
/* set a bunch of parameters here that
will be posted to the http handler */
svg: svg,
filename: title || 'chart'
};
// Deferred object returned by iframe.send and call cancel on it before trying to send another request
if (dfd) {
dfd.cancel();
}
// make the request
dfd = dojo.io.iframe.send({
url: 'export.php',
form: form,
content: content,
error: function(response, ioArgs) {
if (response.message === 'Deferred Cancelled') {
return response;
} else {
console.error(response);
}
}
});
// get rid of the form created above
document.body.removeChild(form);
}
dojo.request.iframe:
var sendSVGToServer = function (svg, title) {
// sanitize svg, if doesn't santize svg before post, cannot work in Chrome
svg = svg.replace(/ /g, ' ');
// Cancel last iframe post request
if (dfd) {
dfd.cancel();
}
dfd = iframe.post('export.php', {
preventCache: true,
data: {
svg: svg,
filename: title || 'chart'
}
}).then(function(response) {
console.log('iframe get response');
},
function(error) {
if (error.message === 'Request canceled') {
// console.log('Last iframe post request is canceled');
return error;
} else {
console.error('sendSVGToServer()->iframe.post(): ' + error);
}
}
);
};
dojo form:
var sendSVGToServer2 = function(svg, title) {
// sanitize svg, if doesn't santize svg before post, cannot work in Chrome
svg = svg.replace(/ /g, ' ');
var formNode = domConstruct.create('form', {
name: 'svg_submit_form',
method: 'post',
action: 'export.php',
enctype: 'multipart/form-data'
}, win.body());
domStyle.set(formNode, 'display', 'none');
var createInput = function(name, value){
domConstruct.create('input', {
type: 'hidden',
name: name,
value: value
}, formNode);
};
createInput('svg', svg);
createInput('filename', title || 'chart');
formNode.submit();
domConstruct.destroy(formNode);
}