2013-12-10 18 views
10

Per il caricamento di immagini in un progetto CakePHP ho usato java-script.I aggiunto questo js file in app \ Visualizza \ Layouts default.ctp codicedocument.querySelector (...) è l'errore nullo

js

document.querySelector('input[type=file]').addEventListener('change', function(event){ 

    var files = event.target.files; 

    for (var i = 0; i < files.length; i++) { 

    if (files[i].type.match(/image.*/)) { 

     var reader = new FileReader(); 
     reader.onload = function (readerEvent) { 
      var image = new Image(); 
      image.onload = function (imageEvent) { 

       var imageElement = document.createElement('div'); 
       imageElement.classList.add('uploading'); 
       imageElement.innerHTML = '<span class="progress"><span></span></span>'; 
       var progressElement = imageElement.querySelector('span.progress span'); 
       progressElement.style.width = 0; 
       document.querySelector('form div.photos').appendChild(imageElement); 


       var canvas = document.createElement('canvas'), 
        max_size = 1200, 
        width = image.width, 
        height = image.height; 
       if (width > height) { 
        if (width > max_size) { 
         height *= max_size/width; 
         width = max_size; 
        } 
       } else { 
        if (height > max_size) { 
         width *= max_size/height; 
         height = max_size; 
        } 
       } 
       canvas.width = width; 
       canvas.height = height; 
       canvas.getContext('2d').drawImage(image, 0, 0, width, height); 

       var xhr = new XMLHttpRequest(); 
       if (xhr.upload) { 

        // Update progress 
        xhr.upload.addEventListener('progress', function(event) { 
         var percent = parseInt(event.loaded/event.total * 100); 
         progressElement.style.width = percent+'%'; 
        }, false); 


        xhr.onreadystatechange = function(event) { 
         if (xhr.readyState == 4) { 
          if (xhr.status == 200) { 

           imageElement.classList.remove('uploading'); 
           imageElement.classList.add('uploaded'); 
           imageElement.style.backgroundImage = 'url('+xhr.responseText+')'; 

           console.log('Image uploaded: '+xhr.responseText); 

          } else { 
           imageElement.parentNode.removeChild(imageElement); 
          } 
         } 
        } 

        xhr.open('post', 'process.php', true); 
        xhr.send(canvas.toDataURL('image/jpeg')); 

       } 

      } 

      image.src = readerEvent.target.result; 

     } 
     reader.readAsDataURL(files[i]); 
    } 

} 

event.target.value = ''; 

Ho controllato che non ci sono problemi.

ora nel file di add.ctp I Adder

<input type="file" multiple /> 

In uscita sto vedendo il tipo di file field.Now quando ho cliccato su questo campo e caricare un'immagine poi mojila bug dato me un error.That è

document.querySelector (...) è l'errore nullo

non ho idea su questo error.In qui perché dicendo queryselector è nullo?

+2

Sta dicendo che è 'null' perché il selettore passato a' document.querySelector() 'non restituisce un elemento/nodo su cui lavorare. Puoi verificare che l'elemento esista? Se puoi pubblicare il tuo codice HTML rilevante (minimo/[SSCCE] (http://sscce.org/)), potremmo essere in grado di fornire un aiuto più specifico. –

+0

Significa che non è stato trovato ? –

+0

Voglio dire che non sta trovando un elemento che è stato abbinato dal selettore CSS che hai passato ad esso. Ma lo hai chiamato in due posti separati ('querySelector ('span.progress span');' e 'querySelector ('form div.photos')'), nessuno dei quali sta cercando di trovare un input di * any * 'type'. –

risposta

20

document.querySelector() comportamento come il metodo jQuery.(document).ready() e quando il DOM è pronto, il selettore restituisce l'oggetto.

Suggerirei di chiamare tutto lo script JS in fondo alla pagina.