我正在尝试创建一个jQuery插件,将表单克隆到iframe然后提交表单。伪造ajax文件上传是一种破解。我也知道有这样的插件,但没有我满足我的需求。我在向IE中的任何内容添加jQuery对象时遇到问题。 (我正在运行IE 7.0)我尝试过FF,它运行得很好。我也在使用jQuery 1.3.2分钟。任何帮助将不胜感激。
(function($){
$.fn.extend({
//pass the options variable to the function
formUploader: function(options) {
//Set the default values, use comma to separate the settings, example:
var defaults = {
onSubmit: function(){ return true;},
onComplete: function(){ return true;}
}
var settings = $.extend(defaults, options);
return this.each(function() {
$(this).submit(function(){
var id = "asdfasda";
$(document).find('body').append('<iframe src="javascript:false;" name="' + id + '" id="' + id + '" />');
//this should be a form
var curEl = this;
setTimeout(function()
{
//fails in IE but not in FF
$("#"+id).contents().find("body").append($(curEl).clone());
},250);
return false;
});
});
}
});
})(jQuery);
答案 0 :(得分:1)
将表单克隆到iframe,然后提交表单
很难从示例中看到,但如果您尝试将元素克隆到不同的文档中,那么DOM标准就不允许这样做。由一个文档创建的节点无法插入到另一个文档中。 iframe的内容是一个不同的文档。
这样做的方法应该是使用document.importNode()
:
var iframe= document.getElementById('myiframe');
var idoc= iframe.contentDocument || iframe.contentWindow.document;
var form= document.getElementById('myform');
idoc.body.appendChild(idoc.importNode(form, true));
但IE根本不支持importNode。然后,IE已经支持XMLHttpRequest,因此这可能不是问题。你实现了哪些浏览器,不支持XMLHttpRequest
?小心:旧/破坏的浏览器也可能不支持importNode
,甚至不支持jQuery!
请注意,如果您想使用jQuery的便捷方法在iframe文档中创建节点,则必须使用&lt; script&gt;加载jQuery的第二个副本。 iframe中的标记,您可以通过其他文档的$
副本调用。每个jQuery实例都绑定到包含它的文档;一个文档中的jQuery包装器无法传递给另一个文档。
var inp= idoc.$('<input type="hidden" name="thing" />');
inp.val(thingvalue);
idoc.$('#myform').append(inp);
...
答案 1 :(得分:0)
您是否查看过jQuery Form插件,它允许您使用iframe提交文件输入字段check it here
也许你可以重复使用它而不是重新发明轮子。