Как я могу вставить строку HTML в элемент? - PullRequest
4 голосов
/ 20 августа 2010

Используя Mootools, мы можем вставить элемент в другой элемент:

$('childID').inject($('parentID'), 'top');

Второй параметр позволяет мне контролировать местоположение и может быть «верхним» или «нижним», чтобы добавить его в родительский элемент.объект или «до» или «после», чтобы вставить его как родного брата.

Мы также можем установить HTML-элемент из строки:

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

Моя проблема в том, что я хочуиметь такую ​​же гибкость со строками, как и с элементами.Я не могу, например, поместить строку вверху элемента, используя set(), так как это переписывает HTML, а не добавляет его в определенном месте.Точно так же я не могу добавить HTML после или перед элементом родственного элемента.

Есть ли функция, которая позволит мне вводить строки так же, как я вставляю элементы?

Ответы [ 7 ]

5 голосов
/ 20 августа 2010

Лучшее решение

Метод ввода будет выглядеть следующим образом:

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() к эл.Это необходимо для введения элементов в правильном порядке.В противном случае они вводят, например, второй 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);
    }
});

Это позволит вам использовать функцию ввода для любой переменной, содержащей строку.Убедитесь, что вы не помещаете это в событие domready, т.е. до window.addEvent('domready', function() { ... });

Теперь сама функция инъекции будет выглядеть так:

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

Это создаст элемент p и добавитон находится в верхней части parentID.

Альтернативное решение

Если вы просто хотите использовать инъекцию с «верхним» и «нижним» местоположениями, вы можете использовать вместо этого метод инъекции:

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), преимущество в скорости также было бы обращено вспять (я не проверял разницу в скорости, так что это всего лишь обоснованное предположение, и оно может быть незначительным).

Недостатком, однако, является то, что мы не можем легко использовать его с местоположениями «после» и «до».

5 голосов
/ 20 августа 2010

Вставка внизу:

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

Вставка вверху:

foo.innerHTML = 'string' + foo.innerHTML;
2 голосов
/ 27 августа 2010

Вы ищете appendText.Пример, аналогичный документации Mootools:

http://mootools.net/docs/core/Element/Element#Element:appendText

HTML

<div id="myElement">partner.</div>

JavaScript

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

Второй (где) аргумент по умолчанию равен'bottom', но также принимает 'top', 'bottom', 'before' и 'after'.

Результирующий HTML

<div id="myElement">Howdy, partner.</div>

Рабочий пример:

http://jsfiddle.net/hq5Gr/

1 голос
/ 20 августа 2010

пара вещей, на которые вы должны обратить внимание:

Во-первых, slick и mootools 1.3 предлагают «более приятный» новый конструктор Element, который может очень просто добавлять и настраивать элементы из разметки псевдостроки:

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)

, и вы также можете использовать Slick с более старыми версиями mootools, хотя я не могу найти сутьдля этого, напишите здесь, если вам интересно.Ночная версия довольно стабильна, но релиз 1.3 ожидается в ближайшее время.

1 голос
/ 20 августа 2010

Попробуйте это:

var foo = "<p>Some text</p>"
$('parentID').set('html', foo + $('parentID').get('html')); // prepend/top
$('parentID').set('html', $('parentID').get('html') + foo)); // append/bottom
0 голосов
/ 14 апреля 2015

@ ответ shanebo близок, но appendText избегает HTML.

Попытка:

http://mootools.net/core/docs/1.5.1/Element/Element#Element:appendHTML

$('myElement').appendHTML('<div>Hello world</div>', 'top');

Скрипка: http://jsfiddle.net/m0ez1t50/1/

0 голосов
/ 22 августа 2010

Вы хотите использовать текстовые узлы.

Чтобы добавить текст к элементу:

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

Чтобы добавить текст к элементу:

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

Изменитьзначение текстового узла, вы бы сделали yourTextNode.nodeValue = "new value here".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...