Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #11 (permalink)  
Старый 04.06.2018, 15:53
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,791

xShift, что мешает объявить селекту id (или data-id) и обращаться к нему по id?
Желание спорить отсутствует.
Ответить с цитированием
  #12 (permalink)  
Старый 04.06.2018, 16:03
Аватар для xShift
Профессор
Отправить личное сообщение для xShift Посмотреть профиль Найти все сообщения от xShift
 
Регистрация: 22.11.2016
Сообщений: 212

Nexus, у меня тоже нету. Но того требует не только быстрый доступ к свойствам, а хотя бы сущность к примеру БЕМ методологии или OOCSS, который мне в последнее время не нравится изза размножения id. Так удобнее изолировать стили от pre defined и задавать свои политики отображения. Что вы будете горбатого лепить аля замена + оригинал вместо оборачивания?
Ответить с цитированием
  #13 (permalink)  
Старый 04.06.2018, 16:06
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,791

xShift, положите ссылку на селект в свойство класса-кастомизатора.
Ответить с цитированием
  #14 (permalink)  
Старый 04.06.2018, 16:35
Аватар для ruslan_mart
Профессор
Отправить личное сообщение для ruslan_mart Посмотреть профиль Найти все сообщения от ruslan_mart
 
Регистрация: 30.04.2012
Сообщений: 3,018

Ну обычно ссылка на select может храниться где-то в замыкании или в контексте, смотря какая реализация. А обращаться постоянно к элементам через getElemetns*/querySelector, ну или тому подобные - методика для быдлокодеров, аля jQuery головного мозга. Я вообще не признаю innerHTML для перезаписи элементов, а outerHTML уж тем более, это слишком как-то маньячно.

Последний раз редактировалось ruslan_mart, 04.06.2018 в 16:38.
Ответить с цитированием
  #15 (permalink)  
Старый 04.06.2018, 18:03
Аватар для xShift
Профессор
Отправить личное сообщение для xShift Посмотреть профиль Найти все сообщения от xShift
 
Регистрация: 22.11.2016
Сообщений: 212

ruslan_mart, а unwrap/wrap это не маньячно?

К примеру:

for(let i of e) {

			let parent = i.parentElement;
		
			while (i.firstChild) {
				parent.insertBefore(i.firstChild, i);
			}

			parent.removeChild(i);
		}


против

i.outerHTML = '<div class="wrapper">'+ i.outerHTML +'</div>';


Я просто как-то элегантнее не видел. Ладно уж parentElement может перестроиться, но closest обязан работать, чтобы не было таких вот while головного мозга.

> querySelector для быдлокодеров

Не правда. Очень крутая фишка, о которой вы возможно не знали это поиск в элементе другого элемента. Это и было круто в jQuery $('.some', '.some-wrapper') - оно отсекало все ненужное.

Но jQuery и сам Sizzle стали не нужна когда появился querySelectorAll.

То же самое:

let element = document.querySelectorAll('#shell');

element[0].querySelectorAll('.somethin-in-shell');


или еще прикольнее:

let element = document.querySelectorAll('#shell');

element[0].querySelectorAll('*'); // вообще все что внутри


И тогда не понятно как вы их умудряетесь получать? везде тыкаете id а потом прямо пишете для div#shell обращение типа shell.dataset.shit-code = 'ololo'; ?

Без этих остается только прямое обращение к объекту в window ...

Последний раз редактировалось xShift, 04.06.2018 в 18:08.
Ответить с цитированием
  #16 (permalink)  
Старый 04.06.2018, 18:06
Аватар для j0hnik
Профессор
Отправить личное сообщение для j0hnik Посмотреть профиль Найти все сообщения от j0hnik
 
Регистрация: 01.12.2016
Сообщений: 3,650

Сообщение от xShift
i.outerHTML = '<div class="wrapper">'+ i.outerHTML +'</div>';
Не всегда так делать можно, такая запись уничтожает обработчики событий которые были на элементе.
Ответить с цитированием
  #17 (permalink)  
Старый 04.06.2018, 18:12
Аватар для xShift
Профессор
Отправить личное сообщение для xShift Посмотреть профиль Найти все сообщения от xShift
 
Регистрация: 22.11.2016
Сообщений: 212

j0hnik, оберта в функцию + callback перезапускающий ее(нагрузки там не много - процессор этим не сожрет и память). я вот кстати промисы не люблю.
Ответить с цитированием
  #18 (permalink)  
Старый 04.06.2018, 18:39
Аватар для Alexandroppolus
Профессор
Отправить личное сообщение для Alexandroppolus Посмотреть профиль Найти все сообщения от Alexandroppolus
 
