2010-09-28 15 views
212

quiero reemplazar el contenido dentro de un elemento HTML, así que estoy usando la siguiente función para la que:Cómo obtener elementos por clase en JavaScript?

function ReplaceContentInContainer(id,content) { 
    var container = document.getElementById(id); 
    container.innerHTML = content; 
} 

ReplaceContentInContainer('box','This is the replacement text'); 

<div id='box'></div> 

Lo anterior funciona muy bien, pero el problema es que tengo más de un elemento HTML en una página que me quiere reemplazar el contenido de. Entonces no puedo usar identificadores sino clases. Me han dicho que javascript no admite ningún tipo de elemento get incorporado por función de clase. Entonces, ¿cómo se puede revisar el código anterior para que funcione con clases en lugar de identificadores?

P.S. No quiero usar jQuery para esto.

+28

@ Hello71 si dos razones. Uno de los cms en el que quiero implementar esto (usado en el trabajo) se rompe cuando se agrega jquery (no sé por qué). 2 parece poco probable llamar a un archivo comprimido de 70k para usar solo la función .html(). De hecho, me encanta jQuery :) – Taylor

+0

¿Qué navegadores deben ser compatibles? –

+0

todas las versiones actuales de FF, Safari, Opera, Chrome e IE8, 7 e incluso 6. Yo personalmente nunca soportaría 6, pero es un requisito en el trabajo. – Taylor

Respuesta

189

T su código debería funcionar en todos los navegadores.

function replaceContentInContainer(matchClass, content) { 
    var elems = document.getElementsByTagName('*'), i; 
    for (i in elems) { 
     if((' ' + elems[i].className + ' ').indexOf(' ' + matchClass + ' ') 
       > -1) { 
      elems[i].innerHTML = content; 
     } 
    } 
} 

La forma en que funciona es haciendo un bucle a través de todos los elementos del documento, y buscando su lista de clase para matchClass. Si se encuentra una coincidencia, el contenido se reemplaza.

jsFiddle Example, using Vanilla JS (i.e. no framework)

+5

+1 - Buena captura con los espacios, siempre me olvido de hacer eso ... voy a robar eso para mi respuesta;) class es una palabra reservada en javascript; no deberías usarlo para un nombre de variable aunque realmente no haga ningún daño (aún). –

+1

@no con esa función no necesita tener ningún contenido dentro del elemento que desea reemplazar. Puede tener una cadena allí o puede tenerla vacía. De cualquier forma, el texto de reemplazo aparecerá de repente allí cuando se llame a la función. – Taylor

+0

@Andrew Dunn, amigo, me gusta, lo tengo que funcionar y funciona incluso en IE6, ¡muchas gracias! – Taylor

104
document.querySelectorAll(".class"); 

Eso funcionará en navegadores "modernos" que implementen ese método.

function ReplaceContentInContainer(selector, content) { 
    var nodeList = document.querySelectorAll(selector); 
    for (var i = 0, length = nodeList.length; i < length; i++) { 
    nodeList[i].innerHTML = content; 
    } 
} 

ReplaceContentInContainer(".theclass", "HELLO WORLD"); 

Si desea proporcionar soporte para navegadores antiguos, se puede cargar un motor de selección independiente como Sizzle (4 KB Mini + gzip) o Peppy (10K mini) y caer de nuevo a él si el método querySelector nativa no se encuentra.

¿Es excesivo cargar un motor selector para que pueda obtener elementos con cierta clase? Probablemente. Sin embargo, las secuencias de comandos no son tan grandes y es posible que encuentre el motor de selección útil en muchos otros lugares en su secuencia de comandos.

+0

esto no funciona en ninguno de los IE lamentablemente. – Taylor

+0

@Taylor: Creo que funciona en IE8 (no 100% seguro, demasiado vago para googlearlo). A pesar de eso, agregué cierta información sobre la compatibilidad con versiones anteriores utilizando motores de selección de terceros. –

+16

'document.querySelector' funciona en IE8 y superior: http://caniuse.com/queryselector – Zeke

0

Creo que algo como:

function ReplaceContentInContainer(klass,content) { 
var elems = document.getElementsByTagName('*'); 
for (i in elems){ 
    if(elems[i].getAttribute('class') == klass || elems[i].getAttribute('className') == klass){ 
     elems[i].innerHTML = content; 
    } 
} 
} 

funcionaría

+1

si solo tiene un puñado de elementos en su página, de lo contrario, esta es la solución O (N) – jlarson

+0

getAttribute ('clase') parece para trabajar en todos menos en IE, entonces getAttribute ('className') funciona en IE – KeatsKelleher

5

Esto debería funcionar en casi cualquier navegador ...

function getByClass (className, parent) { 
    parent || (parent=document); 
    var descendants=parent.getElementsByTagName('*'), i=-1, e, result=[]; 
    while (e=descendants[++i]) { 
    ((' '+(e['class']||e.className)+' ').indexOf(' '+className+' ') > -1) && result.push(e); 
    } 
    return result; 
} 

usted debería ser capaz de utilizar de esta manera:

