【问题标题】:Why won't this div add a class in jQuery?为什么这个 div 不在 jQuery 中添加一个类?
【发布时间】:2010-09-01 03:10:23
【问题描述】:

我对我的数据库进行了$.get 调用,它返回了一些 HTML (data):

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

它返回的 HTML 是这样的:

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

在我的回调函数中,我尝试向它添加一个类(基于我已经测试成功达到的一些条件),如下所示:

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

即使someCondition 为真,我的HTML 也没有添加mynewclass[someId] 类。有什么理由说这可能是我愚蠢地忽略了?

谢谢...:\

编辑

这是a link 的可重现示例。这并不完全是我正在做的事情(我没有在外面使用 var 来获取我的数据,但我正在重现相同的效果)。注意它是如何在测试中显示为“假”的。

【问题讨论】:

  • someId 是什么?你可以发布一个链接到你的代码
  • someId 是模型的 ID。但它是一个数字。
  • 这与您的问题没有任何关系,但是 fwiw ids 不应以 w 数字开头。它不是有效的 html。
  • @peter 我知道 id 不应该以数字开头,但我也认为这不是问题的一部分。 @garis,#1234 是在服务器上呈现的模型的 ID。我用它来找到这个 div 来做其他很酷的 jquery 东西[编辑:garis 删除了他的评论]。
  • 你能为我们在 jsbin 或 jsfiddle 上发布一个可重现的例子吗?

标签: jquery dom-manipulation


【解决方案1】:

问题是您正在创建多个 div 对象。您正在创建的第一个正在被丢弃。然后创建一个新的,它没有之前添加的类。

保持对第一次创建的 div 的引用,并应用该类。然后将相同的 div 添加到页面。

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

但是,现在我们处理的是对象 (div) 而不是字符串,尝试将对象转换为字符串将产生 "[object Object]"。所以修改append函数为:

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

See your example updated.

【讨论】:

  • +1 你比我快,虽然你需要做div.html() + div.is('.anotherclass')所以你不会得到[object Object]true。编辑:实际上,我不太正确,因为.html() 只给你内容。您的更新是正确的。 :o)
  • 感谢@Patrick :) 在实际运行代码后我意识到这一点。
  • 天哪,我觉得自己很蠢。谢谢阿努拉格。关于将我的数据设置为本地变量的部分解决了这个问题。
  • 哈哈,我们都去过那里。 append 的一些功能使其具有全功能的 head :)
  • @Jason - 程序员的脑残是很常见的事情。别担心,我们都去过那里,有时实际上住在那里:)
【解决方案2】:

jQuery 像原始 javascript 一样在 DOM 上工作。而您正在做的是尝试操作数据(在您的情况下,HTML 是长字符串)。在开始使用它之前,您需要至少将您请求的 HTML 数据添加到 DOM。你的回调应该是这样的..

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);
}

[编辑]

@Anurag jQuery 能够操作字符串数据是真的,但非 ID 事务的情况并非如此。

你可以看到,

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' 存在于 DOM_STR1 中,'p' 存在于 DOM_STR2 中的方式相同。为什么 jQuery 无法读取包装元素,却从字符串中找到子元素??

所以,当数据无论如何都需要在 DOM 上时,从字符串中操作它是没有意义的。

【讨论】:

  • 这不是真的。只有在处理 id 时,我们才需要插入到 DOM 中。否则,我们可以直接在文档之外创建和操作元素,非常好 - $('&lt;p&gt;').addClass('someClass');
  • re:您的编辑 - 如果您只是调用 $(DOM_STR1) 而不是 $('div', DOM_STR1) 您可以访问外层。我的问题是我正在对对象进行更改,但不是永久更改。一旦我将其设置为本地 var 并对其进行更改,一切都是肉汁
【解决方案3】:

@Jason:这就是我的意思,您需要在 jQuery 对象上使用 .addClass,而不是原始 HTML。或者您需要模式匹配“数据”,将其视为字符串(它是)并将您的类注入到类属性中。

【讨论】:

  • 当你将它包裹在$() 中时,它就变成了一个jquery 对象
  • OP is 在 jQuery 对象上使用 .addClass()$(data) 是一个 jQuery 对象,其中传递了 HTML 字符串并呈现到 DOM 元素中。 jQuery 对象可以接受原始 HTML。
【解决方案4】:

“数据”变量是指返回信息的整个集合。这样的事情应该可以工作:

if(someCondition) { $(data).find('#1234').addClass('mynewclass'+someId); }

【讨论】:

  • 我想过,但这样做是行不通的。我尝试了 $(data).is('[a class already on it]') 并返回 true,所以我实际上在树的顶部
  • @simplyharsh 是的,它会的。 $(data) 会将其转换为您可以操作的有效 jquery 对象。诀窍是将其设置为本地变量,以便更改坚持:)
猜你喜欢
  • 2011-05-23
  • 2022-11-25
  • 2014-05-12
  • 1970-01-01
  • 2017-05-15
  • 1970-01-01
  • 2023-03-14
  • 1970-01-01
  • 2013-11-06
相关资源
最近更新 更多