在Flex网页中恢复滚动位置

时间:2010-12-20 19:31:23

标签: flex actionscript-3

这是一个相当重要但被忽视的功能我想在一个网页上 - 在标准(非灵活)网页上,离开页面并通过后退或前进按钮返回到它并恢复滚动位置你以前在页面上。这是一个至关重要的功能,如果它不存在会变得非常烦人 - 每当你以前在长文本网站上向下滚动时,页面会自动返回到最顶层。我猜浏览器本身必须管理这个,因为我惊讶地发现即使删除cookie,缓存,基本上一切都不会摆脱保存的滚动位置。

所以问题是在灵活网页上这样做 - 正确的方法是什么。我一直在使用SHaredObject.getLocal,但是发现一旦创建了本地共享对象,它就永远不会被删除,用户无法在浏览器中删除它们(删除cookie等没有任何效果)。所以我在Macromedia子目录中有100个不同的共享对象,只存储滚动位置。即使使用标准网页,您也可以删除浏览历史记录,但是使用SharedObject时,除非您实际只是深入研究该文件子目录并手动删除它们(当然用户永远不会这样做),所以它们会存在,所以一个子问题就是,是否真的无法从浏览器中删除SharedObjects。 FLex甚至在他们的文档中调用SharedObjects“Flash cookies”,但是使用真正的cookie,用户可以删除它们。

1 个答案:

答案 0 :(得分:0)

我的解决方案是只为生成的所有URL生成一个SharedObject,并且此SHaredObject包含一个作为循环缓冲区运行的对象。此对象具有由URL索引的属性,每个属性指向该URL的会话信息(例如滚动位置等)。尚未测试以下内容,但这就是我所拥有的。如果在Flex中已经有内置的方法在本地SharedObject中执行循环缓冲区,我还没有找到它。

function createSessionInfo(url:String,info:Object):void {  

  var so_obj:SharedObject = null;
  try { 
    so_obj = SharedObject.getLocal("Session_Info","/");
  } catch (e:*) {}          
  if (!so_obj) return;

  if (so_obj.data.session == undefined)
    so_obj.data.session = new Object();

  var session:Object = so_obj.data.session;

  var date:Date = new Date();
  var max:int = 100;
  var first:String;
  var first_created:int=date.time;
  var cnt:int=0
  for (var p:String in session) {
    if (session[p].created < first_created) {
      first_created = session[p].created;  
      first = p;
    }
    if (++cnt == max) 
      delete session[first];
  }

  session[url] = new Object();
  session[url].created = date.time;
  session[url].info = info;

}