Come posso caricare automaticamente le immagini sulla selezione dei file anziché premere il pulsante di caricamento?


54

Ho un tipo di contenuto personalizzato per consentire agli utenti di caricare immagini. Sto cercando di mantenere l'interfaccia il più semplice possibile.

Il tipo di contenuto contiene un singolo campo immagine. Funziona, ma alcuni utenti non comprendono che l'immagine è stata caricata perché non la vedono dopo aver selezionato (per visualizzare l'anteprima del caricamento, è necessario premere il pulsante di caricamento). C'è un modo per saltare / premere automaticamente il pulsante di caricamento in modo che un'immagine venga mostrata immediatamente dopo la selezione di un file?

In altre parole, immediatamente dopo aver selezionato un file, anziché la seguente immagine (in cui il percorso è mostrato ma difficile da leggere in Firefox):

inserisci qui la descrizione dell'immagine

Vorrei che l'anteprima venisse mostrata in questo modo: inserisci qui la descrizione dell'immagine

Risposte:


95

Faresti meglio a farlo a livello di modulo, piuttosto che a livello di tema, poiché JS non avrà effetto per le pagine di amministrazione altrimenti (a meno che, ovviamente, non utilizzi lo stesso tema per entrambi).

Ecco un piccolo modulo per fornire questa funzionalità a livello di sistema:

File: 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

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

File: auto_upload.module

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

Dopo aver installato il modulo, tutti gli input di file che sono AJAX-ified (ovvero quelli che hanno un pulsante 'Aggiorna') saranno interessati ... non sarà più necessario premere il pulsante 'Upload' dopo aver selezionato il file .

Utilizzando il delegate()metodo funzionerà perfettamente anche per i campi file che consentono caricamenti multipli e anche per i campi caricati nella pagina come risultato di una richiesta AJAX.

L'ho provato su Chrome, Safari e Firefox e funziona a meraviglia :)

Nota a piè di pagina : nell'evento (probabilmente molto improbabile) in cui il tuo sito utilizza jQuery 1.7, dovresti utilizzare il on()metodo che ha superato delegate().

AGGIORNAMENTO Ho creato un progetto sandbox per questo modulo.


1
Grazie per il bit su delegate (), conoscenza molto utile!
Johnathan Elmore,

@Clive davvero fantastico! Considererai di rilasciare questo come sandbox? In caso contrario, ti dispiace se lo faccio?
Letharion,

4
Vorrei ancora votare se potessi;) Per evitare inutili duplicazioni di sforzi, voglio solo sottolineare che esiste anche l' Ajax , e l' Ajax si presenta per qualsiasi forma , entrambi i quali sono in qualche modo correlati.
Letharion,

1
@Clive Il codice funziona perfettamente se ho installato il modulo di aggiornamento jQuery (anche con la versione jQuery impostata su 1.7 ma sempre con 'delegate' anziché 'on'). Tuttavia, se disabilito il modulo di aggiornamento di jQuery, il caricamento automatico inizia ma non termina, passa a un processo di caricamento senza fine. Puoi confermare che è richiesto l'aggiornamento di jQuery?
Deinqwertz,

1
@deinqwertz Non dovrebbe essere, è delegate()stato aggiunto in 1.4.2 e Drupal 7 viene fornito con 1.4.4. Sono abbastanza sicuro di farlo funzionare bene su un paio di vecchi siti con lo stock jQuery installato
Clive

13

Per chiunque si trovi in ​​questa situazione, prova a utilizzare il modulo AutoUpload .

AutoUpload è un miglioramento dell'interfaccia utente (UI) che avvia il caricamento automatico dei file riducendo al minimo il numero di clic richiesti da un utente.

Attualmente, gli utenti devono selezionare i file, quindi premere il pulsante "Carica". Abbiamo scoperto che gli utenti spesso non si rendono conto che è necessaria la pressione di un pulsante e erroneamente pensano che la loro immagine sia caricata quando non lo è.

È attualmente disponibile per D6 e D7


9

Drupal 6

Prova qualcosa di simile nel tuo documento jQuery pronto

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

Incollare quanto segue in page.tpl o node.tpl

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

Non ho familiarità con qualsiasi modo Drupal per raggiungere questo obiettivo.

violino


Sfortunatamente, non so come usare jQuery. c'è un altro modo per fare ciò?
Patrick Kenny,

@PatrickKenny, guarda la mia modifica. Non ho familiarità con qualsiasi modo Drupal per raggiungere questo obiettivo.
niksmac,

1
Dovresti sostituire $ con jQuery ... vedi la risposta di Clive di seguito, o semplicemente modificare quanto sopra in questo modo: drupal_add_js ("jQuery (document) .ready (function () {jQuery ('. Form-file'). Change (function () {jQuery (this) .next ('. ahah-processing'). click ();});}); ", 'inline');
Johnathan Elmore,

1
@JohnathanElmore, sì, non funzionerà in D7. Edito
niksmac

1
@NikhilMohan Ci sono un paio di altri problemi: .ahah-processedè un nome di classe Drupal 6 e il click()metodo in realtà non invoca un clic su quei pulsanti per qualche motivo; devi usare mousedown()invece :)
Clive

5

Puoi raggiungerlo usando on(). delegate()è stato deprecato.

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

4

Dai un'occhiata al modulo di integrazione Plupload .

Fornisce l'integrazione tra per il widget Plupload per caricare più file e Drupal. Plupload è uno strumento di caricamento di file multipli con licenza GPL che può presentare widget in Flash, Gears, HTML 5, Silverlight, BrowserPlus e HTML4 a seconda delle capacità del computer client.


3

Se si utilizza il campo di caricamento del file sul modulo AJAX - dopo l'invio potrebbe perdere la funzionalità di caricamento automatico (consultare https://drupal.stackexchange.com/a/31453/7313 )

Per risolvere: usa questo 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);

Nel mio caso, il modulo ha inviato costantemente richieste AJAX per i campi file in background. Inoltre, mostra un carico palpitante su un campo vuoto.
Елин Й.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.