Jump to content


Photo

Problema Com Loop


  • Faça o login para participar
18 replies to this topic

#1 Rafael P L

Rafael P L

    Novato no fórum

  • Usuários
  • 9 posts
  • Sexo:Masculino
  • Localidade:Campos dos Goytacazes - RJ

Posted 30/07/2011, 22:47

Pessoal, estou escrevendo um código para que reconheça uma palavra no textarea e a selecione. Veja abaixo.

HTMLTextAreaElement.prototype.wordDetect = function()
{
var startCursor = this.selectionStart;
var endCursor = this.selectionEnd;
var txt = this.value;

while (txt.charAt(startCursor) != ' ' || txt.charAt(startCursor) != '\n' || this.selectionStart !== 0)
{
this.selectionStart = startCursor;
this.focus();
startCursor--;
}

while (txt.charAt(endCursor) != ' ' || txt.charAt(endCursor) != '\n' || this.selectionEnd !== 0)
{
endCursor++;
this.focus();
this.selectionEnd = endCursor;
}
/**/
};


Só que estou tendo problema com os loops. Estão entrando em loop infinito, mas não deviam. Estou testando ainda apenas no FF.

Edição feita por: Rafael P L, 30/07/2011, 23:00.


#2 Édipo Costa Rebouças

Édipo Costa Rebouças

    Veterano

  • Ex-Admins
  • 1079 posts
  • Sexo:Masculino
  • Localidade:Brasil - São Paulo

Posted 11/08/2011, 00:46

tem certeza que é selectionstart e selectionend tudo em minusculo e que a verificação é "!==" e não "!=" ?

#3 Rafael P L

Rafael P L

    Novato no fórum

  • Usuários
  • 9 posts
  • Sexo:Masculino
  • Localidade:Campos dos Goytacazes - RJ

Posted 11/08/2011, 10:11

tem certeza que é selectionstart e selectionend tudo em minusculo e que a verificação é "!==" e não "!=" ?


É sim meu amigo. Eu consegui resolver parcialmente. Eu descobri o problema lógico. O correta era usar && a II no while. Agora eu tenho mais um problema para resolver. Ele deve selecionar uma palavra, mas não deve selecionar uma pontuação qualquer. A função para este fim eu já desenvolvi, e funciona perfeitamente. Esse código está funcionando perfeitamente para a direita da palavra, mas para a esquerda ele seleciona uma casa a mais. Ex.: se o cursor estiver entre a palavra :test, este código selecionará :test ao invés de test somente, caso esteja somente test. somente test será selecionado. Entende?
Acompanhe-o abaixo.

HTMLTextAreaElement.prototype.wordSelect = function()
{
	if(this.selectionStart !== this.selectionEnd){
		this.focus();
		return; //sai da função e não retorna nada
	}

	var startCursor = this.selectionStart;
	var endCursor = this.selectionEnd;
	var txt = this.value;
	
	while (startCursor >= 0 && txt.charAt(startCursor) != ' ' && txt.charAt(startCursor) != '\n' && !txt.charAt(startCursor).isPoint())
	{
		/*if (txt.charAt(startCursor).isPoint()){
			alert('Found!');
			startCursor++;
			break;
		}/**/
		startCursor--;
	}

	while (endCursor <= txt.length && txt.charAt(endCursor) != ' ' && txt.charAt(endCursor) != '\n' && !txt.charAt(endCursor).isPoint())
		endCursor++;
	//alert(startCursor);
	this.selectionStart = startCursor;
	this.selectionEnd = endCursor;
	this.focus();
};

Edição feita por: Rafael P L, 11/08/2011, 10:13.


#4 Édipo Costa Rebouças

Édipo Costa Rebouças

    Veterano

  • Ex-Admins
  • 1079 posts
  • Sexo:Masculino
  • Localidade:Brasil - São Paulo

Posted 12/08/2011, 18:44

teste trocar issa parte
endCursor <= txt.length && txt.charAt(endCursor) != ' ' && txt.charAt(endCursor) != '\n' && !txt.charAt(endCursor).isPoint()
para uma expressão regular

exemplo
text.chartAt(endCursor).mactch(/[a-zA-Z]/)
vai retornar um array se achar algo, e null se não achar nada

#5 Rafael P L

Rafael P L

    Novato no fórum

  • Usuários
  • 9 posts
  • Sexo:Masculino
  • Localidade:Campos dos Goytacazes - RJ

Posted 14/08/2011, 01:23

Bom, o problema não é esse. Ele reconhece o ponto que eu definir, e fica mais fácil dizer os proibidos do que os liberados. Não é minha intenção liberar somente letras, mas impedir pontuações, como ponto, ponto e vírgula, etc. Faça o teste e veja como o código funciona, depois o senhor me diz.

O código que verifica um ponto é esse.

String.prototype.isPoint = function()
{
	var expr = new RegExp('[\.]|[\,]|[\?]|[\:]|[!]|[;]|[—]');
	if (expr.test(this))
		return  true;
	return false;
};

