<script> 태그는 <noscript> 태그 내부에서 어떤 용도로 사용됩니까?


139

최근 흥미로운 디자인과 콘텐츠를 제공하는 웹 사이트에서 "소스보기"를하고 있습니다. 이러한 웹 사이트 중 하나 인 Squarespace 는 다음과 같이 <script>태그 안에 태그 블록을 가지고 있습니다 <noscript>.

<!-- Page is at: http://squarespace.com -->
...
...
<noscript id="inline-deps">
  <link rel="stylesheet" type="text/css" href="//cloud.typography.com/7811972/758964/css/fonts.css" />

  <script type="text/javascript" src="https://static.squarespace.com/static/ta/5134cbefe4b0c6fb04df8065/7400/assets/logomark/logomark.min.js?37"></script>
  <link rel="stylesheet" href="https://static.squarespace.com/static/ta/5134cbefe4b0c6fb04df8065/7400/assets/logomark/logomark.min.css?37" type="text/css" />
</noscript>
...
...

그것은 나를 이상하게 여기고, HTML에 이상한 기능이나 목적이 있는지 알기 위해 정보를 찾기 위해 인터넷 검색을 얻었지만 아무 소용이 없습니다. 요소 <script>안에 태그를 넣는 데 어떤 종류의 목적이 있습니까 <noscript>, 아니면 나쁜 HTML의 예일까요?


18
의미가없고 실수 일 뿐인 IMHO.
Sebastien C.

12
아마도 그것은 JS를 주석 처리하는 이상한 방법 일 것입니다.
AlexR

8
그들은 완전한 헤더를 가지고 있다는 사실에서 판단 (포함 <base href="">, <meta … />, <title>그리고 <link … />그들이 학대하는 것처럼 보이는 요소) <noscript>템플릿을 위해.
Bergi

2
좋은 질문입니다! 그러나 당신이 지금 나를 위해 또 다른 "소스보기"를 쫓아 냈기 때문에 끔찍합니다 .. 방금 그 습관에서 벗어났습니다!
Bobo

2
@Bobo : 그러나 매트릭스 내부에서 발생하는 상황을 이해하기 위해 코드를 보는 것이 좋습니다! ;)
Agent.Logic_

답변:


139

코드를 검색 하여이 코드를 찾았습니다 (더 읽기 쉽게하기 위해 정리했습니다).

