#javascript #materialize
Вопрос:
Я использовал tingle.js и pikday, и теперь я хочу использовать материализованный css, потому что он получил как модальный, так и выбор дня.
В tingle я добавляю кнопки, и действие после нажатия кнопки легко
//add a button
modal.addFooterBtn('Button label', 'tingle-btn tingle-btn--primary', function() {
// here goes some logic
modal.close();
});
// add another button
modal.addFooterBtn('Dangerous action !', 'tingle-btn tingle-btn--danger', function() {
// here goes some logic
modal.close();
});
Я настроил несколько кнопок в Materialize https://jsfiddle.net/radek/onzx31q6/6/ но я не знаю, как узнать, на какую кнопку нажали.
<div class="modal-footer">
<a href="#!" class=" modal-action modal-close waves-effect waves-green btn-flat">Agree</a>
<a href="#!" class=" modal-action modal-close waves-effect waves-red btn-flat">Disagree</a>
<a href="#!" class=" modal-action modal-close waves-effect waves-green btn-flat">Close</a>
</div>
Ответ №1:
Вы можете использовать пользовательский атрибут, чтобы отслеживать, какая кнопка была нажата для материализации, как я это сделал ниже.
(() => {
// the Modal.onClose event handler
const onCloseEnd = (modal) => {
const last = document.querySelector(`#${modal.id}`).getAttribute('data-clicked');
document.querySelector('#last-clicked').innerText = last;
};
// set up modals
const nodes = document.querySelectorAll('.modal');
const modals = M.Modal.init(nodes, {
onCloseEnd
});
// add event for footer buttons to change data-clicked property
nodes.forEach(node => {
node.querySelectorAll('.modal-footer a')
.forEach(btn => {
btn.addEventListener('click', evt => {
node.setAttribute('data-clicked', evt.target.innerText);
}, true);
});
});
})();
<!DOCTYPE html>
<html>
<head>
<link href="https://fonts.googleapis.com/icon?family=Material Icons" rel="stylesheet">
<link type="text/css" rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/materialize/1.0.0/css/materialize.min.css" media="screen,projection" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
</head>
<body>
<button data-target="modal1" class="btn modal-trigger">Modal</button>
<h5>You clicked: <span id="last-clicked">nothing</span></h5>
<div id="modal1" class="modal">
<div class="modal-content">
<h4>Modal Header</h4>
<p>A bunch of text</p>
</div>
<div class="modal-footer">
<a href="#!" class="modal-action modal-close waves-effect waves-green btn-flat">Agree</a>
<a href="#!" class="modal-action modal-close waves-effect waves-red btn-flat">Disagree</a>
<a href="#!" class="modal-action modal-close waves-effect waves-green btn-flat">Close</a>
</div>
</div>
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/materialize/1.0.0/js/materialize.min.js"></script>
</body>
</html>
Комментарии:
1. Я понял концепцию, которую вы предложили. Спасибо за это. Не могли бы вы, пожалуйста, объяснить самую первую и последнюю строку кода? Также определение
onCloseEnd
функции обратного вызова. Вы хотите, чтобы я создал для этого еще один вопрос?2. является ли атрибут ` node.setAttribute («щелчок по данным», evt.target.innerText);’будет запоминаться в следующий раз, когда будет открыт тот же модальный? Мне кажется, что нет. Знаете ли вы, почему?
3. Это
onCloseEnd
часть событий Материализации. Даdata-clicked
, атрибут сохраняется до тех пор, пока не будет нажата другая кнопка в этом модальном режиме. Вам нужно будет получить к нему доступ, когда он вам понадобится.node.getAttribute('data-clicked')
4. Я имел в виду синтаксис
(() => {
, определение функцийconst onCloseEnd = (modal) => {