2009-10-04 12 views
2

Il s'agit en fait d'une question plus importante car je sais qu'il existe plusieurs façons de résoudre ce problème, mais je vais essayer de le résumer. Ce que j'essaie de faire: J'utilise ce plugin jQuery pour télécharger des fichiers via Flash http://www.uploadify.com/. Cependant, l'élément #fileInput que je suppose lié à cette fonction est un élément live qui est généré après la page chargée: $ ('# fileInput'). Uploadify(). La raison pour laquelle #fileInput est un élément live est parce que j'utilise FancyBox pour faire apparaître une DIV et cette FancyBox simplement "cloné" le html interne de la DIV. Ce qui s'est passé: Lorsque j'ai cliqué sur "Parcourir" pour télécharger un fichier, il n'y a pas de barre de progression pour le téléchargement. La raison en est que le Uploadify n'a pas pu se lier aux éléments actifs.Problème avec la liaison dans jQuery pour les éléments copiés

Questions: 1. J'ai essayé de remplacer bind() par live() dans le code de téléchargement, mais cela n'a pas fonctionné car bind() permet de transmettre [data]. Le plugin LiveQuery http://docs.jquery.com/Plugins/livequery n'a pas la même syntaxe que bind() non plus. Y at-il quelque chose de similaire à lier mais fonctionne pour les éléments vivants?

  1. Si je n'essaie pas de remplacer la fonction bind() et de garder le même code de téléchargement. Est-ce que quelqu'un sait comment changer le code dans FancyBox afin qu'il ne fera pas un clone pour générer des éléments en direct? Je sais que c'est une question difficile aussi.

Note: site FancyBox semble mort ->http://www.visual-blast.com/javascript/fancybox-jquery-image-zooming-plugin/

Merci beaucoup!

+0

plus de commentaires? –

+0

Vous devez ajouter un exemple de code. Vraiment difficile à comprendre sans cela. – NVI

+0

Désolé, j'ai décidé d'abandonner complètement Uploadify et d'utiliser swfupload.org à la place! –

Répondre

0

Vous pouvez surcharger la méthode live, ce qui en fait soutenir data comme second paramètre:

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); 

Remplacer toutes les instances de bind(...) avec live(...)devrait travailler maintenant.

Remarque: vous devrez mettre la méthode surchargée au-dessus de tout le reste.

+0

J'ai fait votre changement et la méthode régulière (ne pas avoir d'éléments en direct) ne fonctionne pas aussi maintenant. Découvrez http://innovie.com/test/index.php Le js est ici http://innovie.com/test/scripts/jquery.uploadify.v2.1.0.js –

1

Vous pouvez envisager de modifier le code FancyBox pour prendre en charge l'appel d'une fonction de rappel après avoir cloné le code HTML. Ensuite, mettez l'appel uploadify() dans la fonction de rappel.

0

D'après mon expérience, la seule façon que je l'ai trouvé pour ce faire est à l'aide livequery

Il a une syntaxe similaire, et dans votre cas pour lier Uploadify sur un élément en direct, vous devez utiliser

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

livequery accepte les fonctions sans événements, et les exécute à chaque fois qu'il ya un changement dans les DOM

0

Comment l'élément est généré?Si son extraite du serveur en utilisant jQuery vous pouvez utiliser un moyen plus hackish de le fixer, il suffit de mettre jQuery fonctionne eval() sur un script balises elle se heurte donc vous pouvez simplement mettre:

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

Dans le code html tiré par les cheveux et ça va le lier au chargement au lieu d'essayer de le surveiller en direct. Les points bonus, si vous récupérez le html à nouveau, ce sera non lié.