¿Cómo puedo cargar automáticamente imágenes en la selección de archivos en lugar de presionar el botón de carga?

54

Tengo un tipo de contenido personalizado para permitir a los usuarios cargar imágenes. Estoy tratando de mantener la interfaz lo más simple posible.

El tipo de contenido contiene un solo campo de imagen. Esto funciona, pero algunos usuarios no entienden que la imagen se ha subido porque no la ven después de seleccionar (para obtener una vista previa de la carga, se debe presionar el botón de carga). ¿Hay alguna manera de omitir / presionar automáticamente el botón de carga para que se muestre una imagen inmediatamente después de seleccionar un archivo?

En otras palabras, inmediatamente después de seleccionar un archivo, en lugar de la siguiente imagen (donde se muestra la ruta pero es difícil de leer en Firefox):

ingrese la descripción de la imagen aquí

Me gustaría que la vista previa se muestre así: ingrese la descripción de la imagen aquí

Patrick Kenny
fuente

Respuestas:

95

Sería mejor hacer esto en el nivel del módulo, en lugar del nivel del tema, ya que el JS no tendrá efecto para las páginas de administración de lo contrario (a menos que, por supuesto, esté usando el mismo tema para ambos).

Aquí hay un pequeño módulo para proporcionar esta funcionalidad en todo el sistema:

Archivo: auto_upload.info

name = Auto Upload
description = Removes the need for users to press the 'Upload' button for AJAX file uploads.
core = 7.x
dependencies[] = file

Archivo: auto_upload.js:

(function ($) {
  Drupal.behaviors.autoUpload = {
    attach: function (context, settings) {
      $('form', context).delegate('input.form-file', 'change', function() {  
        $(this).next('input[type="submit"]').mousedown();
      }); 
    }
  };
})(jQuery);

Archivo: auto_upload.module

function auto_upload_init() {
  drupal_add_js(drupal_get_path('module', 'auto_upload') . '/auto_upload.js');
}

Una vez que haya instalado el módulo, se verán afectadas todas las entradas de archivos que tengan AJAX (es decir, aquellas que tengan un botón 'Actualizar') ... ya no tendrá que presionar el botón 'Cargar' después de seleccionar el archivo .

Al usar el delegate()método, esto también funcionará perfectamente para los campos de archivo que permiten múltiples cargas, y también para los campos que se cargan en la página como resultado de una solicitud AJAX.

Lo probé en Chrome, Safari y Firefox y funciona de maravilla :)

Nota al pie : en el caso (probablemente muy poco probable) de que su sitio esté usando jQuery 1.7, debe usar el on()método, que ha sido reemplazado delegate().

ACTUALIZACIÓN He creado un proyecto de sandbox para este módulo.

Clive
fuente
1
Gracias por un poco sobre delegate (), conocimiento muy útil!
Johnathan Elmore
@Clive realmente genial! ¿Considerarás lanzar esto como un sandbox? Si no, ¿te importa si lo hago?
Letharion
44
Volvería a votar de nuevo si pudiera;) Para evitar la duplicación innecesaria de esfuerzos, solo quiero señalar que también hay Ajax , y Ajax enviar para cualquier formulario , los cuales están relacionados.
Letharion
1
@Clive El código funciona perfectamente si tengo instalado el módulo jQuery Update (incluso con la versión jQuery configurada en 1.7 pero aún con 'delegar' en lugar de 'activado'). Sin embargo, si deshabilito el módulo jQuery Update, la carga automatizada comienza pero no termina, entra en un proceso de carga sin fin. ¿Puedes confirmar que se requiere la actualización de jQuery?
deinqwertz
1
@deinqwertz debería no ser, delegate()se agregó en 1.4.2 y Drupal 7 se envía con 1.4.4. Estoy bastante seguro de que esto funciona bien en un par de sitios antiguos con el stock jQuery instalado
Clive
13

Para cualquiera que se encuentre en esta situación, intente usar el módulo AutoUpload .

AutoUpload es una mejora de la interfaz de usuario (UI) que inicia la carga automática de archivos minimizando la cantidad de clics requeridos por un usuario.

Actualmente, los usuarios deben seleccionar archivos y luego presionar el botón "Cargar". Descubrimos que los usuarios a menudo no se dan cuenta de que es necesario presionar un botón y creen erróneamente que su imagen se carga cuando no lo es.

Actualmente está disponible para D6 y D7

Cardo
fuente
9

Drupal 6

Pruebe algo como esto en su documento jQuery listo

jQuery('.form-file').change( function() {   
  jQuery(this).next('.ahah-processed').click();
}); 

Pegue lo siguiente en page.tpl o node.tpl

drupal_add_js("jQuery(document).ready(function() {
  jQuery('.form-file').change( function() { 
    jQuery(this).next('.ahah-processed').click();
  });   
});", 'inline');

No estoy familiarizado con ninguna forma de Drupal para lograr esto.

violín

niksmac
fuente
Desafortunadamente, no sé cómo usar jQuery. Hay otra manera de hacer esto?
Patrick Kenny
@PatrickKenny, mira mi edición. No estoy familiarizado con ninguna forma de Drupal para lograr esto.
niksmac
1
Debe reemplazar $ con jQuery ... consulte la respuesta de Clive a continuación, o simplemente modifique lo anterior de esta manera: drupal_add_js ("jQuery (document) .ready (function () {jQuery ('. Form-file'). Change (function () {jQuery (this) .next ('. ahah-procesado'). clic ();});}); ", 'en línea');
Johnathan Elmore
1
@JohnathanElmore, sí, no funcionará en D7. Editado
niksmac
1
@NikhilMohan Hay un par de otros problemas: .ahah-processedes un nombre de clase Drupal 6, y el click()método no invoca un clic en esos botones por alguna razón; debes usar mousedown()en su lugar :)
Clive
5

Puedes lograrlo usando on(). delegate()ha quedado en desuso

(function ($) {
  Drupal.behaviors.autoUpload = {
    attach: function (context, settings) {
      $('form', context).on('change', 'input.form-file', function() {  
        $(this).next('input[type="submit"]').mousedown();
      }); 
    }
  };
})(jQuery);
drupal_stuff_alter
fuente
4

Eche un vistazo al módulo de integración Plupload .

Proporciona integración entre el widget Plupload para cargar múltiples archivos y Drupal. Plupload es una herramienta de carga de múltiples archivos con licencia GPL que puede presentar widgets en Flash, Gears, HTML 5, Silverlight, BrowserPlus y HTML4 dependiendo de las capacidades de la computadora cliente.

uwe
fuente
3

Si usa el campo de carga de archivos en el formulario AJAX, después de enviarlo, puede perder la funcionalidad de carga automática (consulte https://drupal.stackexchange.com/a/31453/7313 )

Para solucionarlo, use este script

(function($) {

Drupal.behaviors.autoUpload = {
  attach: function (context, settings) {
    $('input.form-file', context).once(function() {
      $(this).change(function() {
        $(this).parent().find('input[type="submit"]').mousedown();
      });
    });
  }
};

})(jQuery);
Eugene Fidelin
fuente
En mi caso, hizo que el formulario enviara solicitudes AJAX para los campos del archivo constantemente en segundo plano. Además, muestra un throbber de carga en un campo vacío.
Елин Й.