如何将HTML字符串注入到元素中?

4
使用Mootools,我们可以将一个元素注入到另一个元素中:
$('childID').inject($('parentID'), 'top');

第二个参数允许我控制位置,可以是“top”或“bottom”将其注入到父对象中,也可以是“before”或“after”将其注入为同级元素。
我们还可以通过字符串设置元素的HTML内容:
var foo = "<p>Some text</p>";
$('parentID').set('html', foo);

我的问题是我希望字符串能像元素一样灵活。例如,使用set()将字符串放在元素顶部时,它会覆盖HTML而不是在特定位置附加它。同样地,我无法在兄弟元素之后或之前附加HTML。

是否有一个函数可以让我以与注入元素相同的方式注入字符串?

8个回答

6

在底部插入:

foo.innerHTML = foo.innerHTML + 'string';

在顶部插入:
foo.innerHTML = 'string' + foo.innerHTML;

5

最佳解决方案

注入方法将如下所示:

inject: function(element, location) {
    var el = Elements.from(this);

    if($type(el) === 'array') var el = el.reverse();

    return el.inject(element, location);
}

让我们分解一下。

1) Elements.from(this) 将会把这个方法应用的内容转换成元素:

var foo = "<p>Some text</p>";
var el = Elements.from(foo);
//el is equal to a p element. 

var bar = "<div>First div</div><div>Second div</div>";
var el = Elements.from(bar);
//el is equal to an array containing 2 div elements

2) if($type(el) === 'array') 检查 el 是否为数组。如果是,则应用 .reverse() 到 el,以确保元素按正确的顺序注入。否则,它们将按照错误的顺序注入,例如第二个 div 将先于第一个 div 注入。显然,如果 el 只是一个单一元素,我们不需要改变其顺序。

3) 最后,我们只需使用原始的 inject 方法将 el 注入到 element 参数中指定的元素中,并将其放置在 location 参数中指定的位置。如果 el 是一个元素数组,它们都将被成功注入。

为了能够使用此函数,我们必须将其添加为字符串对象的方法。要执行此操作,您必须使用 implement()

String.implement({
    inject: function(element, location) {
        var el = Elements.from(this);

        if($type(el) === 'array') var el = el.reverse();

        return el.inject(element, location);
    }
});

这将允许您在任何包含字符串的变量上使用inject函数。请确保不要将其放置在domready事件内,即window.addEvent('domready', function() { ... });之前。

现在,inject函数本身将如下所示:

var foo = "<p>Some text</p>";
foo.inject($('parentID'), 'top');

这将创建一个p元素,并将其注入到parentID的顶部。

替代方案

如果您只想使用'top'和'bottom'位置的inject方法,可以改用以下inject方法:

inject: function(element, location) {
    var html = element.get('html')

    if(location === 'top') return element.set('html', this + html);
    else if (location === 'bottom') return element.set('html', html + this);
}

该方法将获取您需要转换的元素的innerHTML,并将字符串与该HTML连接或将HTML与该字符串连接,分别将字符串放置在元素的顶部或底部。然后将元素的innerHTML设置为此值。
该方法的优点是,只要元素的innerHTML不太大,这可能会更快,因为我们不需要创建新元素,如果字符串包含许多顶级兄弟元素,则可能会耗费时间。显然,如果情况反过来(少量顶级兄弟和小innerHTML),速度优势也将反转(我尚未测试速度差异,因此这只是一种有教育意义的猜测,可能是微不足道的)。
然而,缺点是我们不能轻松地将其与“after”和“before”位置一起使用。

2
你正在寻找appendText。以下是类似于Mootools文档的示例: http://mootools.net/docs/core/Element/Element#Element:appendText HTML
<div id="myElement">partner.</div>

JavaScript

$('myElement').appendText('Howdy, ', 'top');

第二个(where)参数默认为“bottom”,但也接受“top”,“bottom”,“before”和“after”。
生成的HTML为:
<div id="myElement">Howdy, partner.</div>

示例:

http://jsfiddle.net/hq5Gr/

这是一个演示示例的链接。

1

试试这个:

var foo = "<p>Some text</p>"
$('parentID').set('html', foo + $('parentID').get('html')); // prepend/top
$('parentID').set('html', $('parentID').get('html') + foo)); // append/bottom

1

有几件事情你应该看一下,可能会有所帮助。

首先,slick和mootools 1.3提供了一个“更好”的新元素构造器,可以非常好地从伪字符串标记中添加和配置元素:

http://www.jsfiddle.net/dimitar/aQvpb/

new Element('div#myId.myClass.myOtherClass[title=Mouseover Title][text=Dimitar Was Here]').injectAfter(document.id("foo"));

new Element("input#someID.someClass1.someClass2[disabled=true]");

其次,element.injectAfter(previousEl)element.injectBefore(followingEl)在将元素注入到特定节点之前或之后也非常有用。
绝对不要通过重写旧的HTML或任何未委派的元素事件来附加HTML(新的UID),否则它们将会消失。
您也可以在旧版本的Mootools中使用Slick,尽管我目前无法找到相关的要点,请在此处发布您的帖子以获取更多信息。当前的夜间版本相当稳定,但1.3版本即将发布。

1
您可以使用insertAdjacentHTML()函数。
const divInString = '<div class="todo">Stuff</div>'
const parentOfDiv = document.querySelector(".parent")
parentOfDiv.insertAdjacentHTML("beforeEnd",divInString) 
// "afterEnd , "beforeBegin","afterBegin"  

// 我也在寻找解决这个问题的方法,以下是解决问题的步骤。


0

0

您想要使用文本节点。

要将文本附加到元素:

var yourTextNode = element.appendChild(document.createTextNode("some text"))

在元素前添加文本:

var yourTextNode = element.parentNode.insertBefore(document.createTextNode("some text"), element)

要更改文本节点的值,您需要执行yourTextNode.nodeValue = "new value here"


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接