1
<div class="b1"></div>
<div class="b2"></div>
<div class="b3"></div>
function create(htmlStr){
    var frag = document.createDocumentFragment(),
    temp = document.createElement('div');
    temp.innerHTML = htmlStr;
    while (temp.firstChild){
        frag.appendChild(temp.firstChild);
    }
    return frag;
}

var _bM=document.getElementsByClassName('.b'+1);

_bM.appendChild(create('<img src="'+some_data+'"class="q q'+some_var+'"/>'));

Uncaught TypeError: Object #<NodeList> has no method 'appendChild'

然而:

var _bM=document.getElementsByClassName('.b'+1)[0];

Uncaught TypeError: Cannot call method 'appendChild' of undefined

我在 chrome 版本 31 上。我试图做纯 javascript 而不是 jquery,因为我需要速度并且必须使用类而不是 id。为什么会这样?

4

3 回答 3

3

使用document.getElementsByClassName('b'+1)代替document.getElementsByClassName('.b'+1)

.你不需要getElementsByClassName

于 2013-10-07T18:08:12.470 回答
1

您不应该在 JavaScript 中为类名添加点前缀。干脆var _bM=document.getElementsByClassName('b'+1)[0];就行。

于 2013-10-07T18:08:28.443 回答
0

除了其他答案。如果您需要跨浏览器解决方案,并且速度很重要,请尝试使用此脚本。适用于所有现代和旧版浏览器。使用超快的 querySelectorAll。如果不可用,则降级为本机 getElementsByClassName。如果也不可用,仍然可以(速度较慢,但​​即使在非常旧的 IE 中仍然有效)。这是一个代码:

function gEByClass(cName, el) {
getElementsByClass = function(getClass){
el = el||document;
if(el.querySelectorAll) {
return el.querySelectorAll("." + getClass);
}
else if(el.getElementsByClassName) {
return el.getElementsByClassName(getClass);
}
else {
var list = el.getElementsByTagName('*'), i = list.length,
classArray = getClass.split(/\s+/), result = [];
while(i--) {
if(list[i].className.search('\\b' + classArray + '\\b') != -1) {
result.push(list[i]);
}
}
return result;
}
};
return getElementsByClass(cName);
}
于 2013-10-07T18:53:14.217 回答