function replaceInClass (className, content) { 
    var nodes = getByClass(className), i=-1, node; 
    while (node=nodes[++i]) node.innerHTML = content; 
} 
157

Por supuesto, todos los navegadores modernos soportan ahora la siguiente manera simple:

var elements = document.getElementsByClassName('someClass'); 

pero ten en cuenta que no funciona con Internet Explorer 8 o antes. Ver http://caniuse.com/getelementsbyclassname

Además, no todos los navegadores devolverán un NodeList puro como se supone que deben.

Probablemente sea mejor utilizar su biblioteca de navegador cruzada favorita.

+0

Para IE8 puede usar [' querySelectorAll'] (https://developer.mozilla.org/en-US/docs/Web/API/Document/querySelectorAll). –

26

Un simple y una manera fácil

var cusid_ele = document.getElementsByClassName('custid'); 
for (var i = 0; i < cusid_ele.length; ++i) { 
    var item = cusid_ele[i]; 
    item.innerHTML = 'this is value'; 
} 
+0

No funciona con <= IE8. – rgtk

-14

Cuando algunos elementos carecen de identificación, utilizo jQuery así:

$(document).ready(function() 
{ 
    $('.myclass').attr('id', 'myid'); 
}); 

Esta podría ser una solución extraña, pero tal vez alguien que le resulte útil.

+2

Si hay varios elementos con la clase 'myclass', todos obtendrán el ID' myid', ¡pero los identificadores deben ser únicos! Además, OP explícitamente dice para evitar jQuery. – Oriol

+1

No es difícil agregar una cláusula foreach() e incremento de ID, si tiene varios elementos de la misma clase. Agregué esta solución como una alternativa para aquellos que pueden usar jQuery. OP ya obtuvo un montón de respuestas adecuadas de todos modos :-) –

+1

No veo aquí una etiqueta jQuery ... – iguider

6

Me sorprende que no haya respuestas usando expresiones regulares. Esto es más o menos Andrew's answer, usando RegExp.test en lugar de String.indexOf, ya que parece funcionar mejor para operaciones múltiples, de acuerdo con jsPerf tests.
También es seems to be supported on IE6.

function replaceContentInContainer(matchClass, content) { 
    var re = new RegExp("(?:^|\\s)" + matchClass + "(?!\\S)"), 
     elems = document.getElementsByTagName('*'), i; 
    for (i in elems) { 
     if (re.test(elems[i].className)) { 
      elems[i].innerHTML = content; 
     } 
    } 
} 

replaceContentInContainer("box", "This is the replacement text."); 

Si se mira por la misma clase (s) con frecuencia, puede mejorar aún más por el almacenamiento de los (precompilados) expresiones regulares en otro lugar, y pasarlas directamente a la función, en lugar de una cadena.

function replaceContentInContainer(reClass, content) { 
    var elems = document.getElementsByTagName('*'), i; 
    for (i in elems) { 
     if (reClass.test(elems[i].className)) { 
      elems[i].innerHTML = content; 
     } 
    } 
} 

var reBox = /(?:^|\s)box(?!\S)/; 
replaceContentInContainer(reBox, "This is the replacement text."); 
3

var elems = document.querySelectorAll('.one'); 
 

 
for (var i = 0; i < elems.length; i++) { 
 
    elems[i].innerHTML = 'content'; 
 
};

+4

Eso no es realmente una respuesta. Intente [explique su código] (http://meta.stackexchange.com/questions/148272/is-there-any-benefit-to-allowing-code-only-answers-while-blocking-code-only-ques) Además, es básicamente una versión más compacta de otra respuesta a esta pregunta que se publicó hace 5 años. – helmbert

+0

No sé cuál es el problema. Esta respuesta esta bien. No hay comentarios ... ¿y qué? Esta no es la regla de oro. ¿Y qué quieres comentar aquí? Y [¿Pero es un código legible?] (Http://meta.stackexchange.com/questions/95470/down-vote-code-only-answers#answer-95473) – AntiCZ

0

Para más detalles sobre la respuesta de ColcCold anteriormente, este es el código en sí mismo:

function getElementsByClassName(classname, node){ 
 
    if (!node) { 
 
     node = document.getElementsByTagName('body')[0]; 
 
    } 
 
    
 
    var a = [], re = new RegExp('\\b' + classname + '\\b'); 
 
    els = node.getElementsByTagName('*'); 
 
    for (var i = 0, j = els.length; i < j; i++) { 
 
     if (re.test(els[i].className)) { 
 
      a.push(els[i]); 
 
     } 
 
    } 
 
    return a; 
 
}

Puede echar un vistazo a esta populares revisión: http://blog.blackbam.at/2011/07/01/my-todays-top-10-most-useful-javascript-functions/

1

Supongo que esta no era una opción válida cuando se solicitó originalmente, pero ahora puede usar document.getElementsByClassName('');. Por ejemplo:

var elements = document.getElementsByClassName(names); // or: 
var elements = rootElement.getElementsByClassName(names); 

Consulte el MDN documentation para más información.

Cuestiones relacionadas