Можно ли добавлять классы тегу script?
Можно ли добавлять классы тегу script? Например, для того, чтобы привести их в работу только в медиа-запросе
Ответы (2 шт):
Вариант 1
Для определения соответствия размеров экрана определенному медиа запросу из JS можно использовать метод window.matchMedia метод вернет объект одним из ключей которых будет matches булевое значение которого и будет определять соответствие.
Таким образом скрипт можно выполнять при определенном размере экрана обернув нужный функционал в условие:
const mediaQuery = "screen and (max-width: 757px)"
const output = document.querySelector("#output");
const updateOutput = () => {
const isMax757 = matchMedia(mediaQuery).matches
output.innerText = isMax757;
matchMedia(mediaQuery).addEventListener("change", updateOutput, { once: true })
if (window.matchMedia(mediaQuery).matches){
// какой-то код для определенного mediaQuery
}
}
updateOutput();
<span id="output"></span>
Этот код лучше тестировать на весь экран, при изменении размеров до 757px будет отображено true, иначе false.
Как видно тут мы навешиваем события на изменения связанные с условием медиа запроса, а опция once: true отвечает за то чтобы после исполнения события происходила автоматическая отписка от него, тут происходит регулярная подписка/отписка, что может быть прервано при определенных условиях в коде
Вариант 2 (предыдущий ответ)
Для того случая когда содержимое тега скрипта нужно временно запретить к исполнению
В данном случае:
- любой, кастомный тип скрипта предотвращает исполнение
type="norun" - содержимое скрипта заносится в переменную
scriptCode - далее добавляется на страницу через новый тег
<script>, - происходит его автоматическое исполнение
Я полагаю, что тэг скрипта с содержимым может формироваться на бэке к примеру через PHP, тогда этот ответ может иметь смысл.
const scriptCode = document.getElementById('mycode').textContent
const myScript = document.createElement('script')
myScript.textContent = scriptCode
document.body.appendChild(myScript)
<script id="mycode" type="norun">
console.log('Hello World')
</script>
Если вам надо один раз запустить скрипт, то можно так:
const result = document.querySelector('#result'); const limit = 500; const someFunction = () => result.innerHTML += 'You ran me'; const onResize = () => { if (window.innerWidth > limit) return; someFunction(); window.removeEventListener('resize', onResize); } window.addEventListener('resize', onResize);<div id="result"><div>Если вам надо один раз запустить скрипт, но каждый раз, когда размер экрана становится меньше определённого лимита, то можно так:
const result = document.querySelector('#result'); const limit = 500; let canRunAgain = true; const someFunction = () => result.innerHTML += 'You ran me'; const onResize = () => { if (window.innerWidth > limit) { canRunAgain = true; return; }; if (!canRunAgain) return; someFunction(); canRunAgain = false; } window.addEventListener('resize', onResize);<div id="result"><div>