Elliott has asked for the wisdom of the Perl Monks concerning the following question:

Wise Brethren,

I am creating HTML pages by reading templates from a file, running a few regexps to personalise the page and then printing.

In some of these templates, our designers have included <A NAME="fred"> tags. I would like to be able to jump to the anchors.

The only way I can think of reminds me of sledgehammers and nuts: write the resulting page to a temporary and then
print "Location: tempfile.html#fred\n\n";

Is there a better way?

Replies are listed 'Best First'.
•Re: Simulating internal anchors
by merlyn (Sage) on Dec 01, 2002 at 15:03 UTC
    What do you mean "I" in "I would like to be able to jump"?

    If you mean in the same page, you can certainly say:

    <a name="fred">About fred.</a> ... <a href="#fred">Back to fred.</a>
    If you mean something else, you should say so.

    -- Randal L. Schwartz, Perl hacker
    Be sure to read my standard disclaimer if this is a reply.

      I plead guilty to anthropomorphizing my code!

      What I mean is that I want the page to load and immediately scroll to a point half-way down - as if it had been called via http with an internal anchor on the end of the URL.

      My latest idea is to put some JavaScript at the bottom of the page thus:

      <script language="JavaScript"> <!-- self.location.href='#ANCHOR'; //--> </script>

      and use a regexp to replace "ANCHOR" with "fred".

      Early indications are that this works - but - urgh! - JavaScript... A Perlier solution is still sought!

        My first reaction: just don't do it. Who are you to say where to scroll my browser? I hate web sites that "take over the driving" from me.

        My second reaction: you can do it, at the cost of one redirect. You had the right idea. Print an external redirect that includes an anchor on the first hit, but include a flag so you don't keep looping. On the re-fetch from the browser, generate the appropriate stuff, and put the anchor in the right place.

        But please, just don't do it.

        -- Randal L. Schwartz, Perl hacker
        Be sure to read my standard disclaimer if this is a reply.

Re: Simulating internal anchors
by Elliott (Pilgrim) on Dec 01, 2002 at 10:14 UTC
    I've just found this which seems to suggest it cannot be done (as I strongly suspect). But I'm still not 100% sure.
Re: Simulating internal anchors
by mt2k (Hermit) on Dec 02, 2002 at 00:46 UTC

    In order to be nice to the user and not controlling their navigation for them (ie: forcing somebody to go somewhere they do not wish to be placed), how about the following solution:

    First of all, do not use javascript. That's just asking for problems and possibly death by thrown stones from your users. Second, yes you could do as you have proposed with the temporary file, but you are still forcing the user to move, which may (and most likely will) upset certain people. I propose a modified version of your idea. Rather than redirecting the user to the anchor in the page, redirect them to the page... with no anchor. Create the temporary file with a type of Table of Contents/Index at the top of the file, composed of the anchors on the page. That way the user is in control!

    IMO, anchors were created for table of contents and linking between related subjects within a page. Thus, anchors should never be forced upon your users: provide a table of contents/index and then the user can use this or just scroll through the page :)

      The reason I want to scroll them to a specific place in the file is because that is where they have asked to go!

      Having said that, I think I will probably go with mt2k's suggestion, being the least risky, intrusive and time-consuming. The cost is potentially irritating users by making them choose their destination a second time.

        Aha! I have a better idea - one that gets the desired result and won't upset Merlin, should he ever visit...

        I will break the template file into chunks and re-arrange the order before serving them - so the requested chunk is near the top of the page.