#javascript #html #material-design #material-design-lite
#javascript #HTML #материал-дизайн #материал-дизайн-lite
Вопрос:
У меня есть 4 вкладки mdl, где я динамически создаю список карточек mdl в каждой. На каждой карточке есть mdl-меню, созданное следующим образом:
// job settings dropdown :
settingsButton.setAttribute('id', 'jobSettings');
var jobUl = document.createElement('ul');
jobUl.className = 'mdl-menu mdl-menu--bottom-right mdl-js-menu mdl-js-ripple-effect';
jobUl.setAttribute('for', 'jobSettings');
var jobLi = document.createElement('li');
var jobLi2 = document.createElement('li');
var jobLi3 = document.createElement('li');
jobLi.className = 'mdl-menu__item';
jobLi2.className = 'mdl-menu__item';
jobLi3.className = 'mdl-menu__item';
jobLi.textContent = 'Edit';
jobLi2.textContent = 'Delete';
jobLi3.textContent = 'Pay';
jobUl.appendChild(jobLi);
jobUl.appendChild(jobLi2);
jobUl.appendChild(jobLi3);
Который будет отображаться в html примерно так:
<ul class="mdl-menu mdl-menu--bottom-right mdl-js-menu mdl-js-ripple-effect"
for="demo-menu-lower-right">
<li class="mdl-menu__item">Edit</li>
<li class="mdl-menu__item">Delete</li>
<li class="mdl-menu__item">Pay</li>
Затем я componentHandler.upgradeDom();
надеюсь обновить элементы mdl-menu в каждом неупорядоченном списке (ul).
Похоже, это работает только для ОДНОГО элемента списка (li) на всем веб-сайте. это не работает для любого другого элемента на любой другой вкладке. Как мне заставить мое mdl-меню работать с каждым динамически создаваемым элементом списка в каждом динамически создаваемом ul?
Ответ №1:
Проблема может заключаться в том, что вы дублируете id
значение в нескольких элементах меню (MDL запутается, если есть более одной кнопки со id
значением, совпадающим со for
значением в вашем элементе меню). Вы могли бы добавить числовое приращение к своим значениям id
и for
, чтобы гарантировать, что каждое меню уникально идентифицировано. Смотрите следующий пример.
const fragment = document.createDocumentFragment();
const addCard = (n) => {
const card = document.createElement('div');
const menu = document.createElement('div');
const button = document.createElement('button');
const icon = document.createElement('i');
const ul = document.createElement('ul');
card.className = 'mdl-card mdl-shadow--2dp';
menu.className = 'mdl-card__menu';
button.id = `menu${n}`;
button.className = 'mdl-button mdl-js-button mdl-button--icon';
icon.className = 'material-icons';
icon.textContent = 'more_vert';
ul.className = 'mdl-menu mdl-menu--bottom-right mdl-js-menu mdl-js-ripple-effect';
ul.setAttribute('for', `menu${n}`);
fragment.appendChild(card);
card.appendChild(menu);
menu.appendChild(button);
button.appendChild(icon);
menu.appendChild(ul);
for (const action of ['Action 1', 'Action 2', 'Action 3']) {
const li = document.createElement('li');
li.textContent = action;
li.className = 'mdl-menu__item';
ul.appendChild(li);
}
};
for (let i = 0; i < 2; i ) {
addCard(i);
}
document.querySelector('#container').appendChild(fragment);
componentHandler.upgradeDom();
.mdl-card {
margin: 8px;
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Material Design Lite Cards / Menus</title>
<link rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material Icons">
<link rel="stylesheet" href="https://code.getmdl.io/1.3.0/material.indigo-pink.min.css">
</head>
<body>
<div id="container"></div>
<script src="https://code.getmdl.io/1.3.0/material.min.js"></script>
</body>
</html>
Комментарии:
1. это сделало это, идентификаторы были одинаковыми. Спасибо! я извлекаю данные из Google firestore, поэтому я просто изменил идентификатор на текущий идентификатор документа. поскольку каждая карточка представляет документ и у каждого документа свой идентификатор, каждый элемент получил свой идентификатор!