supporting anchor links
See original GitHub issueUsing the default sheet-router/href module results in not being able to jump to anchor links when clicked or when first loading a page with a hash that’s meant to point to an anchor somewhere on the page.
Supporting anchor links might not be something we want to have in choo by default, but it would be nice to have docs for it somewhere.
This is also potentially a topic for sheet-router.
Here’s where I’m at currently with a solution that overrides the default href
behavior:
var choo = require('choo')
var el = choo.view
var app = choo()
app.model({
namespace: 'app',
subscriptions: [catchLinks]
})
function catchLinks (send) {
window.onclick = (e) => {
const node = (function traverse (node) {
if (!node) return
if (node.localName !== 'a') return traverse(node.parentNode)
if (node.href === undefined) return traverse(node.parentNode)
if (window.location.host !== node.host) return traverse(node.parentNode)
return node
})(e.target)
if (!node) return
e.preventDefault()
var href = node.href
if (location.pathname !== node.pathname) {
send('app:location', { location: href.replace(/#$/, '') })
window.history.pushState(null, null, href)
} else {
if (window.location.hash !== node.hash) {
window.location.hash = node.hash
}
scrollToHash(node.hash)
}
}
}
app.router(function (route) {
return [
route('/', home),
route('/example', example)
]
})
var tree = app.start({ href: false })
document.body.appendChild(tree)
function home (params, state, send) {
return el`
<main>
<h1>home</h1>
<a href="#home-anchor">home anchor link</a>
<p>some text</p><p>some text</p><p>some text</p><p>some text</p><p>some text</p><p>some text</p><p>some text</p><p>some text</p><p>some text</p><p>some text</p><p>some text</p>
<h2 id="home-anchor">home anchor target</h2>
<a href="/example#example-anchor">link to example anchor</a>
<p>some text</p><p>some text</p><p>some text</p><p>some text</p><p>some text</p><p>some text</p><p>some text</p><p>some text</p><p>some text</p><p>some text</p><p>some text</p><p>some text</p><p>some text</p><p>some text</p><p>some text</p><p>some text</p><p>some text</p><p>some text</p><p>some text</p><p>some text</p><p>some text</p>
</main>
`
}
function example (params, state, send) {
return el`
<main>
<h1>example page</h1>
<a href="#example-anchor">example anchor link</a>
<p>some text</p><p>some text</p><p>some text</p><p>some text</p><p>some text</p><p>some text</p><p>some text</p><p>some text</p><p>some text</p><p>some text</p><p>some text</p>
<h2 id="example-anchor">example anchor target</h2>
<a href="/#home-anchor">link to home anchor</a>
<p>some text</p><p>some text</p><p>some text</p><p>some text</p><p>some text</p><p>some text</p><p>some text</p><p>some text</p><p>some text</p><p>some text</p><p>some text</p><p>some text</p><p>some text</p><p>some text</p><p>some text</p><p>some text</p><p>some text</p><p>some text</p><p>some text</p><p>some text</p><p>some text</p>
</main>
`
}
function scrollToHash (hash) {
if (hash) {
var el = document.querySelector(hash)
window.scrollTo(0, el.offsetTop)
}
}
Issue Analytics
- State:
- Created 7 years ago
- Comments:11 (9 by maintainers)
Top Results From Across the Web
Tutorial: How to Add Anchor Links in Emails
Anchor links in email are incredibly useful for newsletters that are long and content-rich. They give your subscribers a chance to quickly ...
Read more >HTML Anchors: Here's How To Create Links For Fast ...
HTML Anchors: Here's How To Create Links For Fast Navigation ... The anchor element is used to create hyperlinks between a source anchor...
Read more >How to use anchor links in emails - Cantaloupe Digital
When done right, anchor links in email can simplify navigation and help lead the reader to the right content. Anchor links can be...
Read more >Insert and manage anchor links - Knowledge Base - HubSpot
Insert an anchor link · In the pop-up box, click the Link to dropdown menu and select Anchor on this page. · Click...
Read more >Why You Shouldn't Use Anchor Links In Your Emails
In an increasingly mobile world, anchor links are an outdated feature. Many email clients no longer support anchor links and anchor links, ...
Read more >Top Related Medium Post
No results found
Top Related StackOverflow Question
No results found
Troubleshoot Live Code
Lightrun enables developers to add logs, metrics and snapshots to live code - no restarts or redeploys required.
Start FreeTop Related Reddit Thread
No results found
Top Related Hackernoon Post
No results found
Top Related Tweet
No results found
Top Related Dev.to Post
No results found
Top Related Hashnode Post
No results found
Top GitHub Comments
Just had a discussion about this with @juliangruber, and we came up with the following for hash routing:
Inline anchor tags and hash routing cannot co-exist in the same application. You can choose one, but hash routing should be the default. This is chosen because
choo
is primarily intended for single page apps, and using hash routing is more in line with that.Hash routes should be explicit in the application. They’re enumerable, and dynamic hashing can be done through partials:
An option should be available to enable anchor tag routing, through:
{ anchors: true}
.Browser routing updates can be disabled as a whole through the existing option of
{ history: false }
- which is useful for widget-like situations.Thoughts? - should this proposal perhaps be a separate issue?
FWIW, this is a current need in my work. I’m getting around the limitation with
scrollIntoView
.I’ll try to find where the change belongs next I can. I gather this cuts across packages, and perhaps a few other checkboxes for 4.0.0.