После статьи «Защита email с помощью Javascript и ASP.NET »
решил написать полноценный серверный WebControl, позволяющий автоматизированно защищать адреса электронной почты на странице. Использовать его очень просто:
<pb:AntiSpamControl Email="myemail@gmail.com" runat="server"/>
В результате, получим email: myemail@gmail.com, сконструированный с помощью JavaScript. Результирующая html-страница будет содержать в разметке тэг anchor, наподобие следующего:
‹a id="ctl02" id="ctl02"›‹/a›
и код JavaScript в конце страницы
‹script type="text/javascript"›
//‹![CDATA[
(function(id){
var v12='l.',v16='m',v10='ai',v8='gm',v4='ai',v2='em',v0='my',v6='l@',v14='co',result=v0+v2+v4+v6+v8+v10+v12+v14+v16;
document.getElementById(id).href = 'mailto:' + result;
document.getElementById(id).innerHTML = result;
})('ctl02');
//]]›
‹/script›
Исходный код контрола:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI.WebControls;
using System.Text;
namespace ProgBlog.Controls
{
public class AntiSpamControl : WebControl
{
public string Email { get; set; }
public AntiSpamControl()
{
}
public override void RenderBeginTag(System.Web.UI.HtmlTextWriter writer)
{
}
public override void RenderEndTag(System.Web.UI.HtmlTextWriter writer)
{
}
static readonly Random _random = new Random();
protected override void OnLoad(EventArgs e)
{
if (Email == null)
throw new ArgumentNullException("Email");
if (Email.Length == 0)
throw new ArgumentException("Email is empty");
StringBuilder sb = new StringBuilder();
var vars = string.Empty;
List‹string› arr = new List‹string›(Email.Length);
for (int i = 0; i ‹= Email.Length; i += 2)
{
var _var = "v" + i;
arr.Add(_var + "='" + Email.Substring(i, (i + 2 ‹ Email.Length ? 2 : Email.Length - i)) + "'");
vars += (vars == string.Empty ? "" : "+") + _var;
}
for (int i = 0; i ‹ arr.Count; i++)
{
var index = _random.Next(arr.Count);
var item = arr[index];
arr.RemoveAt(index);
arr.Insert(0, item);
}
sb.AppendLine("(function(id){");
sb.AppendLine("var " + string.Join(",", arr.ToArray()) + ",result=" + vars + ";");
sb.AppendLine("document.getElementById(id).href = 'mailto:' + result;");
sb.AppendLine("document.getElementById(id).innerHTML = result;");
sb.AppendLine("})('" + ClientID + "');");
if (!this.Page.ClientScript.IsStartupScriptRegistered(this.ClientID.ToString()))
this.Page.ClientScript.RegisterStartupScript(this.Page.GetType(), this.ClientID.ToString(),
sb.ToString(), true);
}
protected override void RenderContents(System.Web.UI.HtmlTextWriter writer)
{
this.AddAttributesToRender(writer);
writer.AddAttribute(System.Web.UI.HtmlTextWriterAttribute.Id, this.ClientID);
writer.RenderBeginTag(System.Web.UI.HtmlTextWriterTag.A);
writer.RenderEndTag();
}
}
}
Скачать проект (19 кб.)