【发布时间】:2016-09-16 15:23:56
【问题描述】:
我正在创建一个 JavaScript 插件,它需要在通过 JavaScript 操作之前在网页上呈现相当大/复杂的 HTML 结构。我根本不想使用 jQuery。
我希望能够将所有必需的代码捆绑在一个 JS 文件中,该文件可以加载到父网页中,然后它会“做它的事情”。我宁愿父页面不必包含任何额外的 HTML/CSS 才能工作 - 我希望所有内容都来自单个 JS 资源。
目前我在一个 JavaScript 变量中有一大块 HTML 作为字符串:
var templateBirthday = '\
<section class="pwag-clearfix pwag-birthday-groups">\
<div class="pwag-clearfix pwag-birthday-groups__inner">\
<div class="pwag-birthday-group">\
<p class="pwag-birthday-group__instruction">Enter the year of your birth</p>\
<div class="pwag-date-box pwag-date-box--valid pwag-date-box--0">\
<span class="pwag-date-box__value">1</span>\
<span class="pwag-date-box__placeholder">Y</span>\
<input type="number" class="pwag-date-box__input" />\
</div>\
<div class="pwag-date-box pwag-date-box--valid pwag-date-box--1">\
<span class="pwag-date-box__value">9</span>\
<span class="pwag-date-box__placeholder">Y</span>\
<input type="number" class="pwag-date-box__input" />\
</div>\
<div class="pwag-date-box pwag-date-box--2">\
<span class="pwag-date-box__value"></span>\
<span class="pwag-date-box__placeholder">Y</span>\
<input type="number" class="pwag-date-box__input" />\
</div>\
<div class="pwag-date-box pwag-date-box--3">\
<span class="pwag-date-box__value"></span>\
<span class="pwag-date-box__placeholder">Y</span>\
<input type="number" class="pwag-date-box__input" />\
</div>\
</div>\
<div class="pwag-birthday-group">\
<p class="pwag-birthday-group__instruction">Enter the month of your birth</p>\
<div class="pwag-date-box pwag-date-box--4">\
<span class="pwag-date-box__value"></span>\
<span class="pwag-date-box__placeholder">M</span>\
<input type="number" class="pwag-date-box__input" />\
</div>\
<div class="pwag-date-box pwag-date-box--5">\
<span class="pwag-date-box__value"></span>\
<span class="pwag-date-box__placeholder">M</span>\
<input type="number" class="pwag-date-box__input" />\
</div>\
</div>\
<div class="pwag-birthday-group">\
<p class="pwag-birthday-group__instruction">Enter the day of your birth</p>\
<div class="pwag-date-box pwag-date-box--6">\
<span class="pwag-date-box__value"></span>\
<span class="pwag-date-box__placeholder">D</span>\
<input type="number" class="pwag-date-box__input" />\
</div>\
<div class="pwag-date-box pwag-date-box--7">\
<span class="pwag-date-box__value"></span>\
<span class="pwag-date-box__placeholder">D</span>\
<input type="number" class="pwag-date-box__input" />\
</div>\
</div>\
</div>\
<div class="pwag-clearfix pwag-feedback">\
<span class="pwag-feedback__message pwag-feedback__message--year">The year you entered is invalid</span>\
<span class="pwag-feedback__message pwag-feedback__message--month">The month you entered is invalid</span>\
<span class="pwag-feedback__message pwag-feedback__message--day">The day you entered is invalid</span>\
<span class="pwag-feedback__message pwag-feedback__message--notLegal">You are not old enough to enter this site</span>\
</div>\
</section>\
';
然后我将其渲染到父页面中,如下所示:
function appendHtml(el, str) {
var div = document.createElement('div');
div.innerHTML = str;
while (div.children.length > 0) {
el.appendChild(div.children[0]);
}
}
appendHtml(document.body, templateBirthday);
它工作正常;我在页面上看到了 HTML。但是,现在我需要能够从同一个 JS 文件中操作各种 HTML 元素。例如,我想这样做:
document.querySelectorAll('.pwag-date-box')[0].style.border = '10px solid #f00';
但是,由于 HTML 是动态插入的,因此似乎无法通过使用 vanilla JS 中的标准 document.querySelectorAll 类型的方法访问它。
我担心我唯一的选择可能是将大量的 HTML 创建为“正确的”JavaScript 对象而不是字符串。我希望有一种方法可以欺骗并使用 HTML 字符串。
有谁知道是否可以在作为字符串插入 DOM 的 HTML 上使用标准 JS 选择器?
非常感谢,
丹
【问题讨论】:
-
对不起,那是我的伪代码 :) 我已经修改了问题,所以它应该只返回一个要修改的节点。
-
这取决于您何时要在事件上操作 html- 或在插入事件之后。无论如何它应该可以工作,只要确保在插入后对其进行操作
-
如果您要搜索类名,我建议您使用 getElementsByClassName。否则,只要在添加 html 元素后编辑文档就可以了。这样做的原因是 getElementsByClassName 返回变量列表而不是静态列表。更多信息在这里:stackoverflow.com/a/18735248/6270761
-
@sTx - 我相信这是一个执行顺序问题。谢谢你的推动。正在调查...
-
只要您注意操作顺序,脚本就可以工作(fiddle)
标签: javascript dom