在jQuery中绑定复制元素的问题

时间:2009-10-04 06:12:15

标签: javascript jquery html css ajax-upload

这实际上是一个更大的问题,因为我知道有几种方法可以解决这个问题,但我会尝试总结一下。

我尝试做什么:我正在使用此jQuery插件通过Flash http://www.uploadify.com/上传文件。但是,我应该绑定此函数的元素#fileInput是在页面加载后生成的实时元素:$('#fileInput')。uploadify()。 #fileInput是一个实时元素的原因是因为我使用FancyBox弹出一个DIV,这个FancyBox基本上只是“克隆”了DIV的内部html。

发生了什么:当我点击“浏览”上传文件时,没有上传进度条。原因是因为Uploadify无法绑定到实时元素。

问题: 1.我尝试用uploadify代码中的live()替换bind(),但是这不起作用,因为bind()允许传递[data]。 LiveQuery插件http://docs.jquery.com/Plugins/livequery与bind()的语法不同。有什么类似于绑定但适用于实时元素吗?

  1. 如果我不尝试替换bind()函数并保持uploadify代码相同。有谁知道如何更改FancyBox中的代码,以便它不会生成克隆来生成实时元素?我知道这也是一个难题。
  2. 注意:FancyBox网站似乎已经死了 - > http://www.visual-blast.com/javascript/fancybox-jquery-image-zooming-plugin/

    非常感谢!

4 个答案:

答案 0 :(得分:1)

您可以考虑更改FancyBox代码以支持在克隆HTML后调用回调函数。然后,将uploadify()调用放入回调函数中。

答案 1 :(得分:0)

您可以重载 live 方法,使其支持 data 作为第二个参数:

jQuery.fn.live = (function(_live){
    return function( type, data, fn ) {

        var _fn;

        if ( jQuery.isFunction(fn) ) {
            _fn = function(e) {
                e.data = data;
                return fn.call( this, e );
            };
        }

        return _live.call( this, type, _fn || fn || data );
    };
})(jQuery.fn.live);

bind(...) 的所有实例替换为 live(...) 现在可以正常工作。

注意:您必须将重载方法放在其他所有方法之上。

答案 2 :(得分:0)

根据我的经验,我发现这样做的唯一方法是使用livequery

它具有类似的语法,在您的情况下,在live元素上绑定uploadify,您将使用

$('#fileInput').livequery(function(){
  $(this).uploadify();
})

Livequery接受没有事件的函数,并在每次DOM发生变化时执行它们

答案 3 :(得分:0)

元素是如何生成的?如果使用jQuery从服务器获取它,你可以使用一种更为hackish的方法来修复它,只需将jQuery运行eval()放在它运行的任何脚本标记上,这样你就可以放置:

<script type='text/javascript'>
$(function(){
    $('#fileInput').uploadify();
});
</script>

在获取的html中,它会在加载时将其绑定,而不是试图直播它。奖励积分,如果你再次获取HTML,它将是未绑定的。