2010-08-02 4 views
0

Je ne sais pas pourquoi c'est bouillonnant, mais c'est. Vous vous demandez si quelqu'un a des idées?Bizarre Bubbling Numéro

$('#file_upload').live('submit',function(event){ 
     $('#file_upload').attr('action','io.cfm?action=updateitemfile&item_id='+$('.agenda-modal').attr('data-defaultitemid')); 
     $('iframe').load(function(){ 
      $('.upload_output').empty(); 
      $livepreview.agenda({ 
       action:'get', 
       id:$('.agenda-modal').attr('data-defaultitemid'), 
       type:'item', 
       callback:function(json){ 
        for(x in json[0].files){ 
         $('.upload_output').append('<li class="file-upload"><a target="blank" href="io.cfm?action=getitemfile&item_file_id='+json[0].files[x].item_file_id+'">'+json[0].files[x].file_name+'</a> <a style="color:red" href="#deletefile-'+json[0].files[x].item_file_id+'">[X]</a></li>'); 
        } 
        console.log('callback'); 
       } 
      }); 
      console.log('iframed'); 
     }); 
     console.log('go'); 
    }); 

Donc, si je télécharge un fichier que je reçois ce qui suit dans la console:

go 
iframe 
callback 

Si je fais une 2ème fois consécutive:

go 
iframed 
iframed 
callback 
callback 

et trois fois :

go 
iframed 
iframed 
iframed 
callback 
callback 
callback 

etc.

Je suppose que si l'événement live() était en train de bouillonner "go", il y aurait aussi une bulle, mais ce n'est pas le cas. J'ai essayé event.stropPropagation à peu près partout à l'intérieur du soumettre, et .die() connecté au $('#file_upload').die().live(... comme ça.

Des idées?

P.S. Cet appel live() est juste à l'intérieur d'une charge doc jQuery ($(function(){...});)

Répondre

2

Si vous utilisez one, votre problème doit être résolu.

$('iframe').one("load", function() { 
+0

Merci, ça marche! Question cependant, cela vérifiera-t-il encore si le iframe est chargé chaque fois que le formulaire est soumis? –

2

C'est parce que vous fixer un nouveau /gestionnaire supplémentaire.load() chaque fois, cela signifie que celui de votre venez d'ajouter et tous les gestionnaires d'événements load précédents sont tous en cours d'exécution. Si vous souhaitez que le gestionnaire n'exécuté qu'une seule fois, utilisez .one(), au lieu de ceci:

$('iframe').load(function(){ 

utiliser ceci:

$('iframe').one('load', function(){ 

ou, un peu plus du gaspillage mais vous pourriez .unbind() chaque fois:

$('iframe').unbind('load').load(function(){ 
+0

Merci, ça marche! Question cependant, cela vérifiera-t-il encore si le iframe est chargé chaque fois que le formulaire est soumis? –

+0

@Oscar - Oui, ça ne fonctionnera pas * tous les gestionnaires de '' load '' que vous attachez, nous nettoyons les gestionnaires précédents des soumissions précédentes dans chacune des solutions ci-dessus ... cela fonctionnera comme vous voulez, Essayez :) –