Регистрация: 25.10.2016
Сообщений: 1,012

Сообщение от xShift Посмотреть сообщение
ruslan_mart, а unwrap/wrap это не маньячно?

К примеру:

for(let i of e) {

			let parent = i.parentElement;
		
			while (i.firstChild) {
				parent.insertBefore(i.firstChild, i);
			}

			parent.removeChild(i);
		}


против

i.outerHTML = '<div class="wrapper">'+ i.outerHTML +'</div>';


Я просто как-то элегантнее не видел.
вот, способ с сохранением объектов-узлов:
var elem = document.querySelector('#id1');
var range = document.createRange();
range.selectNodeContents(elem);
elem.parentNode.replaceChild(range.extractContents(), elem);


это unwrap, то что у тебя в цикле. Собственно, вытаскиваем весь контент из элемента, и заменяем элемент на него. Два изменения дома - вытаскивание контента и замена.

wrap аналогично.

outerHTML/innerHTML тут нафиг не нужен.

матчасцъ - https://learn.javascript.ru/range-textrange-selection
Ответить с цитированием
  #19 (permalink)  
Старый 04.06.2018, 18:48
Аватар для ruslan_mart
Профессор
Отправить личное сообщение для ruslan_mart Посмотреть профиль Найти все сообщения от ruslan_mart
 
Регистрация: 30.04.2012
Сообщений: 3,018

xShift, про querySelector я другое имел ввиду.. Что получать один и тот же элемент через querySelector при каком-либо событии - не есть хорошо. Если Вы создаёте какой-то модуль/плагин, то у Вас должна быть инициализация на динамическом уровне, а не на уровне получения элементов "туда-сюда" из вёрстки.

Сообщение от xShift
element[0].querySelectorAll('*');
element[0].getElementsByTagName('*') работает куда быстрее. Но в принципе, в 99.9% случаев никогда нет надобности получать всех потомков всех уровней, так что эта затея не имеет смысла. Обычно есть необходимость получать потомков первого уровня, а делается это элементарно через element.childNodes/children.

Не нужны никакие id при правильном подходе. Если Вы создаёте элемент или дерево элементов, то уже знаете об этом элементе.

this.wrapper = document.createElement('div');

this.wrapper //-> вот она, ссылка на элемент.


Всё что касается innerHTML/outerHTML - это безусловно нужные вещи, но при написании модулей/плагинов использовать это будет не совсем грамотно.

Вернёмся к теме jQuery или querySelector. Вот типичный пример быдлокода:

document.querySelector('#button').onclick = function() {
    document.querySelectorAll('.foo .bar')[0].style.display = 'none';
};




//Не правильно
$('#button').on('click', function() {
   $('.block-1').css('display', 'block');
   $('.block-1').css('color', 'red');
   $('.block-2').html('Bla');
});


//Правильно
var block_1 = $('.block-1'),
   block_2 = $('.block-2');

$('#button').on('click', function() {
   block_1.css({display: 'block', color: 'red'});
   block_2.html('Bla');
});
Ответить с цитированием
  #20 (permalink)  
Старый 04.06.2018, 18:56
Аватар для ruslan_mart
Профессор
Отправить личное сообщение для ruslan_mart Посмотреть профиль Найти все сообщения от ruslan_mart
 
Регистрация: 30.04.2012
Сообщений: 3,018

Сообщение от xShift
let element = document.querySelectorAll('#shell');
 
element[0].querySelectorAll('.somethin-in-shell');
Даже если рассматривать Ваш пример, то тут очень много противоречий.

1. id уникален, он должен быть только один на странице. Следовательно, запись document.querySelectorAll('#shell') не имеет смысла, так как мы хотим получить один единственный элемент, а не коллекцию. Получается, что лучше тогда использовать document.querySelector (без "All"), но опять же, куда быстрее и правильней будет заюзать document.getElementById.

2. Нет смысла в два шага искать элементы с определённым классом внутри элемента с определённым id. Можно сразу:
document.querySelectorAll('#shell .somethin-in-shell')

Но это если конечно Вам не нужны оба элемента.
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Доступ к элементам после подгрузки через ajax spo jQuery 3 07.03.2013 15:40
как получить доступ к динамически созданным html элементам? korney Элементы интерфейса 8 21.01.2012 22:12
Как обратиться к элементу, который был добавлен после полной загрузки DOM? LysoSutriN jQuery 5 02.01.2012 16:59
Как имитировать клик по элементу созданого после загрузки страницы? anoth3r jQuery 3 29.09.2011 12:22
Получить доступ к "почти соседнему" элементу через target revvo Общие вопросы Javascript 10 18.01.2011 18:50