2011-04-26 30 views
3

我有一个页面显示在TabContainer中的所有内容,但是如果在浏览器上禁用了JavaScript,它只会显示一个空白页面。Asp.Net - 检测页面上没有JavaScript? (更名标题)

我可以添加一个<noscript>来显示所有重要的内容,但空白的TabContainer仍然呈现。

我想在标题中添加一个重定向到相同的页面加上?noscript = true,但它不应该是无限的。我使用一个PlaceHolder控件,当当前的url没有noscript查询值时,它将放置合适的<META HTTP-EQUIV="Refresh" CONTENT="0; URL=url?noscript=true">

然后我可以设置可见属性为TabContainer当noscript查询值存在时为false。

这是正确的方式吗?

回答

0

那么,因为我是彻底的,不想复制代码,我创建了这个组件,它做了我的其他答案,再加上检查会话和视图状态以检测以前的情况。

组件的值是它可以在其他页面上使用,并且它将有权访问组件的其他页面上使用的相同会话/ 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>"); 
     } 
    } 
} 
} 
0

我想出了一个可行的方法,对Asp.Net来说还是很新的,所以我对别人的想法很感兴趣。

编辑我扩大的想法通过引入一个临时的(会话只)的cookie可以记住如果浏览器具有NoScript的,所以我们不必保持重定向到同一个页面,我们只是使用布尔值下一次请求页面时。

我这样做是在母版页的头:

<noscript> 
    <%# NoScriptPlaceHolder %> 
</noscript> 

在TabContainer的的Visible="<%# !NoJavascript %>"财产。

然后在代码隐藏:

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; 
    } 
} 

任何其他的想法?未来的想法:如果他们没有启用Cookies,我想一个实用程序将noscript查询值传递给每个请求也会有所帮助,否则他们将不断重定向到每个请求的同一页面。

1

您可以使用HttpBrowserCapabilitites类,以获取有关浏览器的信息,来检查JavaScript支持的属性被称为EcmaScriptVersion。如果版本大于等于1,则浏览器支持JavaScript。

+1

如果浏览器支持是不是一样的事情,如果JavaScript被用户禁用或我错了吗? – 2011-04-27 22:19:49

+0

是的,你的权利...对不起...如果你想隐藏JS关闭的东西,你可以设置属性显示:无;在CSS中默认隐藏它。然后在页面中,您可以执行一些JS来删除属性以使该元素可见。这将导致HTML呈现,但应该完全隐藏,除非启用JS。 – Zachary 2011-04-27 22:44:26

+0

这就是为什么我想出了这个组件。它允许我检测JS是否被禁用并采取相应措施。 – 2011-04-28 00:01:40

相关问题