Question

Je fais un appel $.get à mon db et renvoie certains HTML (data):

$.get(url, null, function(data) {

Le code HTML retourne quelque chose comme ceci:

<div id="1234" class="myclass">..more html..</div>

Dans ma fonction de rappel, j'essaie d'ajouter une classe à elle (basé sur certains conditionals que j'ai testé sont atteint avec succès) comme ceci:

if (someCondition) $(data).addClass('mynewclass' + someId);

Même quand someCondition est vrai, mon HTML est de ne pas avoir la classe mynewclass[someId] ajouté. Y at-il des raisons pour lesquelles cela peut être que je suis juste bêtement donnant?

Merci ...: \

EDIT

Voici un lien un exemple reproductible. Ce n'est pas exactement ce que je fais en tant que tel (je ne suis pas en utilisant un var extérieur pour récupérer mes données, mais je reproduire le même effet). remarquez comment il est montrant « faux » pour le test.

Était-ce utile?

La solution

Le problème est que vous créez plusieurs objets div. La première que vous créez est mis au rebut. Ensuite, un nouveau est créé qui n'a pas la classe qui a déjà été ajouté.

Tenez une référence de la div qui a d'abord été créé et à laquelle la classe a été appliquée. Puis ajouter que même div à la page.

function(something) {
    var div = $(data).addClass('someClass');
    $('#container').html(div + div.is('.someClass'));
}

Cependant, maintenant nous avons affaire à un objet (div) et non une chaîne, et d'essayer de convertir un objet en une chaîne donnera "[object Object]". modifier donc la fonction append à ceci:

$('#container').empty();
$('#container').append(div).append(String(div.is('.someClass')));

Consultez votre exemple mis à jour .

Autres conseils

jQuery comme premières javascript fonctionne sur DOM. Et ce que vous faites, essaie de manipuler des données (HTML longue série dans votre cas). Vous devez ajouter atleast données HTML que vous avez demandé à DOM, avant de commencer à faire des tours avec elle. Votre rappel doit être quelque chose comme ça ..

function(data){
  $('#container_to_fit_data').html(data); // Adding to Document
  someId = 1234;
  if (someCondition) 
      $('#'+someId, '#container_to_fit_data').addClass('mynewclass' + someId);
      // or lets see it in simplest form
      // $('#container_to_fit_data').find('#'+someId).addClass('mynewclass' + someId);
}

[EDIT]

@Anurag Il est vrai que jQuery est capable de manipuler des données de chaînes, mais ce ne est pas vrai que son cas avec des transactions non-ID.

Vous pouvez voir,

DOM_STR1 = "<div>
              <p>
                 <strong>Strong</strong>
                 <span class='myclass'>Span</span>
              </p>
            </div>"

DOM_STR2 = "<p>
              <strong>Strong</strong>
              <span class='myclass'>Span</span>
            </p>"


$('span.myclass', DOM_STR1) // We find span. Allright.
$('span.myclass', DOM_STR2) // We find span. Cool.

$('p', DOM_STR1) // We find p too. But..
$('p', DOM_STR2) // Empty. Never return p, Why??
$('div', DOM_STR1) // Empty Again. Why??

'div' est présent dans DOM_STR1, même 'p' est présent dans DOM_STR2. Pourquoi jQuery ne peut pas lire l'élément d'emballage, mais trouve les enfants de chaîne ??

Ainsi, lorsque les données sont de toute façon nécessaire pour être sur DOM, il ne fait aucun sens de le manipuler de chaîne.

@ Jason: des thats mon point, vous devez utiliser .addClass sur un objet jQuery, pas HTML brut. Ou vous avez besoin de correspondance de motif « données », le traitant comme une chaîne (ce qui est) et injectez votre classe dans l'attribut class.

La variable « données » fait référence à la collection d'informations renvoyées. Quelque chose comme cela devrait fonctionner:

if(someCondition) { $(data).find('#1234').addClass('mynewclass'+someId); }
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top