Asp.Net - Обнаружить отсутствие JavaScript на странице?(переименовано название) - PullRequest
3 голосов
/ 26 апреля 2011

У меня есть страница, которая отображает все ее содержимое в TabContainer, но если в браузере отключен JavaScript, он просто отображает пустую страницу.

Я могу добавить <noscript> для отображения всего важного содержимого, но пустой TabContainer по-прежнему отображается.

Я бы хотел добавить в заголовок a для перенаправления на ту же страницу, плюс? Noscript = true, но оно не должно быть бесконечным. Я рассчитываю использовать элемент управления PlaceHolder, который поместит соответствующий <META HTTP-EQUIV="Refresh" CONTENT="0; URL=url?noscript=true">, когда текущий URL не имеет значения запроса noscript.

Затем я могу установить для свойства Visible значение false для TabContainer, когда присутствует значение запроса noscript.

Это правильный путь?

Ответы [ 3 ]

1 голос
/ 28 апреля 2011

Вы можете использовать HttpBrowserCapabilitites класс для получения информации о браузере, свойство для проверки поддержки JavaScript называется EcmaScriptVersion . Если у него версия> = 1, браузер поддерживает JavaScript.

0 голосов
/ 28 апреля 2011

Что ж, поскольку я тщательный и не хочу дублировать код, я создал этот компонент, который выполняет другой мой ответ, а также проверяет сеанс и viewstate для предыдущего обнаружения.

Значение компонента заключается в том, что он может использоваться на других страницах и будет иметь доступ к тому же значению сеанса / файла 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 голосов
/ 26 апреля 2011

Я придумала метод, который работает, все еще довольно новый для Asp.Net, поэтому мне интересно, что думают другие.

Редактировать : Я расширил эту идею, введя временный (только для сеанса) файл 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 каждому запросу также поможет, иначе они будут перенаправляться на одну и ту же страницу при каждом запросе.

...