addEventListener com parametros

269 views
Skip to first unread message

Lucas Peres da Silva

unread,
Jul 13, 2006, 10:50:46 AM7/13/06
to ar...@googlegroups.com
Pessoal estou montando um buscador para um site em AJAX.

Minha função callback recebe um lista com os registros do bd.
Estou montando toda a tabela de resultados via DOM para facilitar paginação e alguns recursos em ajax.

O problema é que tenho um for para montar os registros:

for(i=0;i<page['resultSet_2'].length;i++) {
                var nrow = tableint.insertRow(i);
                nrow.addEventListener('click', function(e) {gRes(page['resultSet_2'][i].ID, this) }, false);

preciso passar 2 parametros para a função gRes: ex: <tr onclick="foo(13,this)"> porém esse código sempre me retorna o mesmo ID.

o primeiro parametro não ta sendo atualizado dentro do for.

Se alguém puder me dar uma luz....valew

[]´s
Lucas

diego nunes

unread,
Jul 13, 2006, 11:04:53 AM7/13/06
to ar...@googlegroups.com
On 7/13/06, Lucas Peres da Silva <mys...@gmail.com> wrote:
> O problema é que tenho um for para montar os registros:
(...)

> porém esse código sempre me retorna o mesmo ID.
>
> o primeiro parametro não ta sendo atualizado dentro do for.

Esse é um problema bem comum atualmente. Seu erro é o seguinte:
A função que você usa espera que o segundo parâmetro seja um objeto
Function. Ele seria se você passasse "gRes" somente, só que aí o
navegador automaticamente passaria apenas um parâmetro pra ela, com o
objeto Evento decorrido do click. A idéia óbvia -- e eu já pensei
assim antes -- é passar um function() e dentro dele chamar a sua
função passando os parâmetros. Até parece ok, só que o único problema
é: o retorno do function, que é o que vai ser efetivamente passado na
chamada do addEventListener.
Ao usar "gRes(blablabla, blablabla);" você está invocando a
função, e o retorno para a chamada do "addEventListener" passa a ser o
retorno da função gRes, e não um objeto function em si. O que acaba
acontecendo, no final das contas, é a função gRes ser chamada apenas
uma vez, na ocasião da atribuição, e o retorno dela tentar ser
executado no evento.
O que fazer, nesse caso? Use closures.

objeto.addEventListener('click',
function(a) { var b=this;
return function() { gRes.apply(window, [a, b]); }
}.apply(this, [page['resultSet_2'][i].ID]),
false);

--
diego nunes
dnunes.com

Jonas Raoni

unread,
Jul 13, 2006, 11:19:00 AM7/13/06
to ar...@googlegroups.com
On 7/13/06, Lucas Peres da Silva <mys...@gmail.com> wrote:
> preciso passar 2 parametros para a função gRes: ex: <tr
> onclick="foo(13,this)"> porém esse código sempre me retorna o mesmo ID.
>
> o primeiro parametro não ta sendo atualizado dentro do for.

<URL:http://groups.google.com/group/arqhp/browse_thread/thread/d99086902959fe9d/016e3300b3d3c774#3b53a51422109e02>

a outra forma q eu não mencionei é usando closures... ;]~


--
Jonas Raoni Soares Silva
http://www.jsfromhell.com

diego nunes

unread,
Jul 13, 2006, 11:29:39 AM7/13/06
to ar...@googlegroups.com
On 7/13/06, diego nunes <dnu...@gmail.com> wrote:
> A função que você usa espera que o segundo parâmetro seja um objeto
> bla bla bla bla bla bla

Só avisando que eu falei um pouco de besteira na mensagem
anterior. No final das contas a solução funciona da mesma forma, eu
acho...

--
diego nunes
dnunes.com

Lucas Peres da Silva

unread,
Jul 13, 2006, 11:32:24 AM7/13/06
to ar...@googlegroups.com
fazendo alguns testes aqui encontrei uma solução bem simples...


for(i=0;i<page['resultSet_2'].length;i++) {
                var nrow = tableint.insertRow(i);
                nrow.setAttribute("ident", page['resultSet_2'][i].ID);
                nrow.addEventListener('click', function(e) {gRes(this.getAttribute("ident"), this) }, false);


valew pela ajuda...


[]´s

Lucas Peres da Silva

unread,
Jul 13, 2006, 12:29:01 PM7/13/06
to ar...@googlegroups.com
Se não fosse pelo legal do IE..... =/


nrow.setAttribute("ident", page['resultSet_2'][i].ID);
nrow.addEventListener('click', function(e) {gRes(this.getAttribute("ident"), this) }, false);

.....


Leandro Nascimento Camargo

unread,
Jul 13, 2006, 2:18:20 PM7/13/06
to ar...@googlegroups.com
Você pode também atribuir uma nova propriedade ao objeto seu em questão.
Para cada objeto dentro do loop você atribui antes (sem usar o
setAttribute, pois o IEca não aceita setar atributos inexistentes para
os elementos) um propriedade qualquer nele:

nrow.ident = page['resultSet_2'][i].ID;

é tosco mas funciona.
eu particularmente não gosto de criar novas propriedade para elementos
'nativos' do JS ou do DOM.
mas na prática você só está aumentando um tiquinho de memória alocada
(se for poucos elementos) e terá sua tabela de hashes ampliada. Isso
atrapalhará caso você queira futuramente pegar todas as propriedades
nativas daquele objeto usando loop 'for in'.

On 7/13/06, Lucas Peres da Silva <mys...@gmail.com> wrote:

Jonas Raoni

unread,
Jul 13, 2006, 2:25:05 PM7/13/06
to ar...@googlegroups.com
On 7/13/06, Leandro Nascimento Camargo <leand...@gmail.com> wrote:
> setAttribute, pois o IEca não aceita setar atributos inexistentes para
> os elementos) um propriedade qualquer nele:

