• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 600
  • Last Modified:

netscape sees DOM tree different from IE

I have a page that has a form that has a value that I need to read. Using DOM, I am able to traverse to the node and retrieve the value in Netscape only. Here is the code:

var howMany = document.forms["vw-form"].lastChild.previousSibling.firstChild.nextSibling.nextSibling.getAttribute("value");

That retrieves the second <input> after the <form>

Here is the code snippet of what it is looking at:

<form name=vw-form method=post action="http://order.store.yahoo.com/cgi-bin/wg-order?unique=1b8f4&catalog=gpsexplorer&et=3fb1bffc&basket=5Ccfe188d8011db33fb1b8d774d9dd2e188d88771384443a365f21eb09f06deef">
<input type=hidden name=vwcatalog value=gpsexplorer>
<input type=hidden name=vwnitems value=3>
<input type=hidden name=vwtotal value=774.85>
<input type=hidden name=basket value=5Ccfe188d8011db33fb1b8d774d9dd2e188d88771384443a365f21eb09f06deef>
<input type=hidden name=et value=3fb33f94>
<input type=hidden name=vwentropy value=1068611828>


<table width="100%" border=0 bgcolor=ffffff cellpadding=10 cellspacing=0><tr><td><font size=2 face=arial color=000000></font></td></tr><tr><td><font size=2 face=arial color=000000><table cellpadding=0 cellspacing=0 border=0 width="100%" bgcolor=CECFCE>
<tr><td><font size=2 face=arial color=000000><table cellpadding=6 cellspacing=1 border=0 width="100%">
<tr bgcolor=cecfce><td colspan=4><font size=2 face=arial color=000000><b>Your Shopping Cart</b></font></font></td></tr>
<tr bgcolor=eeeeee><td align=center nowrap width="43%"><font size=2 ......


and it goes on from there. I am getting the error "Object Required" from IE. Any ideas?


0
dontera
Asked:
dontera
  • 2
  • 2
1 Solution
 
donteraAuthor Commented:
I have found a solution, but it is ugly. Does anyone have a better way?

if (document.all){
var howMany = document.getElementsByTagName("form")[1].firstChild.nextSibling.nextSibling.getAttribute("value");
}
else {
var howMany = document.forms["vw-form"].lastChild.previousSibling.firstChild.nextSibling.nextSibling.getAttribute("value");
0
 
ZontarCommented:
This is because Netscape includes whitespace and linefeeds in the source code as textNodes. MSIE ignores them. (According to the specs, Netscape is doing it correctly, sorry. ;) )

There are two possible solutions:

1. Test the node type before using the node. (This can become very tedious very quickly.)

2. Avoid the node-related methods where possible and use element-related ones instead.

var howMany = document.getElementsByName("vw-form")[0].getElementsByTagName("input")[1].getAttribute("value");

This will return the value in the vwnitems field. (That *is* the one you wanted, right...?)

However, there's nothing wrong with using the old-fashioned form element references with forms, either:

var howMany = document.forms["vw-form"].vwnitems.value;

A couple of tips that will make scripting much simpler:

1. Give each element you want to work with a unique id. Then you can access it directly with the document.getElementById() method.

2. Don't use any special characters except the underscore in name or id attributes. (Note -- HTML lets you use practically any characters in name attributes, but only letters, digits, and the underscore are legal in id attributes.) Case in point -- because you have a dash in "vw-form", you must use

var howMany = document.forms["vw-form"].vwnitems.value;

because "vw-form" isn't a legal JavaScript identifier. If you'd named it "vw_form" or "vwform" you could have just used

var howMany = document.vw_form.vwnitems.value;

or

var howMany = document.vwform.vwnitems.value;

and saved a little more typing.
0
 
VincentPugliaCommented:
Hi,

  I agree with Zontar in that you should never use a hyphen within a variable/attribute name.

  You could also always simply loop through form and identify the element you are looking for (after changing the form name to 'vwForm':

formObj = document.vwForm;
for (var i = 0; i < formObj.length; i++)
{
  el = formObj.elements[i];
  if (el.name == "vwnitems")  howMany = el.value;
}

or, if you know which element you are searching for:

howMany = formObj.elements[1].value;

remember: javascript begins counting with 0, so the second element has an index of 1

Vinny
0
 
ZontarCommented:
If you do want or need to use node/sibling references, you can do stuff like this:

HTML:

<h1 id="myH1"></h1>

<div></div>

<!-- comment ... in DOM, a CommentNode object -->
<p></p>

<!-- etc. ... -->

JS:

var h1 = document.getElementById("myH1");
var p = h1;

while(p.nodeName.toLowerCase() != "p") //  keep checking the next node until you find the p element node
  p = p.nextSibling;                                  //  use toLowerCase() for compatibility with both HTML and XHTML doctypes...

//  do stuff with p...


nodeName values:
--------------------
text node -->> #text
comment node -->> #comment
element node -->> same as tagName
0
 
donteraAuthor Commented:
Thank you very much for the advice all. One thing I should have noted, I cannot change the form code at all (it is produced by Yahoo's shopping cart cgi which, for obvious reasons, is safely tucked away). IF they have only not included teh hyphen all of this would have been Much easier..

Thanks again..
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

Join & Write a Comment

Featured Post

Free Tool: Path Explorer

An intuitive utility to help find the CSS path to UI elements on a webpage. These paths are used frequently in a variety of front-end development and QA automation tasks.

One of a set of tools we're offering as a way of saying thank you for being a part of the community.

  • 2
  • 2
Tackle projects and never again get stuck behind a technical roadblock.
Join Now