var DepLoader = (function () {
  function init() {
    var dependencies = document.getElementById("inline-deps");
    if (!dependencies || JS.hasClass(document.body, "deps--loaded")) {
      webfontsReady();
    } else {
      var html = dependencies.innerText || dependencies.textContent;
      JS.addClass(document.body, "deps--loaded");
      processRaw(html);
    }
  }

  function isListed(a, b) {
    for (var i = 0; i < b.length; i++) {
      if (a.indexOf(b[i]) !== -1) {
        return true;
      }
    }
    return false;
  }

  function webfontsReady() {
    JS.fireCustom("webfontsReady");
  }

  function processRaw(html) {
    var el = document.createElement("div");
    el.innerHTML = html;

    var scripts = el.querySelectorAll("script");
    var styles = el.querySelectorAll("link");
    var common, signup, dialog, systemPage, commerce;
    var others = [];
    var inline = [];
    var styleWhiteList = ["site.css", "dialog-", "signup-", "logomark"];
    var scriptBlackList = ["management-", "ckeditor-"];

    for (var i = 0; i < styles.length; i++) {
      var style = styles[i];
      if (style.href.indexOf("fonts.css") !== -1) load(style, webfontsReady);
      if (isListed(style.href, styleWhiteList)) load(style);
    }

    for (var i = 0; i < scripts.length; i++) {
      var script = scripts[i];
      var src = script.src;

      if (!src && script.getAttribute("data-sqs-type") !== "dynamic-assets-loader" && script.innerHTML.indexOf("SQUARESPACE_ROLLUPS") === -1) {
        eval(script.innerHTML);
      }
    }

    if (window.SQUARESPACE_ROLLUPS) {
      for (var key in SQUARESPACE_ROLLUPS) {
        var rollup = SQUARESPACE_ROLLUPS[key];
        var js = rollup.js;
        var css = rollup.css;

        if (key.indexOf("common") !== -1) {
          common = js;
        } else if (key.indexOf("commerce") !== -1) {
          commerce = js;
        } else if (key.indexOf("signup") !== -1) {
          signup = js;
        } else if (key.indexOf("dialog") !== -1) {
          dialog = js;
        } else if (key.indexOf("system-page") !== -1) {
          systemPage = js;
        } else if (key) {
          others = others.concat(js);
        } else {
          inline = inline.concat(js);
        }
      }
    }

    for (var i = 0; i < scripts.length; s++) {
      var script = scripts[i];
      var src = script.src;

      if (!isListed(src, scriptBlackList)) {
        if (src.indexOf("common-") !== -1) {
          common = script;
        } else if (src.indexOf("commerce-") !== -1) {
          commerce = script;
        } else if (src.indexOf("signup-") !== -1) {
          signup = script;
        } else if (src.indexOf("dialog-") !== -1) {
          dialog = script;
        } else if (src.indexOf("system-page-") !== -1) {
          systemPage = script;
        } else if (src) {
          others.push(script);
        } else {
          inline.push(script);
        }
      }
    }

    function loadOthers() {
      for (var i = 0; i < inline.length; i++) {
        if (inline[i].getAttribute("data-sqs-type") !== "dynamic-assets-loader") {
          load(inline[a]);
        }
      }

      for (var i = 0; i < others.length; i++) {
          load(others[i]);
      }

      JS.fireCustom("dependenciesLoaded");
    }

    var loadSystemPage = load.bind(this, systemPage, loadOthers, "system page");
    var loadSignup = load.bind(this, signup, loadSystemPage, "signup");
    var loadCommerce = load.bind(this, commerce, loadSignup, "commerce");
    var loadDialog = load.bind(this, dialog, loadCommerce, "dialog");
    var loadCommon = load.bind(this, common, loadDialog, "common");

    loadCommon();
  }

  function load(tag, callback, label) {
    var head = document.head;

    if (Array.isArray(tag)) tag = { nodeName: "SCRIPT", src: tag[0] };

    if (!tag) {
      if (callback) callback();
      return;
    }

    if (tag && (tag.src || tag.href)) {
      var child;
      if ("SCRIPT" === tag.nodeName) {
        child = document.createElement("script");
        child.src = tag.src;

        if (child.src.indexOf("combo") !== -1) {
          callback = function () {
            Y.Squarespace.FrontSite.Core.domReady(true)
          };
        }
      } else {
        if ("LINK" === tag.nodeName && "stylesheet" === tag.rel) {
          child = document.createElement("link");
          child.href = tag.href;
          child.rel = "stylesheet";
          child.tyle = "text/css";
        }

        if (child) {
          child.onload = callback;
          head.appendChild(child);
        }
      }
    } else {
      try {
        eval(tag.innerHTML);
      } catch (e) {}
    }
  }

  return { init: init, webfontsReady: webfontsReady };
})();

보시다시피 <noscript>태그에는 ID가 있습니다.#inline-deps 가 있으며, 코드 (라인 3)에서 참조하여 종속성을 비동기식 및 주문형으로로드합니다.

아마도 <noscript>요소를 문자열이나 주석에 배치하는 대신 DOM 요소에 직접 액세스 할 수 있으므로 요소를 사용합니다 (주석은 실제 정보를 의미하지 않기 때문에 특히 나쁘다고 생각합니다). 또한 특별히로드 될 때까지 스크립트 및 CSS 스타일의 실행을 방지합니다.

나는 개인적으로 이것이 <noscript>태그 의 남용을 발견합니다 . 그것이 유효한 HTML5 코드인지 확실하지 않습니다. 스크립트 로더를 사용하여 JavaScript 객체에서 종속성을 선언하는 것과 같은 다른 방법을 사용할 수있는 경우 사용해야합니다.


71
그 악의적 인 코드 해커;). 나는 똑똑한 사람이 그것을 사용하지 않기 때문에 그것을 삭제하기 전에 그들이 그것을 잘 문서화하기를 바랍니다.
Patrick Hofman

6
나는 <script type="text/html">...</script>같은 목적으로 사용되는 것을 보았습니다. 누구나 두 사람의 장단점이 있습니까?
Shai

4
<noscript>자바 스크립트가 아닌 사용자는 내부의 내용 을 볼 수 있습니다. 대부분의 사이트는 단순히 해당 사용자를 지원하지 않지만 간단한 설명 메시지를 표시하려고합니다.
Katana314

8
그것은 그들이 수행하는 매우 나쁜 습관입니다
tcooc

3
? 누구 pls는이 코드가 .. 86 upvotes을 수행하고이 코드에 대해 무엇인지 아무 생각이 무엇인지 설명 할 수 .. 내가 바보 같은 느낌이 있어요 ..!
Lakshay
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.