自定义控件实现广告内容后期加载,以及NamingContainer层次的应用
2007-08-05 13:49
615 查看
自定义控件:广告内容后期加载。以及NamingContainer层次的应用
网站上的广告内容可能会因加载过慢而导致整个网页加载过慢
我们可以考虑将广告内全部放在网页最底部,等整个页面加载完毕後
再采用javascript使其显示,考虑给控件一个TargetContainerID标识
控件广告内容将要被显示的容器ID,然后从控件自己所处的 开始向上查找该ID
所指定的控件,(我们只向上找而没有向下找,并且没有处理某层次的
子NamingContainer,所以不一定能够找到,这里没有考虑从Page对象向下递归查找
主要考虑为了提高性能),如果没有找到,则考虑给用户一个事件让用户自己处理TargetContainer
下面的自定义控件对此实现了封装:
//------------------------------------------------------------------------------
//
// Copyright (c) www.AspxBoy.com All rights reserved.
//
//------------------------------------------------------------------------------
namespace HBZ.Ads.Controls
{
using System;
using System.ComponentModel;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using HBZ.Ads;
using System.Collections.Generic;
using System.Text;
[Designer( typeof( HBZ.Ads.Controls.AdRotatorDesigner ) )]
public class AdRotator : WebControl
{
private Dictionary findControlHelperCacheList = new Dictionary( );
private readonly string scriptFormat = " var {0}_target = document.getElementById(\"{0}\"); var {1}_base = document.getElementById(\"{1}\"); if ({0}_target) {{ {0}_target.innerHTML = {1}_base.innerHTML; {1}_base.innerHTML = \"\"; }}";
private static readonly object eventObj = new object( );
public event FindTargetContainerEventHandler FindTargetContainer
{
add
{
Events.AddHandler( eventObj , value );
}
remove
{
Events.RemoveHandler( eventObj , value );
}
}
public AdRotator( )
: base( HtmlTextWriterTag.Span )
{
}
[TypeConverter( typeof( ValidatedControlConverter ) )]
[DefaultValue( "" ) , Category( "Data" ) , Description( "广告位后期加载后显示的位置的控件ID" )]
[IDReferenceProperty]
public string TargetContainerID
{
get
{
return (string)this.ViewState[ "TargetContainerID" ] ?? string.Empty;
}
set
{
this.ViewState[ "TargetContainerID" ] = value;
}
}
[Bindable( true ) , Category( "Data" ) , DefaultValue( "" ) , Description( "广告位的默认内容" )]
public string DefaultContent
{
get
{
return (string)this.ViewState[ "DefaultContent" ] ?? "广告位招租";
}
set
{
this.ViewState[ "DefaultContent" ] = value;
}
}
protected override void OnPreRender( EventArgs e )
{
base.OnPreRender( e );
if ( !string.IsNullOrEmpty( TargetContainerID ) )
{
this.Style.Add( HtmlTextWriterStyle.Display , "none" );
ClientScriptManager cs = Page.ClientScript;
if ( !cs.IsStartupScriptRegistered( this.ClientID ) )
{
cs.RegisterStartupScript( this.GetType( ) , this.ClientID , GetLazyLoadingScript( ) , true );
}
}
}
protected virtual string GetLazyLoadingScript( )
{
Control target = FindControlHelper( TargetContainerID );
if ( target == null )
{
throw new TargetContainerNotFoundException( );
}
StringBuilder sb = new StringBuilder( );
sb.AppendFormat( scriptFormat , target.ClientID , this.ClientID );
return sb.ToString( );
}
protected virtual void RenderAdvertisement( Advertisement ad , HtmlTextWriter writer )
{
// 广告内容
}
protected override void RenderContents( HtmlTextWriter writer )
{
// call RenderAdvertisement method
}
protected Control FindControlHelper( string id )
{
Control c = null;
if ( findControlHelperCacheList.ContainsKey( id ) )
{
c = findControlHelperCacheList[ id ];
}
else
{
c = base.FindControl( id ); // 注意:我们从自己开始向上沿NamingContainer层次查找
Control nc = NamingContainer;
while ( ( null == c ) && ( null != nc ) )
{
c = nc.FindControl( id );
nc = nc.NamingContainer;
}
if ( null == c )
{
// 因为我们是从自己开始向上沿NamingContainer层次查找,而没有向下找,
// 并且没有找每一层NamingContainer内的其他NamingContainer,
// 所以这种查找有可能出现没有找到id对应的控件
// 当没此时有找到时,激发FindTargetContainer事件交给用户自己设定Target Container Control
FindTargetContainerEventArgs args = new FindTargetContainerEventArgs( id );
OnFindTargetContainer( args );
c = args.Control;
}
if ( null != c )
{
findControlHelperCacheList[ id ] = c;
}
}
return c;
}
protected virtual void OnFindTargetContainer( FindTargetContainerEventArgs e )
{
FindTargetContainerEventHandler hander = Events[ eventObj ] as FindTargetContainerEventHandler;
if ( hander != null )
{
hander( this , e );
}
}
}
public delegate void FindTargetContainerEventHandler( object src , FindTargetContainerEventArgs e );
public class FindTargetContainerEventArgs : EventArgs
{
private string controlID;
private Control control;
public FindTargetContainerEventArgs( string controlId )
{
controlID = controlId;
}
public string ControlID
{
get
{
return controlID;
}
}
public Control Control
{
get
{
return control;
}
set
{
control = value;
}
}
}
public class TargetContainerNotFoundException : Exception
{
string exceptionMessage = string.Empty;
public TargetContainerNotFoundException( )
: this( "TargetContainerID所指定的控件没有找到!您或许应该处理一下FindTargetContainer事件" )
{
}
public TargetContainerNotFoundException( string message )
: base( message )
{
this.exceptionMessage = message;
}
public override string Message
{
get
{
if ( exceptionMessage != null )
{
return exceptionMessage;
}
return base.Message;
}
}
}
}
网站上的广告内容可能会因加载过慢而导致整个网页加载过慢
我们可以考虑将广告内全部放在网页最底部,等整个页面加载完毕後
再采用javascript使其显示,考虑给控件一个TargetContainerID标识
控件广告内容将要被显示的容器ID,然后从控件自己所处的 开始向上查找该ID
所指定的控件,(我们只向上找而没有向下找,并且没有处理某层次的
子NamingContainer,所以不一定能够找到,这里没有考虑从Page对象向下递归查找
主要考虑为了提高性能),如果没有找到,则考虑给用户一个事件让用户自己处理TargetContainer
下面的自定义控件对此实现了封装:
//------------------------------------------------------------------------------
//
// Copyright (c) www.AspxBoy.com All rights reserved.
//
//------------------------------------------------------------------------------
namespace HBZ.Ads.Controls
{
using System;
using System.ComponentModel;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using HBZ.Ads;
using System.Collections.Generic;
using System.Text;
[Designer( typeof( HBZ.Ads.Controls.AdRotatorDesigner ) )]
public class AdRotator : WebControl
{
private Dictionary findControlHelperCacheList = new Dictionary( );
private readonly string scriptFormat = " var {0}_target = document.getElementById(\"{0}\"); var {1}_base = document.getElementById(\"{1}\"); if ({0}_target) {{ {0}_target.innerHTML = {1}_base.innerHTML; {1}_base.innerHTML = \"\"; }}";
private static readonly object eventObj = new object( );
public event FindTargetContainerEventHandler FindTargetContainer
{
add
{
Events.AddHandler( eventObj , value );
}
remove
{
Events.RemoveHandler( eventObj , value );
}
}
public AdRotator( )
: base( HtmlTextWriterTag.Span )
{
}
[TypeConverter( typeof( ValidatedControlConverter ) )]
[DefaultValue( "" ) , Category( "Data" ) , Description( "广告位后期加载后显示的位置的控件ID" )]
[IDReferenceProperty]
public string TargetContainerID
{
get
{
return (string)this.ViewState[ "TargetContainerID" ] ?? string.Empty;
}
set
{
this.ViewState[ "TargetContainerID" ] = value;
}
}
[Bindable( true ) , Category( "Data" ) , DefaultValue( "" ) , Description( "广告位的默认内容" )]
public string DefaultContent
{
get
{
return (string)this.ViewState[ "DefaultContent" ] ?? "广告位招租";
}
set
{
this.ViewState[ "DefaultContent" ] = value;
}
}
protected override void OnPreRender( EventArgs e )
{
base.OnPreRender( e );
if ( !string.IsNullOrEmpty( TargetContainerID ) )
{
this.Style.Add( HtmlTextWriterStyle.Display , "none" );
ClientScriptManager cs = Page.ClientScript;
if ( !cs.IsStartupScriptRegistered( this.ClientID ) )
{
cs.RegisterStartupScript( this.GetType( ) , this.ClientID , GetLazyLoadingScript( ) , true );
}
}
}
protected virtual string GetLazyLoadingScript( )
{
Control target = FindControlHelper( TargetContainerID );
if ( target == null )
{
throw new TargetContainerNotFoundException( );
}
StringBuilder sb = new StringBuilder( );
sb.AppendFormat( scriptFormat , target.ClientID , this.ClientID );
return sb.ToString( );
}
protected virtual void RenderAdvertisement( Advertisement ad , HtmlTextWriter writer )
{
// 广告内容
}
protected override void RenderContents( HtmlTextWriter writer )
{
// call RenderAdvertisement method
}
protected Control FindControlHelper( string id )
{
Control c = null;
if ( findControlHelperCacheList.ContainsKey( id ) )
{
c = findControlHelperCacheList[ id ];
}
else
{
c = base.FindControl( id ); // 注意:我们从自己开始向上沿NamingContainer层次查找
Control nc = NamingContainer;
while ( ( null == c ) && ( null != nc ) )
{
c = nc.FindControl( id );
nc = nc.NamingContainer;
}
if ( null == c )
{
// 因为我们是从自己开始向上沿NamingContainer层次查找,而没有向下找,
// 并且没有找每一层NamingContainer内的其他NamingContainer,
// 所以这种查找有可能出现没有找到id对应的控件
// 当没此时有找到时,激发FindTargetContainer事件交给用户自己设定Target Container Control
FindTargetContainerEventArgs args = new FindTargetContainerEventArgs( id );
OnFindTargetContainer( args );
c = args.Control;
}
if ( null != c )
{
findControlHelperCacheList[ id ] = c;
}
}
return c;
}
protected virtual void OnFindTargetContainer( FindTargetContainerEventArgs e )
{
FindTargetContainerEventHandler hander = Events[ eventObj ] as FindTargetContainerEventHandler;
if ( hander != null )
{
hander( this , e );
}
}
}
public delegate void FindTargetContainerEventHandler( object src , FindTargetContainerEventArgs e );
public class FindTargetContainerEventArgs : EventArgs
{
private string controlID;
private Control control;
public FindTargetContainerEventArgs( string controlId )
{
controlID = controlId;
}
public string ControlID
{
get
{
return controlID;
}
}
public Control Control
{
get
{
return control;
}
set
{
control = value;
}
}
}
public class TargetContainerNotFoundException : Exception
{
string exceptionMessage = string.Empty;
public TargetContainerNotFoundException( )
: this( "TargetContainerID所指定的控件没有找到!您或许应该处理一下FindTargetContainer事件" )
{
}
public TargetContainerNotFoundException( string message )
: base( message )
{
this.exceptionMessage = message;
}
public override string Message
{
get
{
if ( exceptionMessage != null )
{
return exceptionMessage;
}
return base.Message;
}
}
}
}
相关文章推荐
- 自定义控件:广告内容后期加载。以及NamingContainer层次的应用
- 应用SAP PI实现SAP BW数据仓库对于第三方系统数据完美集成以及DELTA加载的分析
- android利用定时器实现应用开头加载图片或者静态广告的显示
- 使用Selenium+PhantomJS实现网页内容加载(包括网页后期Ajax出来的结果)
- 在Web微信应用中使用博客园RSS以及Quartz.NET实现博客文章内容的定期推送功能
- paip.gui控件tabs控件加载内容的原理以及easyui最佳实现
- paip.gui控件tabs控件加载内容的原理以及easyui最佳实现
- 自定义控件,Android实现图片加载进度提示
- 实现app上对csdn的文章列表上拉刷新下拉加载以及加入缓存文章列表的功能 (制作csdn app 四)
- UISearchDisplayController(iOS < 8.0)实例应用实现搜索功能和VC展示效果, 以及代理方法的介绍
- 懒加载,预加载实现以及对比
- Android 自定义控件实现广告页面倒计时,里利用handler实现循环操作
- Android实现加载富文本以及SpannableString、SpannableStringBuilder实现部分文字可以点击,更换颜色
- 通过viewSwitch实现加载进度条到内容显示的转场处理
- Glide结合Recyclerview(也适用于Listview)实现列表滑动的时候图片不加载,滑动停止的时候加载(已修正Listview部分以及排版)
- android 游戏之场景的实现以及拓展应用照片浏览器
- Unity如何实现网络通讯(三):观察者模式以及在网络模块的应用
- 在看官方的例子时候由一个grid实例,在每一行之前有个加号,展开可以显示内容,在实际应用中还是非常有用的,照搬例子的代码,发现老是提示对象不存在,查阅资料后发现是没有加载插件,这里和大家分享下Ext.grid.RowExpander插件的使用,
- Android串口设备的应用实现方案以及与WEB的交互
- jQuery实现的瀑布流效果, 向下滚动即时加载内容