Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Javascript > Setting <TD> onclick will give _extended="true" or event="undefined" in IE

Reply
Thread Tools

Setting <TD> onclick will give _extended="true" or event="undefined" in IE

 
 
Jason
Guest
Posts: n/a
 
      10-10-2006
Hello,
I am trying to dynamically create a table, then set its <td>'s onclick:

var table = document.createElement("table");
var row = table.insertRow(-1);
var td = row.insertCell(-1);
td.onclick = myfunction;

function myfunction(event) {
alert(event);
}

For some reason I cant get this to work. I have tried:
- td.setAttribute("onclick", myfunction);
- Event.observe(td, 'click', myfunction, false);

None of them will register the onclick event properly. Either td will
have _extended="true" as an attribute, or event will be "undefined" in
myfunction. This is only a problem in IE. Does anyone know how to fix
this problem?

- Jason

 
Reply With Quote
 
 
 
 
RobG
Guest
Posts: n/a
 
      10-10-2006
Jason wrote:
> Hello,
> I am trying to dynamically create a table, then set its <td>'s onclick:
>
> var table = document.createElement("table");
> var row = table.insertRow(-1);
> var td = row.insertCell(-1);
> td.onclick = myfunction;


I think you forgot:

document.body.appendChild(table);


> function myfunction(event) {


Gecko (and similar) browsers pass a reference to an event object as the
first paramter when calling a function assigned to an intrinsic event
handler this way. IE doesn't, it uses a global 'event' variable.

Your local variable "event" here masks IE's global event variable, to
accommodate both models, use:

function myfunction(e) {
var e = e || window.event;
/* e is now a reference to the appropriate event object */
alert(e);
}

[...]


--
Rob

 
Reply With Quote
 
 
 
 
Jason
Guest
Posts: n/a
 
      10-11-2006
Still doesnt work...So i wrote a test script demoing the bug:

window.onload = function() {
var table = document.createElement("table");
table.style.width = "200px";
table.style.height = "200px";
table.style.border = "1px solid black";
var row = table.insertRow(-1);
var td = row.insertCell(-1);
td.onclick = myfunction;
document.body.appendChild(table);
}

function myfunction(e) {
alert(e);
alert(window.event);
}

Any ideas why e is undefined?

- Jason




RobG wrote:
> Jason wrote:
> > Hello,
> > I am trying to dynamically create a table, then set its <td>'s onclick:
> >
> > var table = document.createElement("table");
> > var row = table.insertRow(-1);
> > var td = row.insertCell(-1);
> > td.onclick = myfunction;

>
> I think you forgot:
>
> document.body.appendChild(table);
>
>
> > function myfunction(event) {

>
> Gecko (and similar) browsers pass a reference to an event object as the
> first paramter when calling a function assigned to an intrinsic event
> handler this way. IE doesn't, it uses a global 'event' variable.
>
> Your local variable "event" here masks IE's global event variable, to
> accommodate both models, use:
>
> function myfunction(e) {
> var e = e || window.event;
> /* e is now a reference to the appropriate event object */
> alert(e);
> }
>
> [...]
>
>
> --
> Rob


 
Reply With Quote
 
RobG
Guest
Posts: n/a
 
      10-11-2006
Jason wrote:

Do not top-post, reply below a trimmed quote of the text you are
replying to.

> Still doesnt work...So i wrote a test script demoing the bug:


I've grown to rather dislike the term "bug", it is used to refer to any
behaviour that is contrary to that expected, whether it is the result
of an error or not. But anyhow, thank you for posting a concise
example.

>
> window.onload = function() {
> var table = document.createElement("table");
> table.style.width = "200px";
> table.style.height = "200px";
> table.style.border = "1px solid black";
> var row = table.insertRow(-1);
> var td = row.insertCell(-1);
> td.onclick = myfunction;
> document.body.appendChild(table);
> }
>
> function myfunction(e) {
> alert(e);
> alert(window.event);
> }
>
> Any ideas why e is undefined?


It is undefined in IE because you haven't assigned a value to it (read
my previous post again). The function I posted was (comment removed):

function myfunction(e) {
var e = e || window.event;
alert(e);
}

Notice the difference? The line:

var e = e || window.event;

might be easier to understand as:

if ( typeof e != 'object' && typeof window.event == 'object') {
e = window.event;
} else {
e = undefined;
}

but the former is considerably shorter.


--
Rob

 
Reply With Quote
 
Jason
Guest
Posts: n/a
 
      10-11-2006
Yes but it seems window.event isn't getting set to the right thing.
Even if I do
function myfunction(e) {
var e = e || window.event;
alert(e);
alert(e.target);
}
e is just "[object]" and e.target is "undefined". I need to make
e.target give me the element I clicked on. How do I do this?

- Jason


RobG wrote:
> Jason wrote:
>
> Do not top-post, reply below a trimmed quote of the text you are
> replying to.
>
> > Still doesnt work...So i wrote a test script demoing the bug:

>
> I've grown to rather dislike the term "bug", it is used to refer to any
> behaviour that is contrary to that expected, whether it is the result
> of an error or not. But anyhow, thank you for posting a concise
> example.
>
> >
> > window.onload = function() {
> > var table = document.createElement("table");
> > table.style.width = "200px";
> > table.style.height = "200px";
> > table.style.border = "1px solid black";
> > var row = table.insertRow(-1);
> > var td = row.insertCell(-1);
> > td.onclick = myfunction;
> > document.body.appendChild(table);
> > }
> >
> > function myfunction(e) {
> > alert(e);
> > alert(window.event);
> > }
> >
> > Any ideas why e is undefined?

>
> It is undefined in IE because you haven't assigned a value to it (read
> my previous post again). The function I posted was (comment removed):
>
> function myfunction(e) {
> var e = e || window.event;
> alert(e);
> }
>
> Notice the difference? The line:
>
> var e = e || window.event;
>
> might be easier to understand as:
>
> if ( typeof e != 'object' && typeof window.event == 'object') {
> e = window.event;
> } else {
> e = undefined;
> }
>
> but the former is considerably shorter.
>
>
> --
> Rob


 
Reply With Quote
 
