是否有与<noscript>相反的HTML?


106

HTML中是否有一个标记,仅在启用JavaScript的情况下才会显示其内容?我知道<noscript>工作方式相反,当JavaScript关闭时会显示其HTML内容。但是,我只想在有JavaScript的情况下在网站上显示表单,告诉他们为什么没有表单就不能使用表单。

我知道如何执行此操作的唯一方法是使用document.write();script标记中的方法,对于大量HTML来说似乎有些混乱。

Answers:


56

您可能有一个不可见的div,它会在页面加载时通过JavaScript显示。


217

我想到的最简单的方法:

<html>
<head>
    <noscript><style> .jsonly { display: none } </style></noscript>
</head>

<body>
    <p class="jsonly">You are a JavaScript User!</p>
</body>
</html>

没有document.write,没有脚本,纯CSS。


11
至少在xhtml标准中不允许。
Dykam,

29
@Dykam:HTML5中允许使用它:dev.w3.org/html5/spec/Overview.html#the-noscript-element,实际上,几乎所有浏览器都支持它。
威尔

3
建议使用display: none !important,以防止被更特定的规则(例如,由id或css选择器)覆盖,该规则旨在在启用脚本时使用。
Istador

3
提示:<noscript>在禁用首选项中的Javascript后,第一次刷新页面时,当前版本的Chrome不会解析标签。您需要点击两次重载才能使其正常工作。
Tobia'Apr

2
简洁,简洁,不使用javascript。我喜欢。
Dragas

8

我真的不同意所有关于预先嵌入HTML并用CSS隐藏它直到再次将其显示为JS的答案。即使未启用JavaScript,该节点仍存在于DOM中。的确,大多数浏览器(甚至是可访问性浏览器)都将忽略它,但是它仍然存在,并且可能有时会再次被您咬住。

我的首选方法是使用jQuery生成内容。如果内容很多,则可以将其另存为HTML片段(只是要显示的HTML,而没有html,body,head等标签),然后使用jQuery的ajax函数将其加载到整页。

test.html

<html>
<head>
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
    <script type="text/javascript" charset="utf-8">
     $(document).ready(function() {
       $.get('_test.html', function(html) {
         $('p:first').after(html);
       });
     });
    </script>
</head>
<body>
  <p>This is content at the top of the page.</p>
  <p>This is content at the bottom of the page.</p>
</body>
</html>

_test.html

<p>This is from an HTML fragment document</p>

结果

<p>This is content at the top of the page.</p>
<p>This is from an HTML fragment document</p>
<p>This is content at the bottom of the page.</p>

8

首先,始终将内容,标记和行为分开!

现在,如果您正在使用jQuery库(您确实应该这样做,它使JavaScript变得容易得多),则应执行以下代码:

$(document).ready(function() {
    $("body").addClass("js");
});

启用JS后,这将为您在正文上提供一个附加类。现在,在CSS中,可以在JS类不可用时隐藏该区域,并在JS可用时显示该区域。

另外,您可以将no-js默认类添加为body标签,并使用以下代码:

$(document).ready(function() {
    $("body").removeClass("no-js");
    $("body").addClass("js");
});

请记住,如果禁用CSS,它仍然会显示。


3

我有一个简单而灵活的解决方案,与Will的解决方案有些类似(但具有成为有效html的额外好处):

给body元素一个“ jsOff”类。用JavaScript删除(或替换)它。使用CSS隐藏具有“ jsOnly”类和带有“ jsOff”类的父元素的任何元素。

这意味着,如果启用了JavaScript,则将从主体中删除“ jsOff”类。这意味着具有“ jsOnly”类的元素将不会具有具有“ jsOff”类的父元素,因此不会与隐藏它们的CSS选择器匹配,因此将显示它们。

如果禁用JavaScript,则不会从主体中删除“ jsOff”类。具有“ jsOnly”的元素具有一个具有“ jsOff”的父元素,因此与隐藏它们的CSS选择器匹配,因此它们将被隐藏。

这是代码:

<html>
    <head>
        <!-- put this in a separate stylesheet -->
        <style type="text/css">
            .jsOff .jsOnly{
                display:none;
            }
        </style>
    </head>

    <body class="jsOff">
        <script type="text/javascript">
            document.body.className = document.body.className.replace('jsOff','jsOn');
        </script>

        <noscript><p>Please enable JavaScript and then refresh the page.</p></noscript>

        <p class="jsOnly">I am only shown if JS is enabled</p>
    </body>
</html>

这是有效的html。很简单。它很灵活。

只需将“ jsOnly”类添加到仅在启用JS时要显示的任何元素即可。

请注意,删除“ jsOff”类的JavaScript应该在body标签内尽早执行。由于body标签尚不存在,因此无法更早执行。它不应该稍后执行,因为这将意味着“ jsOnly”类的元素可能不会立即可见(因为它们将与隐藏它们的CSS选择器匹配,直到从主体元素中删除“ jsOff”类为止)。

这也可以提供仅js样式(例如.jsOn .someClass{})和仅js样式(例如.jsOff .someOtherClass{})的机制。您可以使用它来替代<noscript>

.jsOn .noJsOnly{
    display:none;
}

1

您还可以使用Javascript从另一个源文件加载内容并将其输出。那可能比您想要的要多一些黑匣子。


1

这是隐藏的div方式的示例:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title></title>
        <style>
            *[data-when-js-is-on] {
                display: none;
            }
        </style>
        <script>
            document.getElementsByTagName("style")[0].textContent = "";
        </script>
    </head>
    <body>
        <div data-when-js-is-on>
            JS is on.
        </div>
    </body>
</html>

(您可能需要针对较差的IE进行调整,但您会明白的。)


1

我的解决方案

.css:

.js {
display: none;
}

.js:

$(document).ready(function() {
    $(".js").css('display', 'inline');
    $(".no-js").css('display', 'none');
});

.html:

<span class="js">Javascript is enabled</span>
<span class="no-js">Javascript is disabled</span>

在您的html示例中,您是否不想以</ span>结尾的行?
简短的


0

您可以将段落| div的可见性设置为“隐藏”。

然后,在“加载”功能中,您可以将可见性设置为“可见”。

就像是:

<body onload =“ javascript:document.getElementById(rec).style.visibility = visible”> <p style =“ visibility:visible” id =“ rec”>除非有JavaScript,否则此文本将被隐藏。</ p>


0

没有标签。您将需要使用javascript来显示文本。

有人已经建议使用JS动态设置CSS可见。您也可以使用document.getElementById(id).innerHTML = "My Content"节点动态生成文本或动态创建节点,但是CSS hack可能是最容易阅读的。


0

自问这个问题以来的十年中,该HIDDEN属性已添加到HTML。它允许人们直接隐藏元素而无需使用CSS。与基于CSS的解决方案一样,该元素必须不被脚本隐藏:

<form hidden id=f>
Javascript is on, form is visible.<br>
<button>Click Me</button>
</form>
<script>
document.getElementById('f').hidden=false;
</script>
<noscript>
Javascript is off, but form is hidden, even when CSS is disabled.
</noscript>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.