eval() problem for dynamic object referencing

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • Simon

    eval() problem for dynamic object referencing

    Am using the following code.

    <script language="JavaS cript1.2">

    function setquantity(pro ductindex,produ ctquantity)
    {
    //create the reference object
    irefname_none = eval("document. " + productindex + "none");

    <snip>

    and set quantity is called as follows further on in the HTML

    <snip>

    <td><img style="filter:a lpha(opacity=20 );-moz-opacity:0.2"
    name="1_none" src="none.gif" onclick="setqua ntity('1','none ')" /></td>

    <snip>

    when I run this, the javascript console shows me an error as follows

    Error Missing ; before statement
    Line 9
    document.1none

    Line 9 is the eval line. As a test, if I remove the productindex from
    the eval statement it works fine, so doesn't seem to like
    productindex, despite a string being passed.

    Any suggestions appreciated. Testing and developing this on Mozilla
    1.2.1, Linux

    Regards
    Simon
  • Lee

    #2
    Re: eval() problem for dynamic object referencing

    Simon said:[color=blue]
    >
    >Am using the following code.
    >
    ><script language="JavaS cript1.2">
    >
    >function setquantity(pro ductindex,produ ctquantity)
    >{
    > //create the reference object
    > irefname_none = eval("document. " + productindex + "none");[/color]

    This is one reason why you should never use eval() for
    dynamic object referencing. Others include the fact
    that it is very inefficient.

    If you're referencing images, you could use:

    irefname_none=d ocument.images[productindex+"n one"];

    but the more general solution would be to use an ID
    instead of NAME attribute, and use:

    irefname_none=d ocument.getElem entById(product index+"none");

    Comment

    • Lasse Reichstein Nielsen

      #3
      Re: eval() problem for dynamic object referencing

      simon_glynn@ema il.com (Simon) writes:

      Yes, using eval for dynamic object referencing *is* a problem, so
      don't do it! :)
      [color=blue]
      > Am using the following code.
      >
      > <script language="JavaS cript1.2">[/color]

      In HTML 4, the type attribute is required. The following is the correct,
      sufficient and recommended script start tag:

      <script type="text/javascript">

      Are you aware of the differences between Javascript versions 1.2 and
      1.3 and which browsers change behavior (to the deprecated 1.2
      behavior) because of your language attribute?

      I know the differences, but not which browsers honors the version
      number in the language attribute and implements 1.2 behavior.
      You most likely don't want to use Javascript 1.2.
      [color=blue]
      > function setquantity(pro ductindex,produ ctquantity)
      > {
      > //create the reference object
      > irefname_none = eval("document. " + productindex + "none");[/color]

      irefnam_none = document[productindex+"n one"];

      No eval, no problem.
      Are you sure the object you are looking for is a property of the
      document object, and that it has a name like "1none"?

      Your problem is probably that you use the dot-notation with a property
      name that is not a legal identifier. I.e.,
      document.1none
      is illegal since "1none" is not a legal identifer name. You must use
      document["1none"]
      for that kind of property names.

      You probably mean to use
      irefname_none = document.getEle mentById(produc tindex+"_none") :
      instead.
      [color=blue]
      > and set quantity is called as follows further on in the HTML
      >
      > <snip>
      >
      > <td><img style="filter:a lpha(opacity=20 );-moz-opacity:0.2"
      > name="1_none" src="none.gif" onclick="setqua ntity('1','none ')" /></td>[/color]

      This call to setquantity would make
      irefname_none = document["1none"]
      If you want to refer to this image itself, a better line would be

      irefname_none = document.images[productindex+"_ none"];
      Or better yet, just send the element itself as an argument:
      onclick="setqua ntity(this,'non e')"
      Then you have the image element readily available as the first argument,
      and you don't need to go through
      [color=blue]
      > when I run this, the javascript console shows me an error as follows
      >
      > Error Missing ; before statement
      > Line 9
      > document.1none[/color]

      Yes, a property called "1none" is not accessible using the dot-notation,
      you must use square brackets.
      [color=blue]
      > Any suggestions appreciated. Testing and developing this on Mozilla
      > 1.2.1, Linux[/color]

      Drop eval completely. Use names that start with a letter instead of a
      number. Use W3C DOM functions or collections to access elements
      (document.getEl ementById or document.images ).

      /L
      --
      Lasse Reichstein Nielsen - lrn@hotpop.com
      DHTML Death Colors: <URL:http://www.infimum.dk/HTML/rasterTriangleD OM.html>
      'Faith without judgement merely degrades the spirit divine.'

      Comment

      Working...