Сайт React, пытается внедрить приложение, но я не могу понять, как интегрировать в компонент (работает на статической странице)

#reactjs #react-router #embed

#reactjs #react-router #Внедрить

Вопрос:

Я пытаюсь встроить следующее на свой сайт react в конкретный компонент / страницу. Когда я помещаю код на статическую html-страницу, он работает прекрасно, но он не работает, когда я пытаюсь поместить его в компонент.

Основная ошибка, которую я получаю, заключается в том, что chrome не разрешает document.write использовать внешний скрипт или что-то в этом роде. строки. Хотелось бы, чтобы у меня все еще было сообщение об ошибке, но я пробовал разные вещи и в порыве разочарования удалил все это прошлой ночью. (Отличная стратегия, я знаю.) Я смог восстановить ошибки, пожалуйста, смотрите внизу для деталей.

 <div id="fTelnetContainer" class="fTelnetContainer"></div>
<script>document.write('<script src="//embed-v2.ftelnet.ca/js/ftelnet-loader.norip.xfer.js?v='   (new Date()).getTime()   '"></script>');</script>
<script>
    var Options = new fTelnetOptions();
    Options.BareLFtoCRLF = false;
    Options.BitsPerSecond = 57600;
    Options.ConnectionType = 'telnet';
    Options.Emulation = 'ansi-bbs';
    Options.Enter = 'r';
    Options.Font = 'CP437';
    Options.ForceWss = false;
    Options.Hostname = 'mysite.com';
    Options.LocalEcho = false;
    Options.NegotiateLocalEcho = true;
    Options.Port = 1234;
    Options.ProxyHostname = 'proxy-us-ga.ftelnet.ca';
    Options.ProxyPort = 80;
    Options.ProxyPortSecure = 443;
    Options.ScreenColumns = 80;
    Options.ScreenRows = 25;
    Options.SendLocation = true;
    var fTelnet = new fTelnetClient('fTelnetContainer', Options);
</script>
  

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

Кстати, это вложение происходит со следующего сайта:http://embed-v2.ftelnet.ca /

Редактировать

Я все еще работаю над этим, поэтому я попытался вернуть сообщения об ошибках, и вот что произошло:

 (index):46 A parser-blocking, cross site (i.e. different eTLD 1) script, http://embed-v2.ftelnet.ca/js/ftelnet-loader.norip.xfer.js?v=1599169227014, is invoked via document.write. The network request for this script MAY be blocked by the browser in this or a future page load due to poor network connectivity. If blocked in this page load, it will be confirmed in a subsequent console message. See https://www.chromestatus.com/feature/5718547946799104 for more details.

A cookie associated with a cross-site resource at http://ftelnet.ca/ was set without the `SameSite` attribute. It has been blocked, as Chrome now only delivers cookies with cross-site requests if they are set with `SameSite=None` and `Secure`. You can review cookies in developer tools under Application>Storage>Cookies and see more details at https://www.chromestatus.com/feature/5088147346030592 and https://www.chromestatus.com/feature/5633521622188032.

ftelnet-loader.norip.xfer.js?v=1599169227014:1 A parser-blocking, cross site (i.e. different eTLD 1) script, http://embed-v2.ftelnet.ca/ftelnet/ftelnet.norip.xfer.min.js?v=2019-08-31, is invoked via document.write. The network request for this script MAY be blocked by the browser in this or a future page load due to poor network connectivity. If blocked in this page load, it will be confirmed in a subsequent console message. See https://www.chromestatus.com/feature/5718547946799104 for more details.
  

