- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
关闭。这个问题需要debugging details .它目前不接受答案。
想改进这个问题?将问题更新为 on-topic对于堆栈溢出。
去年关闭。
Improve this question
这是论坛上的 HTML:
<div class="sign">username <span class="info">info</span></div>
这是我需要使用用户脚本更改它的方法:
<div class="sign"><a itemprop="creator">username</a> <span class="info">info</span></div>
我知道如何创建
a
元素,为其分配一个自定义属性,并将其添加到 DOM。
username
用它。即如何转换
username
从第一个示例到
<a itemprop="creator">username</a>
在第二个例子中。
a
元素将有
href
也是。我故意省略了它以使代码更短。
最佳答案
使用 vanilla DOM API 执行此操作有点复杂,但并不难。您需要找到包含要替换的片段的 DOM 文本节点,将其分成三部分,然后将中间部分替换为您想要的节点。
如果你有一个文本节点 textNode
并想要替换索引 i
中的文本索引 j
由 replacer
计算的节点,您可以使用此功能:
function spliceTextNode(textNode, i, j, replacer) {
const parent = textNode.parentNode;
const after = textNode.splitText(j);
const middle = i ? textNode.splitText(i) : textNode;
middle.remove();
parent.insertBefore(replacer(middle), after);
}
调整您的示例,您将不得不像这样使用它:
function spliceTextNode(textNode, i, j, replacer) {
const parent = textNode.parentNode;
const after = textNode.splitText(j);
const middle = i ? textNode.splitText(i) : textNode;
middle.remove();
parent.insertBefore(replacer(middle), after);
}
document.getElementById('inject').addEventListener('click', () => {
const textNode = document.querySelector('div.sign').firstChild;
const m = /\w+/.exec(textNode.data);
spliceTextNode(textNode, m.index, m.index + m[0].length, node => {
const a = document.createElement('a');
a.itemprop = 'creator';
a.href = 'https://example.com/';
a.title = "The hottest examples on the Web!";
a.appendChild(node);
return a;
})
}, false);
/* this is to demonstrate other nodes underneath the <div> are untouched */
document.querySelector('.info').addEventListener('click', (ev) => {
ev.preventDefault();
alert('hello');
}, false);
<div class="sign">@username: haha, <a href="http://example.org" class="info">click me too</a></div>
<p> <input id="inject" type="button" value="inject link">
innerHTML
将无法保留这一点。
关于javascript - 用新元素包装一部分innerHTML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66940835/
我正在用 Java 编写代码,并且使用 Vaadin 8 扩展。 我有一个 Vaadin 组合盒,效果很好。但我不仅想从组合框中选择项目,还想选择书面输入。这意味着我想使用组合框作为下拉菜单以及文本编
我正在尝试将 AJAX 添加到 JQuery ListView 中并呈黄色闪烁,但我似乎无法使其正常工作。谁能指出我正确的方向? http://jsfiddle.net/zFybm/ 最佳答案 根据
我有这个样式表: .pixel{ position: absolute; height: 10px; width: 10px; background-color: #f
这是我用来将新行推送到容器的一行代码: this.$el.append(new ItemView(item).render().el); 其中item是Backbone.js model,render
我正在尝试在 anguar.js 中制作一些测试应用程序,但遇到了问题。我的 js 文件包含: live = angular.module('live',[]); live.controller('p
如何绑定(bind)页面加载后创建的新元素? 我有这样的东西 system = function() { this.hello = function() { alert
html5 新元素(页眉、导航、页脚等)在 IE 中不工作 最佳答案 您需要包含 HTML5 shiv 脚本以允许在旧版 IE 浏览器中设置 HTML5 元素的样式:http://code.googl
我是一名优秀的程序员,十分优秀!