Ir para conteúdo

POWERED BY:

Arquivado

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

Jair Humberto

[Resolvido] como usar função como se fosse nativa

Recommended Posts

Olá pessoal,

não sei como se chama isso,

como faço para usar uma função da forma: document.formulario.campo.value.minhafuncao() ?

 

 

quero em minhafuncao, receber o valor contido em document.formulario.campo.value e

manipula-lo

 

uma vez vi isso aqui no forum, mas não pude encontrar

Compartilhar este post


Link para o post
Compartilhar em outros sites

chama-se PROTOTYPE

 

por ex

 

String.prototype.suaFuncao = function(){
   alert(this);
}
var str = "a";
str.suaFuncao();

ou seja toda string terá a sua função, você pode fazer isso com Array, Object, Date, todos os objetos do javascript...

 

t+

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ah, era isso mesmo, obrigado otata.

 

agora, eu tenho outra dúvida.

quero criar uma função getElementsByClass, para substituir a função getElementsByClassName que não funciona

no IE6,

 

quero simular exatamente o que ocorre na função getElementsByTagName:

 

DIVs = document.getElementsByTagName("div"); //um array com todos os elementos DIV dentro do documento
ULs = DIVs[0].getElementsByTagName("ul"); //um array com todos os elementos UL dentro de DIVs[0]

pra isso, eu preciso saber qual é o objeto em que a funçao foi chamada, bem como a string como parâmetro.

 

elemento.getElementsByClass("teste"); // receberia os parâmetros "elemento" como objeto, e "teste" como string.

sabe como que consigo isso? A dificuldade está em receber, como parâmetro, o objeto.

 

 

Obrigado desde já.

 

 

editado:

 

Descobri que Object.prototype.minhafuncao pega o objeto.

Só que não funciona em Internet Explorer

 

O IE só pega objetos normais que eu crio. Apesar de typeof(document) retornar object, o IE6 não consegue pegar a

variavel.

 

No firefox vai de boa.

 

se funcionasse no IE6 a solução seria essa:

 

edit:modifiquei, devido a um erro

// Jair Humberto
Object.prototype.getElementsByClass = function(getClass){
	var classArrayObjects = new Array();
	var allObjTags = this.getElementsByTagName("*");
	for( i=0; allObjTags[i]; i++){
		var classes = allObjTags[i].className.split(" ");
		for(j=0;classes[j];j++){
			if(classes[j] == getClass){
				classArrayObjects.push(allObjTags[i]);
				break;
			}
		}
	}
	return classArrayObjects;
}

Esse codigo acima funciona perfeitamente no Firefox

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara,

 

Eu tenho uma função aqui q eu acho mt boa, eu achei em algum site q naum me lembro qualé uhahuahuahua, por isso não passo a referência do real autor do código.

Porém sei q ela é boa , pq ela tb recupera as classes quando tem " " espaço .

 

 

tenta aee

 

document.getElementsByClassName = function(clsName){
	var retVal = new Array();
	var elements = document.getElementsByTagName("*");
	for(var i = 0;i < elements.length;i++){
		if(elements[i].className.indexOf(" ") >= 0){
			var classes = elements[i].className.split(" ");
			for(var j = 0;j < classes.length;j++){
				if(classes[j] == clsName)
					retVal.push(elements[i]);
			}
		}
		else if(elements[i].className == clsName)
			retVal.push(elements[i]);
	}
	return retVal;
}

o retorno dela é um array contendo os elementos que ele encontrou com a classe q você passa como parâmetro pra ela.

Abssss

Compartilhar este post


Link para o post
Compartilhar em outros sites

Jair Humberto, voce esta passando pelo mesmo problema que o pessoal que desenvolveu a prototype passou(eles tem até um artigo explicando o por aque das diferenças no comportamento de certas features na api por causa disso).

 

No IE não é possível extender os objetos do tipo HTMLxxxx (HTMLInput, HTMLTextArea) nativos como se faz no firefox, sem dizer que estes, no IE não respeitam a regra de prototipagem.

Compartilhar este post


Link para o post
Compartilhar em outros sites

ih, que paia ein Kleygomes?

e agora? o problema fica sem solução? :(

você tem o link desse artigo?

 

outra coisa, prototype e nativa do javascript não é?

ou é uma biblioteca?

 

carutho, essa função não é tãão boa assim,

eu só posso pegar as classes dentro de document.

 

e se eu quisesse, por exemplo, pegar todas os elementos com a classe "X" dentro de um elemento com a classe "X"?

tem q funcionar como a classe getElementsByClassName original:

 

array = object.getElementsByClassName(class);

 

e não como está:

 

array = document.getElementsByClassName(class);

 

Sacou?

A minha solução SERIA perfeita se não tivesse esse problema aí que o Klaygomes relatou.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Prototype é o nome de uma lib e propriedade do javascript(mas com o p minusculo).

Você pode fazer um hackizinho para resolver este problema, tipo:

 

window.onload = function(){
	var nodes = document.getElementsByTagName("*");
	for(var y = 0;y < nodes.length;y++){
		nodes[y].getElementsByClassName = function(clsName){
			var retVal = new Array();
			var elements = this.getElementsByTagName("*");
			for(var i = 0;i < elements.length;i++){
				if(elements[i].className.indexOf(" ") >= 0){
					var classes = elements[i].className.split(" ");
					for(var j = 0;j < classes.length;j++){
						if(classes[j] == clsName)
							retVal.push(elements[i]);
					}
				}
				else if(elements[i].className == clsName)
					retVal.push(elements[i]);
			}
			return retVal;
		}
	}
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá klayglomes,

 

essa função q você sugeriu não funcionando corretamente nem mesmo no firefox O.o

tentei descobrir o problema, parece que é no return,

mas pra objetos nativos como o document, não chega nem a executar a função nem mesmo

no firefox!

 

o que há de errado?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Só para ampliar o arsenal de códigos rsss

 

Poderia ser feito assim tb.

 

absss

 

 

<html>
<head>
	<title>Formulário checkboxes</title>

<script  type="text/javascript">
function getElementsByClassName (clsName,obj){
	var retVal = new Array();
	var elements = (!obj)? document.getElementsByTagName("*") : obj.getElementsByTagName("*");
	for(var i = 0;i < elements.length;i++){
		if(elements[i].className.indexOf(" ") >= 0){
			var classes = elements[i].className.split(" ");
			for(var j = 0;j < classes.length;j++){
				if(classes[j] == clsName)
					retVal.push(elements[i]);
			}
		}
		else if(elements[i].className == clsName)
			retVal.push(elements[i]);
	}
	return retVal;
}


function testeClassName ()
{
	var obj = document.getElementById("testando");
	alert(getElementsByClassName("teste"));
	alert(getElementsByClassName("teste",obj));
}
</script>

</head>

<body>

<div class="teste">
	<div id="testando">
		<p class="teste">
		</p>
	</div>
</div>

<a href="java script:testeClassName()"> clique aqui </a>
</body>
</html>

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.