Jason
Guest
Posts: n/a
 
      10-11-2006
Ok I think I figured it out. In IE I have to call e.srcElement instead
of e.target. Also e gets printed as [object] in IE, while e gets
printed as [object MouseEvent], so I thought e wasn't getting set to
the right thing.

Thanks for everyone's help!
- Jason

Jason wrote:
> Yes but it seems window.event isn't getting set to the right thing.
> Even if I do
> function myfunction(e) {
> var e = e || window.event;
> alert(e);
> alert(e.target);
> }
> e is just "[object]" and e.target is "undefined". I need to make
> e.target give me the element I clicked on. How do I do this?
>
> - Jason
>
>
> RobG wrote:
> > Jason wrote:
> >
> > Do not top-post, reply below a trimmed quote of the text you are
> > replying to.
> >
> > > Still doesnt work...So i wrote a test script demoing the bug:

> >
> > I've grown to rather dislike the term "bug", it is used to refer to any
> > behaviour that is contrary to that expected, whether it is the result
> > of an error or not. But anyhow, thank you for posting a concise
> > example.
> >
> > >
> > > window.onload = function() {
> > > var table = document.createElement("table");
> > > table.style.width = "200px";
> > > table.style.height = "200px";
> > > table.style.border = "1px solid black";
> > > var row = table.insertRow(-1);
> > > var td = row.insertCell(-1);
> > > td.onclick = myfunction;
> > > document.body.appendChild(table);
> > > }
> > >
> > > function myfunction(e) {
> > > alert(e);
> > > alert(window.event);
> > > }
> > >
> > > Any ideas why e is undefined?

> >
> > It is undefined in IE because you haven't assigned a value to it (read
> > my previous post again). The function I posted was (comment removed):
> >
> > function myfunction(e) {
> > var e = e || window.event;
> > alert(e);
> > }
> >
> > Notice the difference? The line:
> >
> > var e = e || window.event;
> >
> > might be easier to understand as:
> >
> > if ( typeof e != 'object' && typeof window.event == 'object') {
> > e = window.event;
> > } else {
> > e = undefined;
> > }
> >
> > but the former is considerably shorter.
> >
> >
> > --
> > Rob


 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
setting Onclick and setting the ClientID in behind code isn't working in Mozilla davidr@sharpesoft.com ASP .Net 2 08-22-2006 09:30 PM
setting Onclick and setting the ClientID in behind code isn't working in Mozilla davidr@sharpesoft.com ASP .Net 0 08-21-2006 11:55 PM
GIVE ME FILM OR GIVE ME DEATH l#vfgsgEg@AO1.com DVD Video 4 07-14-2005 03:10 PM
Give us 3 minutes; we give you the whole library lib Computer Support 1 02-04-2005 03:16 AM
Give us 3 minutes; we give you the whole library lib Computer Support 0 01-27-2005 07:52 AM



Advertisments