render() をフラグメント パラメータで使用して、ページの読み込み時にページの特定の部分に自動的にスクロールする方法はありますか? 呼び出す方法と同様に
redirect(controller: "book", action: "show", fragment: "profile")
render() をフラグメント パラメータで使用して、ページの読み込み時にページの特定の部分に自動的にスクロールする方法はありますか? 呼び出す方法と同様に
redirect(controller: "book", action: "show", fragment: "profile")
これを に渡すことはできませrender()
ん。実際に を呼び出すrender()
ときには、URL はすでに決定され、アクションにマップされているためです。render が行っているのは、応答に書き戻されるものを制御することだけです。
レンダリング コントローラ アクションが呼び出される前に、フラグメントがすでに URLに含まれている必要があります。次に例を示します。
grails-app/controllers/MyController.groovy
class MyController {
def foo = {
render(view: 'foo')
}
def quux = {
redirect(action: 'foo', fragment: 'baz')
}
}
grails-app/views/my/foo.gsp
<html>
<head>
<title>Foo</title>
</head>
<body>
<a id="bar">Bar</a>
<g:each in="${0..100}"><br/></g:each>
<a id="baz">Baz</a>
</body>
</html>
さまざまな URL を使用:
http://example.com/myapp/my/foo - doesn't scroll to an anchor
http://example.com/myapp/my/foo#baz - scrolls to the 'baz' anchor
http://example.com/myapp/my/quux - scrolls to the 'baz' anchor'
grails render 呼び出しでフラグメントを直接指定する方法はありませんが、私のコードでは、必要な機能のほとんどをわずかな複雑さで提供するように見える回避策を使用しています。トリックは、目的のフラグメント参照をモデルの一部として渡し、GSP ページでその参照に基づいて動作することです。したがって、コントローラーのレンダリング呼び出しは次のようになります。
def foo() {
render(view : 'foo', model:[fragment:'myFragment'])
}
次に、GSP で、次の Javascript を使用してモデルにアクセスします。
<g:javascript>
if ("${fragment}") {
window.location.href = "#${fragment}";
}
</g:javascript>
次に、GSP はブラウザに、ページ内の目的のアンカー (存在する場合) にジャンプするように指示します。