Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Leo Telles

[Resolvido] Script para de executar no meio

Recommended Posts

Bom dia Pessoal,

 

Como podem ver sou novato aqui e espero por contribuir em algo também. No momento estou quebrando a cabeça com um script que não consigo achar o erro. Já mudei várias vezes, fiz vários testes com alert e nada. O script simplesmente para de executar após o FOR. Se eu coloco um alert dentro do FOR ele executa a mensagem quantas vezes se encaixar na condição, mas após terminar o FOR não executa nem um alert fora dele.

 

Tenho um alert dentro do FOR que está comentado, mas se retirar o comentário ele executa normalmente quantas vezes entrar na condição, inclusive informado o valor da variável "cont" incrementada.

function verificar(form){
with (form) {
	var cont = new Number(0);
	for (var i=0; i < 50; i++){
		if ( item_relacionado[i].value =="..."){
			var cont = new Number(cont + 1);
			//alert("É necessário informar todos os itens relacionados." + cont);
		}
	}

	if ( cont!=0 ){
		alert("É necessário informar todos os itens relacionados.");
		nome.focus();
		return false;
	}else{
		document.form1.submit();
		window.opener.location.reload();
		self.close();
	}
}
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

aperte Ctrl+Shift+J e veja oq aparece no console de erros.

 

http://wbruno.com.br/2011/03/31/como-debugar-javascript-firefox-erros-comuns/

Compartilhar este post


Link para o post
Compartilhar em outros sites

aperte Ctrl+Shift+J e veja oq aparece no console de erros.

 

http://wbruno.com.br/2011/03/31/como-debugar-javascript-firefox-erros-comuns/

 

 

Fala Willian,

 

Aparece o erro abaixo, que é a quinta linha do script.

 

Hora: 08/01/2013 09:43:34

Erro: TypeError: item_relacionado is null

Arquivo-fonte: http://192.168.10.20/sys/form_itens_nf_consumo.php?filial=01&serie=1%20%20&nf=0000098923&fornec=66&areneg=06

Linha: 49

Compartilhar este post


Link para o post
Compartilhar em outros sites

de onde vem a variavel item_relacionado ?

 

veja:

for (var i=0; i < 50; i++){

 

não exceda o tamanho do array. Esse 50, parece ser maior q o tamanho do array, por isso o erro.

No lugar dele, pegue o tamanho do array.

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

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara, coloquei exatamente como informou e continua sem executar, porém o erro na console mudou um pouco. Ao invés de null, está indefinido agora.

 

Hora: 08/01/2013 10:14:22

Erro: TypeError: item_relacionado is undefined

Arquivo-fonte: http://192.168.10.20/sys/form_itens_nf_consumo.php?filial=01&serie=1%20%20&nf=0000098923&fornec=66&areneg=06

Linha: 49

 

 

O item_relacionado vem de campo de array no formato de caixa de seleção que é incrementado no formulário de acordo com a quantidade de registros selecionados no banco, conforme exemplo abaixo. Se quiser, posso postar um código fonte de um formulário desse já montado.

 

<select name="item_relacionado[]" id="item_relacionado">

Compartilhar este post


Link para o post
Compartilhar em outros sites

Willian,

 

Realmente tem haver com o final do array. Fiz um teste limitando a variável "i" até 2 em uma situação que só tem 3 registros e funcionou legal. O problema agora é como limitar esse array que não sei como fazer em javascript. Se tiver como colocar uma variável do PHP no javascript eu faço um select no banco e conto a quantidade de registros. Não é o ideal, mas funcionaria. Caso mais alguém saiba como fazer da maneira correta, posta aí.

Compartilhar este post


Link para o post
Compartilhar em outros sites

mostre onde você cria essa variavel

Compartilhar este post


Link para o post
Compartilhar em outros sites

A variável item_relacionado vem de um campo de array do formulário, de uma caixa de seleção para ser mais exato. Conforme abaixo.

 

<select name="item_relacionado[]" id="item_relacionado">

Compartilhar este post


Link para o post
Compartilhar em outros sites

ai é o html dela.. mas onde você cria ?

 

 

no js, onde você cria ela no js ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

mas isso não existe cara.. você tem q criar.. o js não pega sozinho nada.

 

<!DOCTYPE HTML>
<html lang="en-US">
<head>
   <meta charset="UTF-8">
   <title></title>
</head>
<body>

   <select name="item_relacionado[]">
       <option value="">1</option>
   </select>
   <select name="item_relacionado[]">
       <option value="">1</option>
   </select>
   <select name="item_relacionado[]">
       <option value="">1</option>
   </select>
   <select name="item_relacionado[]">
       <option value="">1</option>
   </select>

   <script type="text/javascript">
   var items = document.getElementsByName('item_relacionado[]');

   console.log( items.length );//4

   //console.log( item_relacionado.length );//undefined
   </script>
</body>
</html>

viu ali o getElementsByName ? ai o .length retorna 4, dessa forma o teu loop vai funcionar.

Compartilhar este post


Link para o post
Compartilhar em outros sites

William,

 

Não conheço muito de javascript, o que tenho feito é pegar códigos na net e adaptar ao meu uso. E assim vou aprendendo no braço. Quando peguei esse código foi para validar campos em branco de um formulário e ele era simplesmente assim:

function verificar(form){
with(form){
	if ( cpf.value ==""){
		alert("É necessário informar o CPF.");
		nome.focus();
		return false;
	}
}
}

Como funcionou 100% no firefox, comecei a modificá-lo e utilizar em diversas aplicações, inclusive nessa atual. Pelo que entendi lendo um pouco sobre javascript, o comando "with" é utilizado para tratar objetos mais facilmente dentro do bloco dele. Neste caso o "with(form)" está tratando os objetos do meu formulário diretamente. Acredito que por isso o javascript já entendeu que "item_relacionado.value" é o valor do campo de array do meu formulário. Se eu estiver errado, esteja a vontade para me corrigir.

 

Com relação a solução do problema deste tópico, sua avaliação foi essencial. Porque eu não pensei em nenhum momento que o erro fosse com relação a quantidade de loopings do FOR. Tenho até vergonha de postar o que eu fiz para resolver o problema. Pois realmente foi uma "gambiarra" de primeira... rsrsrs...

 

Fiz como citei anteriormente. Fiz um select no banco e conto os registros na montagem do form, aí no caso o FOR tem a variável "i" limitada a esse valor achado. E simplesmente coloquei as tags do PHP dentro do js ficando assim a o script:

 

function verificar(form){
with (form) {
	var cont = new Number(0);
	for (var i=0; i < <? echo $cont_reg; ?>; i++){
		if ( item_relacionado[i].value =="..." ){
			var cont = new Number(cont + 1);
		}
	}
	if ( cont!=0 ){
		alert("É necessário informar todos os itens relacionados.");
		nome.focus();
		return false;
	}else{
		document.form1.submit();
		window.opener.location.reload();
		self.close();
	}
}
}

 

Mesmo assim ainda tive que criar um outro script parecido e com outro nome chamando de "verificar1", porque nesse daí quando só tenho uma linha no array, a variável "cont" não incrementa para "1". Aí fiz outra "gambiarra" na chamada da função ao clicar no botão ficando assim.

 

<input type="button" value="Importar Itens" onClick="<? if (($cont_reg == 1) or ($cont_reg == 0)){ echo "verificar1(form1);";}else{ echo "verificar(form1);";} ?>">

 

Sou uma vergonha na área dos programadores.... kkkkkkkkkkkkkkk... Pelo menos agora tá tudo funcionando...

 

Agradeço muito a ajuda e rapidez nas respostas

Compartilhar este post


Link para o post
Compartilhar em outros sites

ok.. temos 2 coisas aqui:

 

o with() diminui a legibilidade do código.

Oque você está fazendo é:

 

 if ( form.item_relacionado[i].value =="..." ){

pois onde viria o "undefined", o with se enfia antes e assume a posição.

 

Mas essa forma:

 

form.campo.atributo vai contra as boas práticas do desenvolvimento moderno de javascript.

 

Pois, hoje em dia, é recomendado usar as funções:

 

getElementById(), getElementByTagName(), getElementByName()... e assim por dianta. Estas são as formas "corretas".

Se você der uma olhada sobre Ecma 5, o "use strict", nem deixaria você usar essa forma ai =), enfim.. tá funcionando, fico feliz..

 

mas se você quiser evoluir, dá uma atenção a estas funções que eu te indiquei. :lol:

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom dia William,

 

É como falei, estou iniciando na ára de programação e desenvolvendo algumas aplicações integrando com o banco do ERP do grupo onde trabalho para facilitar a vida dos usuários e a minha. PHP já evoluí um pouco mais, mas JS estou no começo mesmo. Realmente tenho muito interesse em aprender e evoluir nessa área.

 

Com relação a essas funções que citou, elas funcionariam com um campo de array normalmente como o que estou usando? Se possível, poderia me dar um exemplo de como usar uma delas neste caso?

 

E um outro detalhe, tenho testado diversos scripts da net e muitos não funcionam corretamente no Firefox. Estas funções funcionam normalmente?

 

Desculpa esse monte de perguntas, William.

Compartilhar este post


Link para o post
Compartilhar em outros sites

sim, o exemplo eu dei ali em cima:

 

http://forum.imasters.com.br/topic/484174-script-para-de-executar-no-meio/page__view__findpost__p__1923394

 

<script type="text/javascript">
   var items = document.getElementsByName('item_relacionado[]');

   console.log( items.length );//4
</script>

as funções: ..ElementsBy... retornam arrays.

 

a getElementById(), retorna um único elemento, pois IDs são únicos.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Obrigado mesmo pela ajuda, William. Vou tentar mudar meu script usando o "getElementsByName" para o array, mas também poderia utilizar o ById para o array de campos desde que eu imprimisse um incremento no campo do ID.

 

Exemplo:

 

<select name="item_relacionado[]" id="item_relacionado<? echo $cont ?>">

 

Onde a variável "cont" seria incrementada de acordo com a quantidade de registros. Só acho que também seria um armengue, não?

Compartilhar este post


Link para o post
Compartilhar em outros sites

ai seria bem ruim cara.. getElementsByName ou byTag são melhores para você.

 

o byId não se encaixa.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.