Рубрики
Без рубрики

Chrome: связь между вкладками

При наличии недавнего разговора об асинхронном JavaScript, я искал создать браузерную презентацию. Я знаю, что вкладки браузера являются песочниками, но видели этот тип функциональности (одна вкладка, управляющая другой) … Теги с JavaScript, Chrome, Sandbox, WebDev.

При наличии недавних разговоров об асинхронном JavaScript, я искал построить Браузер контролируется Презентация, позволяющая контролировать вкладку браузера для управления вкладкой презентации. В частности, я смотрел на управление тремя вещами:

  1. Положение скольжения
  2. Размер скольжения шрифта
  3. Слайд Действия

Для третьего, сдвижные действия, я искал, чтобы вызвать отображение некоторых кода (предпочтительно в разработчике Tools> Console), а также потенциально запустить код.

Как долгое время в интернет-разработчике, я знаю, что вкладки браузера являются песочниками, но видели это Тип функциональности Со временем … но вспоминая где было пугающе. Я также хотел сделать исследование и не осмотреть (чувствовал себя обманом) некоторые из инструментов презентации (например, review.js ), которые имеют эту функциональность.

То, что я наткнулся, был BroadcastChannel И он поддерживается в Firefox и Chrome Per caniuse.com Отказ Поскольку я не могу изобразить, пытаясь дать презентацию, используя IE или Edge, я рассмотрел эту отличную информацию.

Настройка каналов

Использование этой функциональности, расторгативную быть довольно простым … Этот код инициировал процесс в index.html Код JavaScript ( _funnality.js ) …

const pnChannel = new BroadcastChannel('le-slides-position');
const fsChannel = new BroadcastChannel('le-slides-font-size');
const anChannel = new BroadcastChannel('le-slides-actions');

В _navigation.js , _font-sizing.js и _Code-Примеры Файлы, есть соответствующие объявления …

// _navigation.js
const channel = new BroadcastChannel('le-slides-position');

// _font-sizing.js
const channel = new BroadcastChannel('le-slides-font-size');

// _code-examples.js
const channel = new BroadcastChannel('le-slides-actions');

ПРИМЕЧАНИЕ: Каждая из этих строк находится в отдельном файле, поэтому использование Const Channel на каждой строке.

Канал связи

Здесь мы просто проверим отправку данных из контроля index.html , _функциональность, js Код …

const actions = {
  init: (force = false) => {
    if (!initFired || force) {
      fsChannel.postMessage('init');
      pnChannel.postMessage('init');
      anChannel.postMessage('init');
      initFired = true;
    }
  },

  up: () => {
    if (!upButton.hasClass('disabled')) {
      fsChannel.postMessage('trigger-up');              
    }
  },
  reset: () => {
    fsChannel.postMessage('trigger-reset');         
  },
  down: () => {
    if (!downButton.hasClass('disabled')) {
      fsChannel.postMessage('trigger-down');                
    }
  },

  previous: () => {
    if (!previousButton.hasClass('disabled')) {
      pnChannel.postMessage('trigger-previous');                
    }
  },
  next: () => {
    if (!nextButton.hasClass('disabled')) {
      pnChannel.postMessage('trigger-next');
    }
  },

  triggerAction: (action) => {
    anChannel.postMessage(action);
  }
};

Канал позиции

Теперь, глядя на Pnchannel (Канал позиции) … мы видим, что .onmessage Funcitonality ожидает государства. Отправлено государством может включать данные, в данном случае, какой текущий индекс … Кроме того, отправляются дополнительные данные, такие как предыдущие и следующие отключения, и эти кнопки могут быть отрегулированы соответствующим образом.

pnChannel.onmessage = (states) => {
  cardIndex = states.data.currentIndex;
  updateContent();

  if (states.data.previousDisabled) {
    previousButton.addClass('disabled');
  } else {
    previousButton.removeClass('disabled');
  }

  if (states.data.nextDisabled) {
    nextButton.addClass('disabled');
  } else {
    nextButton.removeClass('disabled');
  }
};

В _navigation.js Файл, там он получает Тригериция Чьи данные фактически используются для выполнения некоторых функций …

channel.onmessage = (triggerAction) => {
  actions[triggerAction.data]();
};

const actions = {
  init: () => {
    nextButton.hide();
    previousButton.hide();
  },

  'trigger-previous': () => {
    slideStateMachine.next('previous');
  },
  'trigger-next': () => {
    slideStateMachine.next('next');
  },

  'report-states': (index) => {
    channel.postMessage({
      currentIndex: index,
      previousDisabled: previousButton.hasClass('disabled'),
      nextDisabled: nextButton.hasClass('disabled')
    });
  }
};

С помощью этого кода следует понять, что отправка сообщения – это просто вопрос использования .PostMessage Функциональность канала.

Канал размера шрифта

Глядя на Fschannel. Мы можем видеть .onmessage Ожидается снова состояние, позволяющее назначать состояния кнопки …

fsChannel.onmessage = (states) => {
  if(states.data.upDisabled) {
    upButton.addClass('disabled');
  } else {
    upButton.removeClass('disabled');
  }

  if(states.data.downDisabled) {
    downButton.addClass('disabled');
  } else {
    downButton.removeClass('disabled');
  }     
};

Это связано с ** _ font-sizing.js * код, который снова вызывает различные действия …

channel.onmessage = (triggerAction) => {
  actions[triggerAction.data]();
};

const actions = {
  init: () => {
    upButton.hide();
    downButton.hide();
    resetButton.hide();
  },

  'trigger-up': () => {
    fontStateMachine.next('up');
  },
  'trigger-reset': () => {
    fontStateMachine.next('reset');      
  },
  'trigger-down': () => {
   fontStateMachine.next('down');
  },

  'report-states': () => {
    channel.postMessage({
      upDisabled: upButton.hasClass('disabled'),
      downDisabled: downButton.hasClass('disabled')
    });
  }
};

Канал действий

Глядя на ансанана Мы видим, что здесь данные о состоянии ответа просто отправляются в Console.log …

anChannel.onmessage = (states) => {
  console.log('action reply:', states.data);
};

Ассоциированный код в _Code-examples.js Файл немного сложнее …

channel.onmessage = (states) => {
  const cardAction = cardActions[states.data];
  if (states.data === 'init') {
    cardAction();
  } else {
    if (cardAction.showDisplay) {
      console.log(cardAction.display);      
    }
    cardAction.fn();        
  }
};

В этом случае я признаю, что я «обманул» немного на определенную цель … Я использовал некоторые данные JSON …

"fn": "triggerImage('queues.png', false)"

… и внутри _Code-examples.js init Функциональность, я перестроил их как исполняемые функции. Таким образом, я смог использовать файл JSON для управления элементами на каждом экране, а также что может быть «выполнен» на экране презентации …

const name = card.options[j].name;
const optionFn = new Function(card.options[j].fn);
cardActions[name] = {
  fn: optionFn,
  showDisplay: card.options[j].showFn,
  display: card.options[j].fn
};

Выводы

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

Содержание в моей статье JavaScript любит ваши слезы это то, что я использую для представления Однопоточный и асинхронный JavaScript? .

Это был интересный проект и в какой-то момент я вижу, что я работаю в презентации, в и сам по себе.

Оригинал: “https://dev.to/rfornal/chrome-communication-between-tabs-12bg”