作者
scottwater
原文地址: http://scottwater.com/articles/ScrollPage
感谢 scottwater先生!
我做了一点修改,使其支持横向滚动条位置的记忆
原文地址: http://scottwater.com/articles/ScrollPage
感谢 scottwater先生!
我做了一点修改,使其支持横向滚动条位置的记忆
Disclaimer
#region Disclaimer
/**//**********************************************************************
Based on presentation by Brad McCabe of Infragistics
Updated by Scott Watermasysk (http://scottwater.com)
Provided as is, with no warrenty, etc.
Please use however you see fit. Just don't ask for a VB version :)
***********************************************************************/
#endregion
using System;
using System.IO;
using System.Text;
using System.Text.RegularExpressions;
using System.Web.UI;
namespace ShangGu.XaTaxi.Components
{
/**//// <summary>
/// Summary description for ScrollPage.
/// </summary>
public class ScrollPage : System.Web.UI.Page
{
public ScrollPage()
{
}
private bool _useScrollPersistence = true;
/**//// <summary>
/// There could be PostBack senarios where we do not want to remember the scroll position. Set this property to false
/// if you would like the page to forget the current scroll position
/// </summary>
public bool UseScrollPersistence
{
get {return this._useScrollPersistence;}
set {this._useScrollPersistence = value;}
}
private string _bodyID;
/**//// <summary>
/// Some pages might already have the ID attribute set for the body tag. Setting this property will not render the ID or change
/// the existing value. It will simply update the javascript written out to the browser.
/// </summary>
public string BodyID
{
get {return this._bodyID;}
set {this._bodyID = value;}
}
//Last chance. Do we want to maintain the current scroll position
protected override void OnPreRender(EventArgs e)
{
if(UseScrollPersistence)
{
RetainScrollPosition();
}
base.OnPreRender (e);
}
protected override void Render(HtmlTextWriter writer)
{
//No need processing the HTML if the user does not want to maintain scroll position or already has
//set the body ID value
if(UseScrollPersistence)
{
TextWriter tempWriter = new StringWriter();
base.Render(new HtmlTextWriter(tempWriter));
if(BodyID == null)
{
writer.Write(Regex.Replace(tempWriter.ToString(),"<body","<body id="thebody" ",RegexOptions.IgnoreCase));
}
//=++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//
//2004-9-16 武眉博 修正了因BodyID不空时造成javascript错误的bug
//
//=++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
else
{
writer.Write(Regex.Replace(tempWriter.ToString(),"<body","<body id=""+BodyID+"" ",RegexOptions.IgnoreCase));
}
}
else
{
base.Render(writer);
}
}
//=++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//
//2004-9-20 武眉博 增加了隐藏文本域"__SCROLLPOS_LEFT",以增加对横向滚动条位置的记忆功能
//
//=++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
private static string saveScrollPosition = "<script language='javascript'>function saveScrollPosition() {{document.forms[0].__SCROLLPOS_TOP.value = {0}.scrollTop;document.forms[0].__SCROLLPOS_LEFT.value = {0}.scrollLeft ;}}{0}.οnscrοll=saveScrollPosition;</script>";
private static string setScrollPosition = "<script language='javascript'>function setScrollPosition() {{{0}.scrollTop ="{1}"; {0}.scrollLeft ="{2}"}}{0}.οnlοad=setScrollPosition;</script>";
//Write out javascript and hidden field
private void RetainScrollPosition()
{
RegisterHiddenField("__SCROLLPOS_TOP", "0");
RegisterHiddenField("__SCROLLPOS_LEFT", "0");
string __bodyID = BodyID == null ? "thebody" : BodyID;
RegisterStartupScript("saveScroll", string.Format(saveScrollPosition,__bodyID));
if(Page.IsPostBack)
{
RegisterStartupScript("setScroll", string.Format(setScrollPosition,__bodyID, Request.Form["__SCROLLPOS_TOP"],Request.Form["__SCROLLPOS_LEFT"]));
}
}
}
}
/**//**********************************************************************
Based on presentation by Brad McCabe of Infragistics
Updated by Scott Watermasysk (http://scottwater.com)
Provided as is, with no warrenty, etc.
Please use however you see fit. Just don't ask for a VB version :)
***********************************************************************/
#endregion
using System;
using System.IO;
using System.Text;
using System.Text.RegularExpressions;
using System.Web.UI;
namespace ShangGu.XaTaxi.Components
{
/**//// <summary>
/// Summary description for ScrollPage.
/// </summary>
public class ScrollPage : System.Web.UI.Page
{
public ScrollPage()
{
}
private bool _useScrollPersistence = true;
/**//// <summary>
/// There could be PostBack senarios where we do not want to remember the scroll position. Set this property to false
/// if you would like the page to forget the current scroll position
/// </summary>
public bool UseScrollPersistence
{
get {return this._useScrollPersistence;}
set {this._useScrollPersistence = value;}
}
private string _bodyID;
/**//// <summary>
/// Some pages might already have the ID attribute set for the body tag. Setting this property will not render the ID or change
/// the existing value. It will simply update the javascript written out to the browser.
/// </summary>
public string BodyID
{
get {return this._bodyID;}
set {this._bodyID = value;}
}
//Last chance. Do we want to maintain the current scroll position
protected override void OnPreRender(EventArgs e)
{
if(UseScrollPersistence)
{
RetainScrollPosition();
}
base.OnPreRender (e);
}
protected override void Render(HtmlTextWriter writer)
{
//No need processing the HTML if the user does not want to maintain scroll position or already has
//set the body ID value
if(UseScrollPersistence)
{
TextWriter tempWriter = new StringWriter();
base.Render(new HtmlTextWriter(tempWriter));
if(BodyID == null)
{
writer.Write(Regex.Replace(tempWriter.ToString(),"<body","<body id="thebody" ",RegexOptions.IgnoreCase));
}
//=++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//
//2004-9-16 武眉博 修正了因BodyID不空时造成javascript错误的bug
//
//=++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
else
{
writer.Write(Regex.Replace(tempWriter.ToString(),"<body","<body id=""+BodyID+"" ",RegexOptions.IgnoreCase));
}
}
else
{
base.Render(writer);
}
}
//=++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//
//2004-9-20 武眉博 增加了隐藏文本域"__SCROLLPOS_LEFT",以增加对横向滚动条位置的记忆功能
//
//=++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
private static string saveScrollPosition = "<script language='javascript'>function saveScrollPosition() {{document.forms[0].__SCROLLPOS_TOP.value = {0}.scrollTop;document.forms[0].__SCROLLPOS_LEFT.value = {0}.scrollLeft ;}}{0}.οnscrοll=saveScrollPosition;</script>";
private static string setScrollPosition = "<script language='javascript'>function setScrollPosition() {{{0}.scrollTop ="{1}"; {0}.scrollLeft ="{2}"}}{0}.οnlοad=setScrollPosition;</script>";
//Write out javascript and hidden field
private void RetainScrollPosition()
{
RegisterHiddenField("__SCROLLPOS_TOP", "0");
RegisterHiddenField("__SCROLLPOS_LEFT", "0");
string __bodyID = BodyID == null ? "thebody" : BodyID;
RegisterStartupScript("saveScroll", string.Format(saveScrollPosition,__bodyID));
if(Page.IsPostBack)
{
RegisterStartupScript("setScroll", string.Format(setScrollPosition,__bodyID, Request.Form["__SCROLLPOS_TOP"],Request.Form["__SCROLLPOS_LEFT"]));
}
}
}
}