EDIT2
На данный момент это мой компонент:

 class Home extends React.Component {

  componentDidMount() {
    document.write("<script src='//embed-v2.ftelnet.ca/js/ftelnet-loader.norip.xfer.js?v="   (new Date()).getTime()   "'></script>"  
        "<script>"  
        "window.onload(function() {"  
        "var Options = new fTelnetOptions();"  
        "Options.BareLFtoCRLF = false;"  
        "Options.BitsPerSecond = 57600;"  
        "Options.ConnectionType = 'telnet';"  
        "Options.Emulation = 'ansi-bbs';"  
        "Options.Enter = 'r';"  
        "Options.Font = 'CP437';"  
        "Options.ForceWss = false;"  
        "Options.Hostname = 'mysite.com';"  
        "Options.LocalEcho = true;"  
        "Options.NegotiateLocalEcho = true;"  
        "Options.Port = 1234;"  
        "Options.ProxyHostname = 'proxy-us-ga.ftelnet.ca';"  
        "Options.ProxyPort = 80;"  
        "Options.ProxyPortSecure = 443;"  
        "Options.ScreenColumns = 80;"  
        "Options.ScreenRows = 25;"  
        "Options.SendLocation = true;"  
        "var fTelnet = new fTelnetClient('fTelnetContainer', Options);"  
        "});"  
           "</script>");

  }

  render() {
    return (
      <div>
      <h1>TELNET TIME</h1>
      <div id="fTelnetContainer" className="fTelnetContainer"></div>
      </div>
    );
  }
}

export default Home;
  

Это также выдает ошибку, Uncaught SyntaxError: Invalid or unexpected token

Ответ №1:

Я столкнулся с аналогичной проблемой, когда мне нужно было использовать скрипты PayPal (они не поддерживают импорт модулей ES6).

Прежде всего, document.write у вас это не сработает, потому что к моменту componentDidMount вызова документ уже полностью загружен. Смотрите https://developer.mozilla.org/en-US/docs/Web/API/Document/write. Поэтому повторный вызов этой функции — если write функция сработает — сотрет все в документе и напишет новый.

Чтобы решить вашу проблему, вот что я сделал: в вашем исходном HTML-документе, example index.html , я включил ваш скрипт для загрузки необходимых исходных кодов и присвоил объект fTelnetOptions свойству window, поскольку вы создадите его позже:

 <html>
<head>
  <script>
    document.write(
        '<script src="//embed-v2.ftelnet.ca/js/ftelnet-loader.norip.xfer.js?v='  
            new Date().getTime()  
        '"></script>'
    );
    window.fTelnetOptions = fTelnetOptions;
  </script>
</head>
  

Вернувшись к своему компоненту, сделайте то, что вам нужно, чтобы инициализировать telnet при подключении компонента — см. Окно.fTelnetOptions, которые мы создали:

 class Home extends React.Component {
  componentDidMount() {
    var Options = new window.fTelnetOptions();
    Options.BareLFtoCRLF = false;
    Options.BitsPerSecond = 57600;
    Options.ConnectionType = "telnet";
    Options.Emulation = "ansi-bbs";
    Options.Enter = "r";
    Options.Font = "CP437";
    Options.ForceWss = false;
    Options.Hostname = "mysite.com";
    Options.LocalEcho = true;
    Options.NegotiateLocalEcho = true;
    Options.Port = 1234;
    Options.ProxyHostname = "proxy-us-ga.ftelnet.ca";
    Options.ProxyPort = 80;
    Options.ProxyPortSecure = 443;
    Options.ScreenColumns = 80;
    Options.ScreenRows = 25;
    Options.SendLocation = true;
    var fTelnet = new window.fTelnetClient("fTelnetContainer", Options);
  }

  render() {
    return (
      <div>
        <h1>TELNET TIME</h1>
        <div id="fTelnetContainer" className="fTelnetContainer"></div>
      </div>
    );
  }
}

export default Home;
  

Редактировать уверенно-vaughan-4t225


На данный момент я не уверен, насколько хорошо это будет работать с маршрутизацией на стороне клиента. Обратитесь к моим сценариям ниже, если вы обнаружите, что свойство fTelnetOptions в window object теряется при маршрутизации:

 const script = document.createElement("script");
script.src = `your_script_url`;
script.async = true;
document.body.appendChild(script);

script.onload = () => {
    // do your instantiation amp; logic here
}
  

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

1. Похоже, на данный момент это работает довольно хорошо. Я все еще завален предупреждениями в консоли, но я думаю, что это, вероятно, лучший способ справиться с этим на данный момент. Спасибо за вашу помощь.

2. Добро пожаловать. Если у вас есть доступ к скриптам, которые вы пытаетесь включить, я предлагаю вам преобразовать его в модуль, чтобы вы могли легко импортировать его в свои компоненты