При наличии недавних разговоров об асинхронном JavaScript, я искал построить Браузер контролируется Презентация, позволяющая контролировать вкладку браузера для управления вкладкой презентации. В частности, я смотрел на управление тремя вещами:
- Положение скольжения
- Размер скольжения шрифта
- Слайд Действия
Для третьего, сдвижные действия, я искал, чтобы вызвать отображение некоторых кода (предпочтительно в разработчике 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”