document.querySelector(...) is null error

Javascript

Javascript Problem Overview


For image upload in a cakephp project I used java-script.I added this js file in app\View\Layouts default.ctp

js code

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 = '';

I have checked there are no problem.

now in add.ctp file I adder

<input type="file" multiple />

In output I am seeing the file type field.Now when I clicked on this field and upload a image then mojila bug given me a error.That is

document.querySelector(...) is null error

I have no idea about this error.In here why saying queryselector is null?

Javascript Solutions


Solution 1 - Javascript

document.querySelector() behaves similarly to the jQuery.(document).ready() method. When the DOM is ready, the selector returns the object.

I would suggest you call all JS script bottom of the page.

Solution 2 - Javascript

To make sure that your DOM is ready you could add this to your JS file.

// my-script.js
document.addEventListener("DOMContentLoaded", function() { 
    // this function runs when the DOM is ready, i.e. when the document has been parsed
    document.querySelector('input[type=file]')
        .addEventListener('change', function(event){
            ...
         }
});

This way you could call your js files from wherever you like. Please take a look to this superb answer to get further insight on these matters.

Also take a look at this other Google rule.

Solution 3 - Javascript

file.js

const heading1 = document.querySelector(".heading1");
console.log(heading1);

Solution 1


<!DOCTYPE html>
<html lang="en">
<head>
    <script src="./file.js" defer></script>
    <title>Document</title>
</head>
<body>
    <h1 class="heading1">Hello World 1</h1>
</body>
</html>

Solution 2

Place your JavaScript in bottom before closing body tag

<!DOCTYPE html>
<html lang="en">
<head>
    <title>Document</title>
</head>
<body>
    <h1 class="heading1">Hello World 1</h1>

    <script src="./file.js"></script>
</body>
</html>

Solution 4 - Javascript

I suggest writing your <script type="text/javascript" src="your js file"></script> in body, before the closing tag

Solution 5 - Javascript

There is now another "better" way to address this issue.

put your scripts in the head tag and add the defer attribute.

<!DOCTYPE html>
<html lang="en">
<head>
  <title>Document</title>
  <script src="main.js" defer></script>
</head>
<body>
  yoyoyo
</body>
</html>

you can read more about it here and here

TLDR (may be inaccurate and misleading so read the sources above!): the defer attribute tells the browser to load the file but hold off its execution until the dom is ready, which is close to the behavior you implicitly get when you put the script tag at the bottom of the body tag, the difference being that in the old way you have to wait for the whole body tag to be parsed until you start downloading the script tag.

Solution 6 - Javascript

I ran into this issue where I was trying to do (slimmed down for simplicity):

<script type="text/javascript">
    var svg = document.querySelector('svg');
    console.log(svg);
</script>

on an element in the <body>:

<svg id="svg" viewBox="0 0 120 120" width="500px" height="500px"></svg>

Once I added jQuery and moved my lines inside of a $(document).ready(), it was fine:

<script type="text/javascript" src="jquery-1.12.4.min.js"></script>
<script type="text/javascript">
    $(document).ready(function(){
        var svg = document.querySelector('svg');
        console.log(svg);
    });
</script>

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionAlimon KarimView Question on Stackoverflow
Solution 1 - JavascriptRajinwebView Answer on Stackoverflow
Solution 2 - JavascriptRodrirokrView Answer on Stackoverflow
Solution 3 - JavascriptKheersagar patelView Answer on Stackoverflow
Solution 4 - JavascriptPickerView Answer on Stackoverflow
Solution 5 - JavascriptRtzoorView Answer on Stackoverflow
Solution 6 - JavascriptvapcguyView Answer on Stackoverflow