аналог .classList.contains для ID/другого аттрибута
Доброе время суток, решаю интересную задачу и потребовалось определять есть ли в составе потомков элемента нужный мне элемент ...
первым на ум пришло детектить его через список классов структурой : clicked_el.classList.contains(className) но элементов много и они уникальны и придется сгенерировать кучу классов динамически и в общем все перебрать , возможно использовать конечно элемент id, находя любой у которого он есть а там длаее уже разбераться но хотелось бы создать свой атрибут конструкцией типа : elemement.setAttribute("MyAttr", value) и уже потом считать что если мышкой ткнули туда где есть у потомков атрибут MyAttr делать какие либо действия ... пока что пришло в голову это перебрать всех потомков элемента и у всех проверять через .hasAttribute , но это реально как то печально и не красиво ... и да это AJAX окно и когда вчера после трех часов тыкания у меня был раскрыт TreeView d 1500 прогруженных элементов и я в него таким образом ткнул , хром слегка подафигел и повис .... в связи с чем есть вопрос естьли аналог конструкции : .classList.contains но для своего аттрибута ? |
Чего то не то вы изобретаете
Не надо придумывать свои атрибуты. Для этого есть атрибут data-* https://developer.mozilla.org/ru/doc...ributes/data-* Для выбора элементов с нужными классами, атрибутами, потомков и проч есть querySelector(All) https://developer.mozilla.org/ru/doc.../querySelector https://developer.mozilla.org/ru/doc...erySelectorAll |
voraa, ну про data- я думал но он ничем не хуже своегопридуманного так как так же нет функций под него
насчет querySelector(All) вы плохо прочитали или я плохо объяснил ... у меня есть извесный элемент ... ОН ЕСТЬ и он не document а , querySelector свойство только docement'а так что не вариант :cray: |
Цитата:
|
Цитата:
Цитата:
Если нужен какой то конкретный элемент, то использовать id самое оно. пусть есть элемент parent и нам надо узнать входит ли в число его потомков элемент с id='myid' parent.contains(document.getElementById('myid')) // true - если потомок, false - если нет. Если у элемент потомка есть data-elem='myelem', то parent.contains(document.querySelector('[data-elem=myelem]')) // true - если потомок, false - если нет.или parent.querySelector('[data-elem=myelem]') // вернет сам элемент с data-elem=myelem, если потомок, null - если нет |
voraa, спасибо !
был уверен что querySelectorAll ест ьтолько у документа ... эх вот почему я говорю нельзя всем заниматься одновременнно :) тогда задача упрощается |
Не прошло :(
e=mouse event function plg_m1vpopup_CheckMenu(e) { var el = e.srcElement || e.target; console.log("CheckMenu:" + el.nodeName); //проверяем всех предков let way = ""; do { way = el.nodeName; console.log(way); if (el.nodeName == 'LI' && el.hasAttribute('data-m1vpopupmenuid')) { //Найден предок с признаком меню console.log("found [data-m1vpopupmenuid] in " + way + " element =" + el.nodeName);//DEBUG: return el; } } while (el = el.parentNode); console.log("[data-m1vpopupmenuid] not found"); return false; В общем вот код мой который работает . но как я говорил ранее в случае клика там где не предусмотрено меню , например на treeView с парой сотен пунктов это вызывает циклический перебор браузерпрям реально переберает все по порядку а хочется более изящного решения Есть ли вариант поизящнее вариант или нет ? |
Извините, а вы для каких браузеров это делаете (по каким книжкам js изучаете)? Вряд ли нужно сейчас писать в расчете на ИЕ8 и более ранние.
Сейчас не нужны никакие e.srcElement. Только e.target И есть функция elt = element.closest(selectors) см https://developer.mozilla.org/ru/doc...lement/closest Есть еще функция matches https://developer.mozilla.org/ru/doc...lement/matches Поэтому el.nodeName == 'LI' && el.hasAttribute('data-m1vpopupmenuid')записывается, как el.matches('li[data-m1vpopupmenuid]') А весь цикл, как el = e.target.closest('li[data-m1vpopupmenuid]') // 'элемент-предок, если есть такой, null - если нет |
изучаю ? не незнаю такого слова :)
по сути то что я делаю юзается в подразделени РЖД , и поверь мне IE8 ты тут никого не удевишь ... по этому ипишу такие костыли... за остальное спасибо ... прочту JS не входет в сферу моих интересов , я всю жизнь в вэбе писал только бакэнды , а сейчас как бы нужно .. та кто я вообще низкоуровневый програмист / промышленный програмист :) |
Часовой пояс GMT +3, время: 08:30. |