Uncaught TypeError: document.getElementById(...) is null #1874
Replies: 15 comments
-
Acho que da pra checar 2 coisas:
|
Beta Was this translation helpful? Give feedback.
-
Acho válido a dica de @evelew passou. Só complementando... o erro se dá pelo fato de que você está tentando fazer |
Beta Was this translation helpful? Give feedback.
-
Por favor, edite seu post e coloque seu HTML também para podermos ajudá-lo melhor. Ao colar um código aqui, utilize essa sintaxe: Substitua "html" pela linguagem que quiser. Complementando ainda mais as respostas do @evelew e do @dominguetigs ... Coloque a seu Fiz alguns ajustes e comentei alguns pontos que você pode aplicar: <html>
<body>
<!-- Seu HTML aqui -->
<script>
// Inicialize sua variável com let ou var
let valor = 0;
let valorItem = document.getElementById('precoProd').textContent;
// Use a função 'Number' para converter a string para um número
valorItem = Number(valorItem);
function incValor() {
valor = valor + valorItem; // Você pode usar também: valor += valorItem;
setValor(valor);
}
function decValor() {
valor = valor - valorItem; // Você pode usar também: valor -= valorItem;
setValor(valor);
}
function setValor(valorTotal) {
document.getElementById('valorItens').value = valorTotal;
}
</script>
</body>
</html> |
Beta Was this translation helpful? Give feedback.
-
Coloquei todo o código. Acho que ficou meio bugado. Sei que o ideal seria separar os html, js, php, etc, mas é projeto bem pequeno. Obrigado |
Beta Was this translation helpful? Give feedback.
-
Como seu código é em PHP, você pode postar assim pra ficar direitinho: Assim ele vai receber o PHP, o HTML, CSS e JS de boa. 😉 |
Beta Was this translation helpful? Give feedback.
-
Já tentei de tudo. Troquei os nomes das variáveis, usei input ao invés de span, usei let, var.... |
Beta Was this translation helpful? Give feedback.
-
Coloquei assim: window.addEventListener('load', () => {
Não aconteceu absolutamente nada. Nem no Debug. |
Beta Was this translation helpful? Give feedback.
-
@odnanrefcg Sei que você falou que não quis dividir melhor os conceitos porque é um projeto pequeno, mas é uma pressa que te custa mais tempo, justamente por erros como esse. Tentei reproduzir o erro aqui, mas ele não aconteceu. Tive que omitir algumas partes (cadê os elementos de id |
Beta Was this translation helpful? Give feedback.
-
Bom dia pessoal! Agradeço a atenção de todos. Obrigado! |
Beta Was this translation helpful? Give feedback.
-
Pelo que vi no seu código, o JS ainda estava em cima no seu HTML. Movi ele pro final e fiz umas observações: <?php include("classes/conexaoMySql.class.php"); ?>
<!doctype html>
<html>
<head>
<meta charset="utf-8" lang="pt-br">
<title>Mercado Solidário Bairro da Juventude</title>
<!-- Desde o HTML5, o type não é necessário na tag 'link' e 'style' para CSS -->
<link rel="stylesheet" href="css/style.css">
<link rel="stylesheet" href="css/bootstrap.min.css">
</head>
<body>
<div id="cabecalho-meio" class="row">
<div id="cabecalho-logo" class="bg-light col-sm-3">
<a href="http://www.bairrodajuventude.org.br/" target="_blank"><img src="imagens/logoBairro.png"></a>
</div>
<div id="cabecalho-frase" class="bg-success col-sm-9">
<!-- A Definir -->
</div>
</div>
<div id="cabecalho-inferior" class="row">
<div class="busca col-sm-3">
<form action="">
<label>
<input type="text" name="pesquisa" id="pesquisa" placeholder="Buscar...">
</label>
</form>
</div>
<div class="carrinho col-sm-9">
<ul>
<li>Saldo:</li>
<li>
<script>
// Essa função precisava ser colocada aqui pois é chamada diretamente da tag 'a'
function abrirCarrinho(URL) {
window.open(URL, 'janela',
'width=795, height=590, top=100, left=200, scrollbars=yes, status=no, toolbar=no, location=no, menubar=no, resizable=yes, fullscreen=no'
);
}
</script>
<a href="javascript:abrirCarrinho('carrinho.php')"><img src="imagens/carrinho32.png"></a> <input type="text"
name="" id="qtde">
</li>
<li>R$ <input type="text" id="valorItens"></li>
</ul>
</div>
</div>
<div class="row container-fluid">
<div class="categorias col-sm-3">
<h2 class="">Meus Itens</h2>
<hr>
<ul>
<li></li>
</ul>
</div>
<div class="vitrine col-sm-9">
<ul>
<?php
$cn = new conexaoMySql();
$con = $cn->conectar();
$sql =
"SELECT item_auxilio.id_item_auxilio
AS idItem, item_auxilio.descricao_item_auxilio
AS descItem, item_auxilio.unidade_item, unidade_medida.id_unidade_medida, unidade_medida.sigla_unidade_medida
AS unidadeSigla, item_auxilio.valor_item
AS valorItem, item_auxilio.imagem
AS imagemItem
FROM item_auxilio, unidade_medida
WHERE item_auxilio.unidade_item = unidade_medida.id_unidade_medida
AND estoque_item > estoque_margem
AND imagem <> ''"; // Apesar de opcional, é uma boa prática colocar as palavras reservadas em maiúsculas
$query = mysqli_query($con, $sql);
while ($dados = mysqli_fetch_array($query)) : // Em vez de abrir a chave, coloquei : para fechar com 'endwhile'
$idItem = $dados['idItem'];
$descProduto = $dados['descItem'];
$unidadeProduto = $dados['unidadeSigla'];
$precoProduto = $dados['valorItem'];
$imagemProduto = $dados['imagemItem'];
?>
<li>
<figure>
<!-- Você pode usar '?=' no lugar de '?php echo' -->
<img src="<?= '../'. $imagemProduto; ?>" alt="Imagem do Produto" />
<figcaption>
<input type="hidden" id="idItem" value="<?= $idItem; ?>" />
<span id="descProduto">
<?= $descProduto ." (". $unidadeProduto .")"; ?>
</span>
<br>
<span id="precoProd">
<?= $precoProduto; ?>
</span>
</figcaption>
</figure>
<input type="image" src="imagens/mais24.png" id="mais" alt="+" onclick="incQtde(); incValor(150);" />
<input type="image" src="imagens/menos24.png" id="menos" alt="-" onclick="decQtde(); decValor(0);" />
</li>
<?php endwhile; // Essa é uma boa prática ao misturar PHP com HTML ?>
</ul>
</div>
</div>
<script>
var numero = 0;
var valor = 0;
var valItem = document.getElementById('precoProd').textContent;
valItem = Number(valItem);
function decQtde() {
numero--;
setValue(numero);
}
function incQtde() {
numero++;
setValue(numero);
}
function setValue(value) {
document.getElementById('qtde').value = value;
}
function incValor(valor_maximo) {
valor += valItem;
setValor(valor);
}
function decValor(valor_minimo) {
valor -= valItem;
setValor(valor);
}
function setValor(valorTotal) {
document.getElementById('valorItens').value = valorTotal;
}
</script>
</body>
</html> |
Beta Was this translation helpful? Give feedback.
-
Obrigado Victor, Está somando os valores, porém, ele pega o valor apenas do primeiro produto, sempre. Obrigado |
Beta Was this translation helpful? Give feedback.
-
Desculpe a demora, eu tô bem atarefado esses dias.
Isso acontece porque você tava pegando o valor do produto com essa linha: var valItem = document.getElementById('precoProd').textContent; Como tava selecionando um elemento pelo ID, apenas o primeiro elemento seria selecionado. Pra resolver isso, eu atribuí um ID diferente pra cada elemento, baseado no ID dele no banco de dados. O código ficou assim: <?php include("classes/conexaoMySql.class.php"); ?>
<!doctype html>
<html>
<head>
<meta charset="utf-8" lang="pt-br">
<title>Mercado Solidário Bairro da Juventude</title>
<link rel="stylesheet" href="css/style.css">
<link rel="stylesheet" href="css/bootstrap.min.css">
</head>
<body>
<div id="cabecalho-meio" class="row">
<div id="cabecalho-logo" class="bg-light col-sm-3">
<a href="http://www.bairrodajuventude.org.br/" target="_blank"><img src="imagens/logoBairro.png"></a>
</div>
<div id="cabecalho-frase" class="bg-success col-sm-9">
<!-- A Definir -->
</div>
</div>
<div id="cabecalho-inferior" class="row">
<div class="busca col-sm-3">
<form action="">
<label>
<input type="text" name="pesquisa" id="pesquisa" placeholder="Buscar...">
</label>
</form>
</div>
<div class="carrinho col-sm-9">
<ul>
<li>Saldo:</li>
<li>
<script>
// Essa função precisava ser colocada aqui pois é chamada diretamente da tag 'a'
function abrirCarrinho(URL) {
window.open(URL, 'janela',
'width=795, height=590, top=100, left=200, scrollbars=yes, status=no, toolbar=no, location=no, menubar=no, resizable=yes, fullscreen=no'
);
}
</script>
<a href="javascript:abrirCarrinho('carrinho.php')"><img src="imagens/carrinho32.png"></a> <input type="text"
name="" id="qtde">
</li>
<li>R$ <input type="text" id="valorItens"></li>
</ul>
</div>
</div>
<div class="row container-fluid">
<div class="categorias col-sm-3">
<h2 class="">Meus Itens</h2>
<hr>
<ul>
<li></li>
</ul>
</div>
<div class="vitrine col-sm-9">
<ul>
<?php
$cn = new conexaoMySql();
$con = $cn->conectar();
$sql =
"SELECT item_auxilio.id_item_auxilio
AS idItem, item_auxilio.descricao_item_auxilio
AS descItem, item_auxilio.unidade_item, unidade_medida.id_unidade_medida, unidade_medida.sigla_unidade_medida
AS unidadeSigla, item_auxilio.valor_item
AS valorItem, item_auxilio.imagem
AS imagemItem
FROM item_auxilio, unidade_medida
WHERE item_auxilio.unidade_item = unidade_medida.id_unidade_medida
AND estoque_item > estoque_margem
AND imagem <> ''";
$query = mysqli_query($con, $sql);
while ($dados = mysqli_fetch_array($query)) :
$idItem = $dados['idItem'];
$descProduto = $dados['descItem'];
$unidadeProduto = $dados['unidadeSigla'];
$precoProduto = $dados['valorItem'];
$imagemProduto = $dados['imagemItem'];
?>
<li>
<figure>
<img src="<?= '../'. $imagemProduto; ?>" alt="Imagem do Produto" />
<figcaption>
<input type="hidden" id="idItem" value="<?= $idItem; ?>" />
<span id="descProduto">
<?= $descProduto ." (". $unidadeProduto .")"; ?>
</span>
<br>
<!-- Adicionei o id do produto ao id do preço para diferenciar cada item -->
<span id="precoProd-<?= $idItem; ?>">
<?= $precoProduto; ?>
</span>
</figcaption>
</figure>
<!-- O ID vai ser enviado na chamada da função incValor e da decValor -->
<input type="image" src="imagens/mais24.png" id="mais" alt="+"
onclick="incQtde(); incValor('<?= $idItem; ?>', 150);" />
<input type="image" src="imagens/menos24.png" id="menos" alt="-"
onclick="decQtde(); decValor('<?= $idItem; ?>', 0);" />
</li>
<?php endwhile; ?>
</ul>
</div>
</div>
<script>
var numero = 0;
var valor = 0;
var valItem; // Declarei a variável sem atribuir ainda um valor a ela
// Criei uma função para retornar o preço do produto dependo de sua id
function getPrecoItem(id) {
// Caso não esteja familiarizado com template literals, recomendo esse artigo: https://nipher.io/es6-template-literals/
valItem = document.getElementsById(`precoProd-${id}`).textContent;
// Transformar em número para podermos fazer operações matemáticas
valItem = Number(valItem);
return valItem;
}
function decQtde() {
numero--;
setQuantidade(numero);
}
function incQtde() {
numero++;
setQuantidade(numero);
}
// Alterei o nome da funcao para 'setQuantidade'
function setQuantidade(value) {
document.getElementById('qtde').value = value;
}
// Adicionei uma lógica para o valor máximo e mínimo
function incValor(id, valor_maximo) { // Adicionei o parametro id
if (valor > valor_maximo) {
valor += getPrecoItem(id); // Iterando com getPrecoItem, você deve conseguir somar o preço de cada produto11
setValorTotal(valor);
} else {
alert('Valor máximo atingido');
}
}
function decValor(id, valor_minimo) {
if (valor < valor_minimo) {
valor -= getPrecoItem(id);
setValorTotal(valor);
} else {
alert('Valor mínimo atingido');
}
}
function setValorTotal(valorTotal) {
document.getElementById('valorItens').value = valorTotal;
}
</script>
</body>
</html> Na medida que seu código vai ficando grande, recomendo começar a dividir em arquivos. |
Beta Was this translation helpful? Give feedback.
-
Boa tarde Victor, Primeiro gostaria de agradecer o tempo dedicado para me auxiliar. Ajustei meu código como sugeriste: var numero = 0; function getPrecoItem(id) {
} function decQtde() { function incQtde() { function incValor(valor_maximo, id){
}
} Obrigado mais uma vez. |
Beta Was this translation helpful? Give feedback.
-
Olá, Fernando. Eu cometi um erro nos operadores das funções de incremento e decremento. Fiz uma correção nessas funções, veja se funciona agora: function incValor(id, valor_maximo) {
if (valor <= valor_maximo) { // Mudei o operador para <= (menor ou igual)
valor += getPrecoItem(id);
setValorTotal(valor);
} else {
alert('Valor máximo atingido');
}
}
function decValor(id, valor_minimo) {
if (valor >= valor_minimo) { // Mudei o operador para >= (maior ou igual)
valor -= getPrecoItem(id);
setValorTotal(valor);
} else {
alert('Valor mínimo atingido');
}
} Agora sobre seu outro ponto...
O Sobre seu código:
Quando se usa as Template Literals (que permite mesclar strings e variáveis), você deve utilizar crase ( document.getElementById(`precoProd-${id}`).textContent; // Repare que usei ` e não ' Caso não queira se aventurar ainda com as Template Literals, você pode normalmente concatenar (aí sim usar aspas): document.getElementById('precoProd-' + id).textContent; // Usei ' aqui |
Beta Was this translation helpful? Give feedback.
-
Boa tarde Victor, Muito obrigado pela ajuda. Estou estudando JS, mas ainda engatinhando. Está funcionando conforme eu previa. Só mais uma coisa: Na parte lateral da página pretendo colocar os itens do carrinho, com suas respectivas quantidades, Minha dificuldade está em percorrer os elementos com um for ou while e adicionar, decrementar, incrementar ou retirar (quando quantidade for 0) um item qualquer. Se puderes me dar umas dicas, agradeço muito! Obrigado. |
Beta Was this translation helpful? Give feedback.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
-
Bom dia,
Estou fazendo um select e pegando descrição e preço dos produtos, carrego os dois em "spans" dentro de um "figcaption", abaixo o código:
<script> numero = 0; var valor = 0; var valorItem = document.getElementById('precoProd').textContent;}
}
function setValue(value) {
document.getElementById('qtde').value = value;
}
}
;
</script>
Categorias
conectar();
...Porém não está funcionando, e o erro é "Uncaught TypeError: document.getElementById(...) is null" na linha "valorItem = document.getElementById('precoProd').textContent;"
Se puderem me ajudar, agradeço.
Beta Was this translation helpful? Give feedback.
All reactions