My code to get Y position of anchor - always null?

Discussion in 'Javascript' started by axlq, Jun 14, 2006.

  1. axlq

    axlq Guest

    I wrote the function below to get the vertical scroll position of an
    anchor. That is, a URL of the form
    http://www.example.com/mypage.html#anchorname
    should scroll to the point on the page that has an anchor
    <a name="anchorname">...</a>).

    Doing this in Javascript is necessary in the presence of a dynamic
    HTML page having some hidden blocks. DHTML messes up the scroll
    position in Opera and Mozilla (but not IE) so I'm trying to fix
    it with javascript. Can anyone tell me why this function always
    returns zero? What am I doing wrong?

    =====================================
    function getAnchorYPos(s) { /* s = string name of anchor */
    /* get anchor object o */
    var o=null;
    if (document.getElementsByName && document.getElementsByName(s))
    o = document.getElementsByName(s);
    else if (document.all && document.all)
    o = document.all;
    else if (document.anchors && document.anchors.length
    && document.anchors[0].y) {
    for (var i=0; i<document.anchors.length; i++)
    if (document.anchors.name==s) o = document.anchors;
    }
    if (o==null) return null;

    /* get anchor object Y position */
    var ypos = 0;
    var offset_parent = null;
    offset_parent = o.offsetParent;
    var el = o;
    while (el.parentNode != null) {
    el = el.parentNode;
    if (el == offset_parent) {
    ypos += o.offsetTop;
    if (el.clientTop && el.nodeName != "TABLE") ypos += el.clientTop;
    o = el;
    if (o.offsetParent==null && o.offsetTop) ypos += o.offsetTop;
    offset_parent = o.offsetParent;
    }
    }
    return ypos;
    }

    var anchorname = document.location.hash.substr(1);
    ypos = getAnchorYPos(anchorname); // ALWAYS ZERO ?!
    =====================================

    What I've observed:

    1. The var anchorname has the correct value from the document URL.
    2. The object o gets set by getElementsByName(s), however ALL of
    the properties of o seem to be undefined after that.
    3. document.all is never null, but document.all has no properties.
    4. document.anchors is never null, but document.anchors[0] and
    document.anchors have no properties.
    2. Should I use getElementByID? document.getElementByID is never null,
    but document.getElementByID(s) is.

    What am I missing?

    -Alex
     
    axlq, Jun 14, 2006
    #1
    1. Advertising

  2. axlq

    RobG Guest

    axlq wrote:
    > I wrote the function below to get the vertical scroll position of an
    > anchor. That is, a URL of the form
    > http://www.example.com/mypage.html#anchorname
    > should scroll to the point on the page that has an anchor
    > <a name="anchorname">...</a>).
    >
    > Doing this in Javascript is necessary in the presence of a dynamic
    > HTML page having some hidden blocks. DHTML messes up the scroll
    > position in Opera and Mozilla (but not IE) so I'm trying to fix
    > it with javascript. Can anyone tell me why this function always
    > returns zero? What am I doing wrong?
    >
    > =====================================
    > function getAnchorYPos(s) { /* s = string name of anchor */
    > /* get anchor object o */
    > var o=null;
    > if (document.getElementsByName && document.getElementsByName(s))
    > o = document.getElementsByName(s);


    getElementsByName returns a collection, not a single element. Try:

    if ( document.getElementsByName
    && document.getElementsByName(s).length)
    o = document.getElementsByName(s)[0];

    which will set the value of 'o' as a reference to the first element in
    the collection (hopefully that's the one you want).

    Or give it an ID and use getElementById, which returns a reference to a
    single element.

    [...]

    I haven't tested the rest of your code...


    --
    Rob
     
    RobG, Jun 14, 2006
    #2
    1. Advertising

  3. axlq

    axlq Guest

    In article <>,
    RobG <> wrote:
    >getElementsByName returns a collection, not a single element. Try:
    >
    > if ( document.getElementsByName
    > && document.getElementsByName(s).length)
    > o = document.getElementsByName(s)[0];
    >
    >which will set the value of 'o' as a reference to the first element in
    >the collection (hopefully that's the one you want).


    Hmm... it returns null. And I know the argument (s) is the name of an
    element of the form <a name="FL" ...>, and s="FL";

    >Or give it an ID and use getElementById, which returns a reference to a
    >single element.


    Strange... that comes out null too, for <a name="FL" id="FL" ...>.
    Funny thing is, *other* code using getElementById on the exact same
    page (to hide a bunch of other elements in the un-expanded list)
    work just fime.

    -A
     
    axlq, Jun 15, 2006
    #3
  4. axlq

    axlq Guest

    In article <e6qnfr$eqk$>, axlq <> wrote:
    >In article <>,
    >RobG <> wrote:
    >>getElementsByName returns a collection, not a single element. Try:
    >>
    >> if ( document.getElementsByName
    >> && document.getElementsByName(s).length)
    >> o = document.getElementsByName(s)[0];
    >>
    >>which will set the value of 'o' as a reference to the first element in
    >>the collection (hopefully that's the one you want).

    >
    >Hmm... it returns null. And I know the argument (s) is the name of an
    >element of the form <a name="FL" ...>, and s="FL";
    >
    >>Or give it an ID and use getElementById, which returns a reference to a
    >>single element.


    Ignore my last message. That worked. I was testing for the wrong
    ID. Oddly, getElementsByName(s)[0] always returns null, when
    testing with an element name that I know exists. Anyway, I have it
    working now.

    Thanks!!

    -A
     
    axlq, Jun 15, 2006
    #4
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Kelvin
    Replies:
    1
    Views:
    3,288
    Kelvin
    Sep 13, 2003
  2. walala
    Replies:
    2
    Views:
    695
    Ken Smith
    Oct 11, 2003
  3. Replies:
    5
    Views:
    27,590
    Mike Schilling
    Mar 29, 2006
  4. Replies:
    0
    Views:
    629
  5. Erwin Moller
    Replies:
    1
    Views:
    650
    dorayme
    Jul 27, 2012
Loading...

Share This Page