最佳解决方案
注入方法将如下所示:
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”位置一起使用。