Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #11 (permalink)  
Старый 24.07.2018, 14:57
Аватар для j0hnik
Профессор
Отправить личное сообщение для j0hnik Посмотреть профиль Найти все сообщения от j0hnik
 
Регистрация: 01.12.2016
Сообщений: 3,650

хоть и не 'кеширование' если нужно много переменных объявить, бывает использую такую конструкцию.
['block1','block2','block22','block23'].forEach(el=> window[el] = document.querySelectorAll('.'+el));
Ответить с цитированием
  #12 (permalink)  
Старый 25.07.2018, 11:37
Аватар для MC-XOBAHCK
Профессор
Отправить личное сообщение для MC-XOBAHCK Посмотреть профиль Найти все сообщения от MC-XOBAHCK
 
Регистрация: 06.08.2017
Сообщений: 473

Сообщение от j0hnik Посмотреть сообщение
хоть и не 'кеширование' если нужно много переменных объявить, бывает использую такую конструкцию.
['block1','block2','block22','block23'].forEach(el=> window[el] = document.querySelectorAll('.'+el));
Не знаю является ли это самым оптимальным решением, но мне оно нравится. Я логику понял и тестово обкатал на All и просто querySelector - работает.
Спасибо что поделились, давно ломал голову в поиске подобного решения.
Ответить с цитированием
  #13 (permalink)  
Старый 25.07.2018, 12:52
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,791

MC-XOBAHCK,
Сообщение от MC-XOBAHCK
давно ломал голову в поиске подобного решения
Так вы захламите глобальный объект window, да и к чему делать подобные переменные глобальными?
По-моему код j0hnik'а лучше так переписать:
const concreteBlocks=['block1','block2','block22','block23'].reduce(function(result,className){
	return result[className]=[].slice.call(document.querySelectorAll('.'+className)), result;
},{});

concreteBlocks.block1.forEach(function(node){
  node.style.background='#F00';
});
Ответить с цитированием
  #14 (permalink)  
Старый 25.07.2018, 13:29
Аватар для MC-XOBAHCK
Профессор
Отправить личное сообщение для MC-XOBAHCK Посмотреть профиль Найти все сообщения от MC-XOBAHCK
 
Регистрация: 06.08.2017
Сообщений: 473

Nexus, да, есть такое
window == document  // => false

window > document          // => true

Открыл в консоле window и увидел что document является свойством window.


А можно спросить, а то у меня проблемы с пониманием и я теряюсь.
У вас в начале строки идут квадратные скобки [] (у меня есть подобное в решениях подсказанных здесь на форуме):
[].slice.call(document.querySelector......

Мне вот только мысль пришла - квадратные скобки это пустой массив? Или это что то другое?
Ответить с цитированием
  #15 (permalink)  
Старый 25.07.2018, 13:39
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,105

Сообщение от MC-XOBAHCK
квадратные скобки это пустой массив
по феншую тут должно быть Array.prototype
Ответить с цитированием
  #16 (permalink)  
Старый 25.07.2018, 14:05
Профессор
Отправить личное сообщение для Dilettante_Pro Посмотреть профиль Найти все сообщения от Dilettante_Pro
 
Регистрация: 27.11.2015
Сообщений: 2,899

MC-XOBAHCK,
document.querySelectorAll -это коллекция, не вполне массив. Многие методы массивов с коллекцией не работают.
Поэтому их приходится использовать с такой конструкцией
[].slice.call(document.querySelectorAll......

т.е метод slice применяется к настоящему пустому массиву и вызывается для коллекции
Ответить с цитированием
  #17 (permalink)  
Старый 25.07.2018, 14:23
Аватар для Alexandroppolus
Профессор
Отправить личное сообщение для Alexandroppolus Посмотреть профиль Найти все сообщения от Alexandroppolus
 
Регистрация: 25.10.2016
Сообщений: 1,012

Надо сказать, что коллекция NodeList (результат document.querySelectorAll и т.п.) постепенно становится "как массив", например, тот же forEach в ней давно есть почти во всех браузерах, да и полифилится в одну строку.

Потому превращать её в массив, имхо, незачем. Если что, можно и на самой коллекции через call использовать любой метод из Array.prototype.

Вот если бы это было, например, document.getElementsBy***, то да, смысл был бы, ибо там "живая коллекция", и вдруг её надо будет зафиксировать. Но все эти методы, по моему, отмирающая ветвь эволюции. А понадобиться они могут, если нам нужна как раз именно "живая колекция", т.е. slice опять не при делах..
Ответить с цитированием
  #18 (permalink)  
Старый 25.07.2018, 17:34
Аватар для MC-XOBAHCK
Профессор
Отправить личное сообщение для MC-XOBAHCK Посмотреть профиль Найти все сообщения от MC-XOBAHCK
 
Регистрация: 06.08.2017
Сообщений: 473

Спасибо всем за науку.
Дочитаю книгу которую посоветовали и буду дальше продолжать учить и практиковать JS.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
js стиль render для react.js vflash Ваши сайты и скрипты 5 01.04.2016 22:57
Вакансия JavaScript разработчик / JS / Frontend developer (Санкт-Петербург) Сергей Грачёв Работа 0 21.09.2015 12:31
Пример тестовых заданий на js junior elshaarawy Учебные материалы 3 26.03.2015 15:17
Картинка обрабатывается js 4yBaK Общие вопросы Javascript 10 11.09.2011 09:28