javascript - 稍后通过 Javascript 添加的元素上的 Javascript 执行失败
问题描述
在我目前正在处理的一个项目中,有许多项目必须打开一个对话框。对于每个新对话框,里面的数据都会发生变化,而我已经使用 Javascript 完成了这些数据。现在,如果我从 Javascript 向对话框中添加任何元素,例如复选框,则 Material js 无法处理它。所以我检查了一个类似的问题并得到了答案,我已经实施了但仍然无法正常工作。在这个片段中,我做了类似的情况。添加按钮用于添加到对话框,当对话框打开时,复选框的行为与页面加载期间对话框中的行为不同。为了显示这一点,我在其自身之前添加了一个复选框,而不是来自 Javascript。从 Javascript 添加复选框后,旧的现有复选框也不起作用。
请帮助我,这将有很大的帮助。
function resetJs(path) {
var scripts = document.getElementsByTagName('script'),
newScript = document.createElement("script");
newScript.src = path + "?timestamp=" + Math.round(new Date().getTime() / 1000);
for (var i = 0; i < scripts.length; ++i) {
var srcUrl = scripts[i].getAttribute('src');
if (srcUrl && srcUrl.indexOf(path) > -1) {
scripts[i].parentNode.replaceChild(newScript, scripts[i]);
}
}
}
var dialog = document.querySelector('dialog');
var addData = document.querySelector('#add');
addData.addEventListener('click', function() {
var data = document.querySelector('#dialogContent');
data.innerHTML += '<label class="mdl-checkbox mdl-js-checkbox mdl-js-ripple-effect" for="checkbox-1"><input type="checkbox" id="checkbox-1" class="mdl-checkbox__input" checked><span class="mdl-checkbox__label">Checkbox From JS</span></label>';
});
var showDialogButton = document.querySelector('#show-dialog');
if (!dialog.showModal) {
dialogPolyfill.registerDialog(dialog);
}
showDialogButton.addEventListener('click', function() {
dialog.showModal();
resetJs('https://code.getmdl.io/1.3.0/material.min.js');
});
dialog.querySelector('.close').addEventListener('click', function() {
dialog.close();
});
<link href="https://code.getmdl.io/1.3.0/material.indigo-pink.min.css" rel="stylesheet"/>
<script src="https://code.getmdl.io/1.3.0/material.min.js"></script>
<button id="show-dialog" type="button" class="mdl-button">Show Dialog</button>
<button id="add" type="button" class="mdl-button">Add</button>
<dialog class="mdl-dialog">
<h4 class="mdl-dialog__title">Allow data collection?</h4>
<div class="mdl-dialog__content" id="dialogContent">
<label class="mdl-checkbox mdl-js-checkbox mdl-js-ripple-effect" for="checkbox-1"><input type="checkbox" id="checkbox-1" class="mdl-checkbox__input" checked><span class="mdl-checkbox__label">Checkbox Added Before</span></label>
<p>
Allowing us to collect data will let us get you the information you want faster.
</p>
</div>
<div class="mdl-dialog__actions">
<button type="button" class="mdl-button">Agree</button>
<button type="button" class="mdl-button close">Disagree</button>
</div>
</dialog>
解决方案
从mdl
这里的文档
Material Design Lite 将在页面加载时自动注册和渲染所有标记有 MDL 类的元素。但是,在动态创建 DOM 元素的情况下,您需要使用 upgradeElement 函数注册新元素。
所以,你能做的就是在你的addData
函数中;
var addData = document.querySelector("#add");
addData.addEventListener("click", function() {
var data = document.querySelector("#dialogContent");
var label = document.createElement("label");
label.className = "mdl-checkbox mdl-js-checkbox mdl-js-ripple-effect";
label.innerHTML =
'<input type="checkbox" id="checkbox-1" class="mdl-checkbox__input" checked><span class="mdl-checkbox__label">Checkbox From JS</span>';
label.htmlFor = "checkbox-1";
componentHandler.upgradeElement(label);
data.appendChild(label);
});
您需要使用 componentHandler.upgradeElement 将动态创建的元素升级为材料元素,然后将子元素附加到数据中。
请看一下这个代码框
推荐阅读
- ios - 如何在调整栏大小时为导航栏大标题设置动画?
- angular - 如何在 Angular 6 中设置嵌套组件的样式?
- svg - SVG:带有以百分比单位表示的 y 属性的行不受 viewBox 的影响
- javascript - 在为 onclick 功能创建按钮时被覆盖
- html - HTML 5 Canvas - 密钥对值
- python - 将小数分配给变量 Python
- raspberry-pi - GPS 模块闪烁,但没有使用 RPi 3 接收任何数据
- build - CMake:安装阶段后如何在目标二进制文件上设置上限?
- java - 在哪里添加片段的方法?
- jquery - 如何通过使用jquery单击复选框来对项目列表进行排序?