Можно ли добавлять классы тегу script?

Можно ли добавлять классы тегу script? Например, для того, чтобы привести их в работу только в медиа-запросе


Ответы (2 шт):

Автор решения: Daniil Loban

Вариант 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>

→ Ссылка
Автор решения: EzioMercer
  • Если вам надо один раз запустить скрипт, то можно так:

    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>

→ Ссылка