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。

这样做对吗?

Asp.Net -检测页面上没有javascript ?(重命名标题)

你可以使用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>");
        }
    }
}
}