Asp.Net -检测页面上没有javascript ?(重命名标题)
本文关键字:javascript 重命名 标题 Net 检测 Asp | 更新日期: 2023-09-27 17:52:49
我有一个页面,在TabContainer中显示其所有内容,但如果javascript在浏览器上被禁用,它只显示一个空白页面。
我可以添加一个<noscript>
来显示所有重要的内容,但是空白的TabContainer仍然呈现。
我想在标题中添加一个重定向到同一页面加上?noscript=true,但它不应该是无限的。我想使用PlaceHolder控件,当当前url没有noscript查询值时,将放置适当的<META HTTP-EQUIV="Refresh" CONTENT="0; URL=url?noscript=true">
。
当noscript查询值存在时,我可以将TabContainer的Visible属性设置为false。
这样做对吗?
你可以使用httpbrowsercapabilities类来获取有关浏览器的信息,检查JavaScript支持的属性称为EcmaScriptVersion。如果它的版本>= 1,则浏览器支持JavaScript
我想出了一个方法,工作,仍然是相当新的Asp。所以我对别人的看法很感兴趣。
Edit: 我通过引入一个临时(仅会话)cookie来扩展这个想法,该cookie可以记住浏览器是否有NoScript,因此我们不必一直重定向到同一页面,我们只需在下次请求页面时使用该bool值
我在母版页的头部做了这个:
<noscript>
<%# NoScriptPlaceHolder %>
</noscript>
在TabContainer的Visible="<%# !NoJavascript %>"
属性中
在CodeBehind:
protected bool NoJavascript
{
get
{
TempCookie cookie = new TempCookie(); // session only cookie
if (cookie.NoJavascript) return true;
bool noJavascript = !string.IsNullOrEmpty(Request["noscript"]);
if (noJavascript)
cookie.NoJavascript = noJavascript;
return noJavascript;
}
}
protected string NoScriptPlaceHolder
{
get
{
if (NoJavascript)
return string.Empty;
string url = Request.Url.ToString();
string adv = "?";
if (url.Contains('?'))
adv = "&";
string meta = string.Format("<META HTTP-EQUIV='"Refresh'" CONTENT='"0; URL={0}{1}noscript=true'">",
url, adv);
return meta;
}
}
还有其他想法吗?
未来的想法:如果他们没有启用cookie,我想一个实用程序来传递noscript查询值给每个请求也会有所帮助,否则他们会在每个请求上不断地被重定向到相同的页面
好吧,因为我是彻底的,不想重复的代码,我创建了这个组件,我的其他答案,并检查会话和视图状态为先前的检测。
组件的值是它可以在其他页面上使用,并且它将访问与该组件在其他页面上使用的相同的会话/cookie值。
有什么改进的建议吗?
using System;
using System.ComponentModel;
using System.Linq;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace AspNetLib.Controls
{
/*
* This component should be placed in the <head> html tag and not in the body or form.
*/
[DefaultProperty("Noscript")]
[ToolboxData("<{0}:NoJavascript runat=server />")]
public class NoJavascript : WebControl
{
HttpRequest Request = HttpContext.Current.Request;
HttpSessionState Session = HttpContext.Current.Session;
HttpResponse Response = HttpContext.Current.Response;
[Bindable(true)]
[Category("Appearance")]
[DefaultValue(false)]
[Localizable(true)]
public bool Noscript
{
get
{
bool noscript;
// check if we've detected no script before
try
{
noscript = Convert.ToBoolean(Session["js:noscript"] ?? false);
if (noscript) return true;
}
catch { } // if session disabled, catch its error
HttpCookie Cookie = Request.Cookies["JavascriptDetectionComponent"];
if (null != Cookie)
{
noscript = !string.IsNullOrEmpty(Cookie["js:noscript"]);
if (noscript) return true;
}
noscript = Convert.ToBoolean(ViewState["js:noscript"] ?? false);
if (noscript) return true;
// if we've returned from meta evaluate noscript query setting
noscript = !string.IsNullOrEmpty(Request["noscript"]);
if (noscript)
{
SetNoScript();
return true;
}
return false;
}
}
[Bindable(true)]
[Category("Misc")]
[DefaultValue("")]
[Localizable(true)]
public string CookieDomain
{
get { return Convert.ToString(ViewState["CookieDomain"] ?? string.Empty); }
set { ViewState["CookieDomain"] = value; }
}
private void SetNoScript()
{
try { Session["js:noscript"] = true; }
catch { }// if session disabled, catch its error
ViewState["js:noscript"] = true;
HttpCookie Cookie = new HttpCookie("JavascriptDetectionComponent");
if (!string.IsNullOrEmpty(CookieDomain))
Cookie.Domain = CookieDomain;
Cookie["js:noscript"] = "true";
Response.Cookies.Add(Cookie);
}
protected override void RenderContents(HtmlTextWriter output)
{
if (!Noscript)
{
string url = Request.Url.ToString();
string adv = "?";
if (url.Contains('?'))
adv = "&";
string meta = string.Format("<META HTTP-EQUIV='"Refresh'" CONTENT='"0; URL={0}{1}noscript=true'">",
url, adv);
output.WriteLine("<noscript>");
output.WriteLine(" " + meta);
output.WriteLine("</noscript>");
}
}
}
}