Проблема может заключаться в том, что вы дублируете значение id
для нескольких элементов меню (MDL будет сбит с толку, если имеется более одной кнопки со значением id
, которое соответствует значению for
в вашем элементе меню),Вы можете добавить числовое приращение к значениям id
и for
, чтобы обеспечить уникальную идентификацию каждого меню.
См. Следующий пример.Обратите внимание, что Object.assign
используется для небольшого сокращения кода, но из-за ограничений нам все еще нужно использовать setAttribute
для установки атрибута for
элемента ul
, так как этот атрибут не доступен напрямую.
const fragment = document.createDocumentFragment();
const addCard = (n) => {
let card = document.createElement('div');
let menu = document.createElement('div');
let button = document.createElement('button');
let icon = document.createElement('i');
let list = document.createElement('ul');
let items = ['Action 1', 'Action 2', 'Action 3'];
icon.textContent = 'more_vert';
Object.assign(card, {className: 'mdl-card mdl-shadow--2dp'});
Object.assign(menu, {className: 'mdl-card__menu'});
Object.assign(button, {
className: 'mdl-button mdl-js-button mdl-button--icon',
id: 'menu' + n
});
Object.assign(icon, {className: 'material-icons'});
Object.assign(list, {
className: 'mdl-menu mdl-menu--bottom-right mdl-js-menu mdl-js-ripple-effect'
});
list.setAttribute('for', 'menu' + n);
fragment.appendChild(card);
card.appendChild(menu);
menu.appendChild(button);
button.appendChild(icon);
menu.appendChild(list);
for (let item of items) {
let listItem = document.createElement('li');
listItem.textContent = item;
Object.assign(listItem, {className: 'mdl-menu__item'});
list.appendChild(listItem);
}
}
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>