2011-06-09 25 views
12

tengo el siguiente marcado:problema en la carga de archivos

<select multiple="multiple" id="targetFilesList" style="width:200px;height:110px;"> 
    </select> 
    <input type="button" value="Get" id="btnGet" /> 

y siguiendo javascript:

$(function() 
    { 
     $('#btnGet').click(function() 
     { 
      var fileupload = $("<input type='file' name='filetoupload' style='visibility:hidden;'/>"); 
      $('body').append(fileupload); 

      fileupload[0].onchange = function() 
      { 
       $('#targetFilesList').append('<option >' + fileupload.val() + '</option>'); 
       return false; 
      } 
      fileupload.click(); 
     }); 
    }); 

escenario es que tengo que cargar varios archivos y una vez que el usuario ha elegido el archivo sea cargado Tengo que mostrar el nombre del archivo al usuario. Luego, al enviar el formulario, subiré todos los archivos. Para esto, al hacer clic en el botón Obtener, agrego un control de carga de archivos dinámicamente e inicializo el evento de cambio del control de carga de archivos que acabo de agregar. El problema en Chrome 12 al hacer clic en el botón Obtener botón cargar archivo no se abre, pero en firefox4 y ie8 está funcionando. ¿Alguna idea de por qué?

+0

No se puede reproducir ... trabajando en Chrome 12 para mí. JSfiddle link: http://jsfiddle.net/gfosco/JKK4w/ – Fosco

+0

lo siento Fosco.Me olvidé de mencionar que si pongo alerta, entonces está funcionando y si lo elimino, entonces no lo está. – facebook

+1

eso es bastante extraño !! – Fosco

Respuesta

17

para que funcione en Chrome 12, sólo puede añadir en una ventana de tiempo de espera de 0, de esta manera:

exactamente qué se comporta así, no estoy seguro. La primera vez que me encontré con el problema lo intenté con un intervalo más largo, reduciéndolo todo el tiempo para ver qué tan bajo podías conseguirlo, hasta que noté que ni siquiera necesitaba un retraso. La respuesta obvia sería que en realidad no está lista en DOM para cuando se activa el clic (el elemento está ahí, pero ¿los eventos apropiados son para él?).

ejemplo: http://jsfiddle.net/HgEga/

+5

La razón de este comportamiento se debe a la forma en que Chrome optimiza la repetición de página según el tiempo de ejecución js. Como todo es de subproceso único y un setTimeout fuerza un corte de llamada, efectivamente le dice a Chrome que "ahora es el momento de volver a renderizar la página" cuando haga el ajuste de tiempo. Puede solucionar este problema en todos los navegadores principales en diversas situaciones cuando agrega nuevos elementos al DOM mientras ejecuta el código js alrededor del apéndice. –