Edição feita por: Rafael P L, 14/08/2011, 01:32.


#6 Henderson

Henderson

    12 Horas

  • Usuários
  • 279 posts
  • Sexo:Não informado
  • Localidade:Santos

Posted 15/08/2011, 11:49

pqe vce comentou aquela parte no código? ela não funcionava?
tá certa a lógica acho, mas aqela parte comentada é qe reposicionaria o cursor para a direita do ponto.
Mas não precisa daquele break ali não. Tira ele, deixa o código seguir normal.

#7 Rafael P L

Rafael P L

    Novato no fórum

  • Usuários
  • 9 posts
  • Sexo:Masculino
  • Localidade:Campos dos Goytacazes - RJ

Posted 15/08/2011, 12:48

Você chegou a testar o código? A parte comentada foi uma apelação minha, ou seja, ela é desnecessária. A partir de alguns momentos que a lógica já não está a contento, começamos a inventar coisas para tentar fazer funcionar. Teste o código, ele está pequeno, aí vocês me dizem.

#8 Henderson

Henderson

    12 Horas

  • Usuários
  • 279 posts
  • Sexo:Não informado
  • Localidade:Santos

Posted 15/08/2011, 13:37

ah tá, entendi
bom, vce tá comparando sempre o caracter atual, sendo que vce tem que comparar o caracter anterior, pra ver se realmente tem que andar pra esquerda.
então, troque seus startCursor no primeiro while, por startCursor-1
veja se dá!

não to com tempo de ficar testando agora, to só dando uma sugestão que parece que vai funcionar, mas nem sempre é assim né!
mas quem sabe da certo!
  • Rafael P L likes this

#9 Rafael P L

Rafael P L

    Novato no fórum

  • Usuários
  • 9 posts
  • Sexo:Masculino
  • Localidade:Campos dos Goytacazes - RJ

Posted 15/08/2011, 13:58

Mas eu já estou fazendo isso, decrementando o startCursor, repare o interior do primeiro while.

#10 Édipo Costa Rebouças

Édipo Costa Rebouças

    Veterano

  • Ex-Admins
  • 1079 posts
  • Sexo:Masculino
  • Localidade:Brasil - São Paulo

Posted 15/08/2011, 14:27

Rafael, você pode colocar um exemplo online? acho que dá pra fazer com uma unica expressão regular isso ai. tentei testar mais não deu muito certo.

#11 Rafael P L

Rafael P L

    Novato no fórum

  • Usuários
  • 9 posts
  • Sexo:Masculino
  • Localidade:Campos dos Goytacazes - RJ

Posted 15/08/2011, 14:33

Dá para anexar arquivos aqui no fórum?

#12 Édipo Costa Rebouças

Édipo Costa Rebouças

    Veterano

  • Ex-Admins
  • 1079 posts
  • Sexo:Masculino
  • Localidade:Brasil - São Paulo

Posted 15/08/2011, 14:37

Clica em editor completo que aparece a opção de anexar.

#13 Henderson

Henderson

    12 Horas

  • Usuários
  • 279 posts
  • Sexo:Não informado
  • Localidade:Santos

Posted 15/08/2011, 14:41

não, vce não tá fazendo isso.
vce tá verificando, depois decrementando. vce já tem que verificar o anterior.
veja nesse exemplo

:teste
nesse caso, vamos supor que seu while está analisando o "t"
ele vai analisar o T, o T vai passar nos testes das condições, porque é uma letra e então o código ira decrementar o cursor. decrementando o cursor, o ":" será incluído na seleção
no próximo loop o while será finalizado porque aí sim ele irá analizar o ":"
por isso que você tem que analisar o startCursor-1 na condição do while e não somente startCursor
tente assim:
while (startCursor-1 >= 0 && txt.charAt(startCursor-1) != ' ' && txt.charAt(startCursor-1) != '\n' && !txt.charAt(startCursor-1).isPoint())
        {
               startCursor--;
        }

eu não sei se essas operação "-1" são aceitas dentro do while
se não forem, vce vai ter que criar uma variável auxiliar pra fazer isso.

teste aí.

#14 Rafael P L

Rafael P L

    Novato no fórum

  • Usuários
  • 9 posts
  • Sexo:Masculino
  • Localidade:Campos dos Goytacazes - RJ

Posted 15/08/2011, 14:44

Mas aí é que está Henderson, por que para a direita, funciona perfeitamente, isto é, na etapa do endCursor?

Edição feita por: Rafael P L, 15/08/2011, 14:46.


#15 Édipo Costa Rebouças

Édipo Costa Rebouças

    Veterano

  • Ex-Admins
  • 1079 posts
  • Sexo:Masculino
  • Localidade:Brasil - São Paulo

Posted 15/08/2011, 14:46

é aceito sim.

de um jeito de anexar, colocar no megaupload, o que seja, pois fica bem mais facil ajudar.




0 user(s) are reading this topic

0 membro(s), 0 visitante(s) e 0 membros anônimo(s)

IPB Skin By Virteq