追加jquery对象会在IE中抛出无效参数

时间:2009-09-16 00:04:06

标签: jquery internet-explorer append invalid-argument

我正在尝试创建一个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);

2 个答案:

答案 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

也许你可以重复使用它而不是重新发明轮子。