Сценарий пикселя Facebook переопределяет глобальный JSON

#json #facebook

Вопрос:

При загрузке последней версии fbevents.js для пикселя Facebook глобальный объект JSON переопределяется. Я не знаю, почему это происходит, но это сломало некоторые приложения, которые использовали JSON, реализованный MooTools (они добавляют кодирование и декодирование в глобальный объект JSON). Я провел несколько тестов и убедился, что проблема была введена в версии 2.9.42.

В версии 2.9.41 проблема не возникает.

Тестирование 2.9.41

введите описание изображения здесь

Код для теста приведен ниже: (измените идентификатор на свой) Вы можете изменить версию fbevents с помощью v параметра

 <!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <h1>Hello</h1>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/mootools/1.4.5/mootools-core-full-nocompat.js"></script>
    <!-- Facebook Pixel Code -->
    <script>
      !(function (f, b, e, v, n, t, s) {
        if (f.fbq) return;
        n = f.fbq = function () {
          n.callMethod
            ? n.callMethod.apply(n, arguments)
            : n.queue.push(arguments);
        };
        if (!f._fbq) f._fbq = n;
        n.push = n;
        n.loaded = !0;
        n.version = "2.0";
        n.queue = [];
        t = b.createElement(e);
        t.async = !0;
        t.src = v;
        s = b.getElementsByTagName(e)[0];
        s.parentNode.insertBefore(t, s);
      })(
        window,
        document,
        "script",
        "https://connect.facebook.net/en_US/fbevents.js?v=2.9.42"
      );
      fbq("init", "YOUR_ID");
      fbq("track", "PageView");
    </script>
    <noscript>
      <img
        height="1"
        width="1"
        src="https://www.facebook.com/tr?id=YOUR_IDamp;ev=PageView
  amp;noscript=1"
      />
    </noscript>
    <script>
      console.log("Version 2.9.42: ", JSON);
      console.log("JSON before FB execute: ", JSON);
      setTimeout(function () {
        console.log("JSON after FB execute: ", JSON);
      }, 3000);
    </script>
  </body>
</html> 

Ответ №1:

Я исследовал это и нашел кое-что интересное.

Код внутри fbevents.js не связывался с глобальной областью, но был загружен другой скрипт, и этот скрипт изменяет глобальный JSON.

Скрипт находится по этому URL: https://connect.facebook.net/signals/config/1718502398417441?v=2.9.42amp;r=stable

Вы можете открыть это и выполнить поиск j.JSON=n. Если вы приукрасите файл, добавьте пробелы. Он также добавляет JSON3 в глобальную область. Вы можете протестировать окно ввода.JSON3.

Смотрите изображение для получения подробной информации:

введите описание изображения здесь

Пока это мое предположение.

Правка 2:

Вы также можете загрузить различные версии этого файла javascript, используя параметр v.

Если вы сравните https://connect.facebook.net/signals/config/1718502398417441?v=2.9.41amp;r=stable и https://connect.facebook.net/signals/config/1718502398417441?v=2.9.42amp;r=stable

вы можете убедиться, что код на изображении выше был введен в этой версии.

Комментарии:

1. Это правда, что этот сценарий сигнала facebook (начиная с версии 2.9.42) блокирует глобальный объект JSON. Сегодня утром разработчикам facebook был представлен отчет об ошибке. Я могу передать ответ, когда он поступит от них