seu ie deve tá zuado xD

<div id="blabla"></div>

var x = document.getElementById("blabla");
x.setAttribute("lala", "lóló");
alert(x.getAttribute("lala"));

a única merda q dá é q no IE é em relação a última linha... o IE tb
adiciona o atributo a lista de propriedades do objeto, mas o ff mantém
cada um no seu canto (q é o correto)

Jonas Raoni

unread,
Jul 13, 2006, 2:28:48 PM7/13/06
to ar...@googlegroups.com
On 7/13/06, Jonas Raoni <jonas...@gmail.com> wrote:
> a única merda q dá é q no IE é em relação a última linha...

faltou a última linha xD

alert(x.lala);

Leandro Nascimento Camargo

unread,
Jul 13, 2006, 2:35:13 PM7/13/06
to ar...@googlegroups.com
> seu ie deve tá zuado xD
>
> <div id="blabla"></div>
>
> var x = document.getElementById("blabla");
> x.setAttribute("lala", "lóló");
> alert(x.getAttribute("lala"));
>
> a única merda q dá é q no IE é em relação a última linha... o IE tb
> adiciona o atributo a lista de propriedades do objeto, mas o ff mantém
> cada um no seu canto (q é o correto)

Não está não.
Mas acho que só em IEcas mais antigos isso acontece.
Não lembro qual (ou quais) navegador que seta ou pega atributos via
JS, apenas aqueles que estão estipulados no DTD.

Quanto aos hashes, o que eu quis dizer é que se perde a relação nativa
de objetos quando se adiciona uma propriedade SUA.

Jonas Raoni

unread,
Jul 13, 2006, 3:18:39 PM7/13/06
to ar...@googlegroups.com
On 7/13/06, Leandro Nascimento Camargo <leand...@gmail.com> wrote:
> Mas acho que só em IEcas mais antigos isso acontece.

isso eu não sei, só lembro q eu fiz esse teste tem uns anos já...
ignora o ie's antigos ae kkkkk, tem certas coisas q devem ser
esquecidas, ainda mais essa q só depende do usuário dar uma atualizada
ou puxar um browser novo :b

> Não lembro qual (ou quais) navegador que seta ou pega atributos via
> JS, apenas aqueles que estão estipulados no DTD.

isso faz sentido, uma vez q não é correto adicionar um atributo
inválido no elemento via html, o mesmo deveria valer para o js... mas
nunca vi um browser q seja tão rígido qto a isso... coloca a url ae ;]

> Quanto aos hashes, o que eu quis dizer é que se perde a relação nativa
> de objetos quando se adiciona uma propriedade SUA.

eh, o ideal é não adicionar nada... tanto os atributos quanto as
propriedades podem gerar colisão de nomes com outros scripts, nos
atributos ainda tem o tal do namespace (q tb pode ser simulado no js),
mas sei lá, toda regra tem sua exceção xD

ex: vc tem uma lista de elementos num array e precisa ter acesso ao
índice de um certo elemento, é muito mais prático e rápido guardar o
índice no próprio elemento do q circular na array procurando o
objeto... como na maioria das vezes esse elemento é recebido de um
evento, tem outras alternativas (o assunto desse tópico kkkkkk), mas
seria um bom caso para guardar algo no elemento ;]

Leandro Nascimento Camargo

unread,
Jul 13, 2006, 4:40:48 PM7/13/06
to ar...@googlegroups.com
> > Não lembro qual (ou quais) navegador que seta ou pega atributos via
> > JS, apenas aqueles que estão estipulados no DTD.

> isso faz sentido, uma vez q não é correto adicionar um atributo
> inválido no elemento via html, o mesmo deveria valer para o js... mas
> nunca vi um browser q seja tão rígido qto a isso... coloca a url ae ;]

http://www.quirksmode.org/dom/tests/attributes2.html

Mas tem mais coisas aqui:
http://tinyurl.com/g7d3z

É porque fiquei com preguiça (e porque tenho que ficar configurando
umas coisas chatas aqui.), hahahaha.

Lucas Peres da Silva

unread,
Jul 13, 2006, 4:47:55 PM7/13/06
to ar...@googlegroups.com
Consegui resolver com com o código:

if(nrow.attachEvent) {
  nrow.attachEvent("onclick",
  function(a) {
    var b=nrow;

    return function() {
      gRes.apply(window, [a, b]);
    }
  }.apply(this, [page['resultSet_1'][i].ID]));
} else if (nrow.addEventListener) {
  nrow.addEventListener('click',
  function(a) {
    var b=nrow;

    return function() {
      gRes.apply(window, [a, b]);
    }
  }.apply(this, [page['resultSet_1'][i].ID]), true);
}


Valew pela ajuda....

Lucas Ferreira

unread,
Jul 13, 2006, 5:36:21 PM7/13/06
to ar...@googlegroups.com
Uma vez eu fiz um script de delegate baseado na Delegate do flash, para coisas assim:

http://blog.lucasferreira.com/2006/01/16/js-delegate/

Ficaria assim com Delegate:


for(i=0;i<page['resultSet_2'].length;i++) {
var nrow = tableint.insertRow(i);
nrow.addEventListener('click', Delegate.create(nrow, function(a, b) { gRes(a, b) }, [page['resultSet_2'][i].ID, nrow]), false);


Abracetas... ;)


On 7/13/06, Lucas Peres da Silva <mys...@gmail.com> wrote:



--

Lucas Ferreira
------------------------------------------------
http://www.lucasferreira.com/
Reply all
Reply to author
Forward
0 new messages