2015-02-02 3 views
0

Как я могу получить элемент предка с определенным атрибутом данных, щелкнув один из его дочерних элементов?Извлечение элемента предка с определенным атрибутом данных

Мне нужно получить атрибут data-cell при нажатии на <span> или <div>. Я попытался использовать node.parentElement, но когда я нажимаю span, он возвращает мне div, и это понятно.

Есть что-то вроде node.parentElement.dataset.dataCell, чтобы получить то, что мне нужно?

<table> 
<tr> 
    <td class="out" data-cell="3-2-2015"> 
    <div> 
     <span> Number one </span> 
     <span> Number two </span> 
     <span> Number three </span> 
    </div> 
    </td> 
</tr> 
</table> 
+0

Что вы попробовали? * 'node.parentElement.dataset.dataCell' * Это работало? – Mouser

+0

@Jonathan От ребенка к родительскому с помощью querySelectorAll? – Mouser

+0

@Mouser Нет, console.log возвращает «undefined» –

ответ

1

document.querySelector("table").addEventListener("click", function(e){ 
 
     var element = e.target; 
 
     var found = false; 
 
     if (element.tagName != "TABLE") 
 
     { 
 
      while(element && element.parentElement && element.tagName != "TABLE") 
 
      { 
 
       if (element.hasAttribute("data-cell")) 
 
       { 
 
        found = element.getAttribute("data-cell"); 
 
        break; //stop the loop; 
 
       } 
 
       element = element.parentElement; 
 
      } 
 
     } 
 
     
 
     alert(found); 
 
    });
<table> 
 
<tr> 
 
    <td class="out" data-cell="3-2-2015"> 
 
    <div> 
 
     <span> Number one </span> 
 
     <span> Number two </span> 
 
     <span> Number three </span> 
 
    </div> 
 
    </td> 
 
</tr> 
 
<tr> 
 
    <td class="out" > 
 
    <div> 
 
     <span> Number one </span> 
 
     <span> Number two </span> 
 
     <span> Number three </span> 
 
    </div> 
 
    </td> 
 
</tr> 
 
    
 
</table>

Это будет делать это:

Использует время цикла для перебора обратно DOM дерева с помощью parentElement. Если найден атрибут data-cell, возвращаем элемент и разбиваем цикл, если нет, тогда возвращаем false.

+0

Не работает. Появится окно предупреждения: [object HTML TableCellElement] –

+0

И что? Это имеет смысл, поскольку «найденный» является объектом HTML. –

+0

Работает как очарование. В if в цикле добавьте '.getAttribute (" data-cell ")' after element. – Mouser

1

Вот один из способов сделать это:

HTML:

<table> 
    <tr> 
     <td class="out" data-cell="3-2-2015"> 
      <div class="div clicker"> 
       <span class="span clicker"> Number one </span> 
       <span class="span clicker"> Number two </span> 
       <span class="span clicker"> Number three </span> 
      </div> 
     </td> 
    </tr> 
</table> 

JavaScript:

// generic functions 
window.getAncestorWithAttribute = function(elem,attr) { 
    elem = elem.parentNode; 
    while (elem) { 
     if (elem.hasAttribute(attr)) 
      return elem; 
     elem = elem.parentNode; 
    } // end while 
    return null; 
}; // end getAncestorWithAttribute() 

// event handlers 
window.mainClickCallback = function(ev) { alert(getAncestorWithAttribute(ev.target,'data-cell')); ev.stopPropagation(); }; 

// attach event handlers to target elements 
Array.forEach(document.getElementsByClassName('clicker'), function(elem) { elem.addEventListener('click', mainClickCallback); }); 

http://jsfiddle.net/z8fba8jg/4/

+0

Не работает. Не знаю, может быть, мой вопрос непонятен. Но мне нужно, чтобы получить td (который должен быть найден по его атрибуту данных) при нажатии элементов div или span. –

+0

См. Обновленный ответ. Дайте мне знать, если это то, что вы ищете. – bgoldst

0

document.querySelector("table").addEventListener("click", function(e){ 
 
     var element = e.target; 
 
     var found = false; 
 
     if (element.tagName != "TABLE") 
 
     { 
 
      while(element && element.parentElement && element.tagName != "TABLE") 
 
      { 
 
       if (element.hasAttribute("data-cell")) 
 
       { 
 
        found = element.getAttribute("data-cell"); 
 
        break; //stop the loop; 
 
       } 
 
       element = element.parentElement; 
 
      } 
 
     } 
 
     
 
     alert(found); 
 
    });
<table> 
 
<tr> 
 
    <td class="out" data-cell="3-2-2015"> 
 
    <div> 
 
     <span> Number one </span> 
 
     <span> Number two </span> 
 
     <span> Number three </span> 
 
    </div> 
 
    </td> 
 
</tr> 
 
<tr> 
 
    <td class="out" > 
 
    <div> 
 
     <span> Number one </span> 
 
     <span> Number two </span> 
 
     <span> Number three </span> 
 
    </div> 
 
    </td> 
 
</tr> 
 
    
 
</table>

Смежные вопросы