Bir <script> etiketi bir <noscript> etiketi içinde hangi amaca hizmet eder?


139

Son zamanlarda ilginç tasarım ve içeriğe sahip web sitelerinde bir "kaynak görüntüleme" çılgınlığı yaşadım. Bu web sitelerinden biri olan Squarespace , <script>bir <noscript>etiketin içindeki etiket bloklarına sahiptir, şöyle :

<!-- 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>
...
...

Bana garip geldi ve bilgi için böyle garip bir HTML biraz gizli işlevsellik / amaç olup olmadığını görmek için googling var, ama boşuna. Öğelerin <script>içinde etiket bulundurmanın bir amacı var mı <noscript>, yoksa bu sadece kötü HTML örneği mi?


18
Anlamsız IMHO ve bu sadece bir hata.
Sebastien C.

12
Belki bu JS dışarı yorum için sadece garip bir yol.
AlexR

8
Onlar tam bir başlığa sahip olmasından bakılırsa (dahil <base href="">, <meta … />, <title>ve <link … />onlar taciz ediyor gibi görünüyor öğeleri) <noscript>şablonu için.
Bergi

2
Harika bir soru! Ama korkunç çünkü şimdi benim için başka bir "görüntü kaynağı" çılgınlığı başlattın .. Bu alışkanlıktan yeni çıktım!
Bobo

2
@Bobo: Ancak, Matrix'in içinde neler olduğunu anlamak için koda bakmak iyi bir şey! ;)
Agent.Logic_

Yanıtlar:


139

Bazı kodları üzerinden arama yaptım ve bu snippet'i buldum (daha okunabilir hale getirmek için temizledim):

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

Gördüğünüz gibi, <noscript>etiket #inline-depsbağımlılıkları eşzamansız ve isteğe bağlı olarak yüklemek için kodda (satır 3) referans verilen kimliğe sahiptir .

Muhtemelen bir <noscript>öğeyi, DOM öğelerine doğrudan bir dize veya yoruma yerleştirmek yerine (yorumların gerçek bilgiler için tasarlanmadığı için özellikle kötü olduğunu düşündüğüm) yerine, bir öğeyi kullanırlar ve sonra ayrıştırırlar. Ayrıca, özel olarak yüklenene kadar komut dosyalarının ve CSS stillerinin yürütülmesini engeller.

Şahsen bu <noscript>etiketi kötüye kullanıyorum . Geçerli bir HTML5 kodu olup olmadığından bile emin değilim. Komut dosyası yükleyicili bir JavaScript nesnesindeki bağımlılıkları bildirme gibi diğer yöntemlerin kullanılması, mümkün olan yerlerde kullanılmalıdır.


71
Bu aldatıcı kod korsanları;). Umarım, akıllı bir adam 'işe yaramadığı için' silmeden önce iyi belgelemişlerdir.
Patrick Hofman

6
Ben <script type="text/html">...</script>aynı amaçla kullanılmış gördüm - kimse ikisinin artıları / eksileri var?
Shai

4
İçerideki herhangi bir şeyin <noscript>JavaScript olmayan kullanıcılar tarafından görülebilir olması muhtemeldir ; çoğu site bu kullanıcıları desteklemez, ancak onlara basit bir açıklayıcı mesaj da göstermek istersiniz.
Katana314

8
Bu, gerçekleştirdikleri bazı olağanüstü kötü uygulamalar
tcooc

3
Herkes pls bu kodun ne olduğunu açıklayabilir misiniz? .. 86 upvotes ve ben bu kodun ne hakkında hiçbir fikrim yok .. Kendimi aptal hissediyorum! ..
Lakshay
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.