我正在开发一个 Joomla 组件,在 de 管理员部分有一个(非常常见的)网格视图。当我单击网格中某个项目的发布图标时,页面将重新加载,并且发布状态将更改为已发布/未发布。但是在重新加载页面后,我希望网格滚动到我单击发布图标时所处的滚动位置,这样我就可以看到我刚刚更改的项目。
我试图实现滚动位置的存储和恢复几乎完全类似于在页面加载之间存储/恢复搜索过滤器的方式:
1)在模板(views/mygrid/tmpl/default.php)中,我添加了一个隐藏字段:
<input type="hidden" name="page_scroll" value="0" id="page_scroll" />
2)在同一个文件中,我在表单的 onsubmit 属性中添加了一些代码来填充此字段:
<form id="adminForm" name="adminForm" method="post" onsubmit="document.getElementById('page_scroll').value = window.pageYOffset;">
3)在模型(models/mygrid.php,类从 JModelList 扩展)中,我将这些行添加到 populateState 函数中:
protected function populateState($ordering = null, $direction = null) {
..
$pageScroll = $app->getUserStateFromRequest( $this->context.'.page.scroll', 'page_scroll', '0', 'string');
$this->setState( 'page.scroll', $pageScroll );
..
}
4)在视图(views/mygrid/view.html.php,从JView扩展的类)中我在显示函数中添加了这一行:
function display($tpl = null) {
..
$this->state = $this->get('State');
..
}
5)最后,回到模板(views/mygrid/tmpl/default.php),我在文件末尾添加了这个小脚本:
<script type="text/javascript">
window.scrollTo( 0, <?php echo $this->state->get('page.scroll') ?> );
</script>
它对我来说看起来如此漂亮、干净和正确,但它只是拒绝工作。当我将以下调试行添加到最后一个脚本时,它总是给我 0:
alert( <?php echo $this->state->get('page.scroll') ?> );
有人可以告诉我我忽略了什么吗?我将不胜感激!