【问题标题】:How to create a DOM node as an object?如何将 DOM 节点创建为对象?
【发布时间】:2009-04-17 10:22:49
【问题描述】:

我想创建一个 DOM 节点,设置 'id' 属性,然后将其附加到 'body'。以下似乎不起作用,因为 jQuery 没有将我的模板视为对象:

var template = "<li><div class='bar'>bla</div></li>";
template.find('li').attr('id','1234');
$(body).append(template);

我如何告诉 jQuery 将其视为对象以便 find() 对其进行处理?

【问题讨论】:

  • 它不起作用,因为您在创建的 dom 元素中应用 find 。在这种情况下,您试图找到liunderneath li,但是只有div 和文本bla。尝试这样的事情来了解会发生什么var template=$("&lt;div&gt;&lt;li&gt;&lt;div&gt;bla&lt;/div&gt;&lt;/li&gt;&lt;/div&gt;")

标签: jquery dom


【解决方案1】:

我会先把它放在 DOM 中。我不确定为什么我的第一个示例失败了。这真的很奇怪。

var e = $("<ul><li><div class='bar'>bla</div></li></ul>");
$('li', e).attr('id','a1234');  // set the attribute 
$('body').append(e); // put it into the DOM     

将 e(返回元素)放入 jQuery context 中,在其下应用 CSS 选择器。这使它无法将 ID 应用到 DOM 树中的其他元素。

问题似乎是您没有使用 UL。如果你在 DOM 树中放置一个裸 li,你就会遇到问题。我认为它可以处理/解决这个问题,但它不能。

您可能不会将裸 LI 放在您的 DOM 树中以实现“真正的”实现,但 UL 是实现此目的所必需的。叹息。

示例: http://jsbin.com/iceqo

对了,你可能也对microtemplating感兴趣。

【讨论】:

  • 您在附加对象后设置属性...我的测试表明这不起作用。
  • 是的,它也为我打破了。诡异的。我以为我已经通过了。无论如何,这个版本可以工作。
  • 它有效,但如果你的身体有多个 'li',那么属性会被添加到所有这些......也许添加 :last 就可以了。
  • 不,它不会,这就是 e 用来指定上下文的原因。
  • 哦,见鬼,它没有使用上下文。多么美好的一天。
【解决方案2】:

试试这个:

var div = $('<div></div>').addClass('bar').text('bla');
var li = $('<li></li>').attr('id', '1234');
li.append(div);

$('body').append(li);

显然,直接将 li 附加到正文是没有意义的。基本上,诀窍是使用 $('your html here') 构造 DOM 元素树。我建议使用 CSS 修饰符(.text()、.addClass() 等),而不是让 jquery 解析原始 HTML,这样以后更改会更容易。

【讨论】:

  • @TamasCzinege,在 li.append(div) 为什么将 div 附加到 li ?
  • 这是一个比公认答案更干净的解决方案。
【解决方案3】:
var template = $( "<li>", { id: "1234", html:
  $( "<div>", { class: "bar", text: "bla" } )
});
$('body').append(template);

这个怎么样?

【讨论】:

    【解决方案4】:

    首先将你的模板变成一个 jQuery 对象:

     var template = $("<li><div class='bar'>bla</div></li>");
    

    然后设置属性并将其附加到 DOM。

     template.find('li').attr('id','1234');
     $(document.body).append(template);
    

    请注意,将 li 直接添加到 DOM 完全没有意义,因为 li 应该始终是 ul 或 ol 的子级。另外最好不要让 jQuery 解析原始 HTML。而是创建一个li,设置它的属性。创建一个 div 并设置它的属性。将 div 插入到 li 中,然后将 li 附加到 DOM。

    【讨论】:

    • 我认为 sshould 工作,但它没有。 (实际上正是我首先发布的内容)请参阅:jsbin.com/eware
    【解决方案5】:

    这是一个班轮:

    $("<li><div class='bar'>bla</div></li>").find("li").attr("id","1234").end().appendTo("body")
    

    但我想知道您为什么要在稍后阶段添加“id”属性而不是直接在模板中注入它。

    【讨论】:

    • 这行不通,我们以前一直在路上。我想知道这是否是一个错误,因为它确实看起来应该可以工作,而且很多人都遇到过这个问题。
    【解决方案6】:

    您的示例失败的三个原因。

    1. 原始的“模板”变量不是 jQuery/DOM 对象,无法解析,它是一个字符串。通过将其包裹在 $() 中使其成为 jQuery 对象,例如:template = $(template)

    2. 一旦 'template' 变量是一个 jQuery 对象,您需要意识到

    3. 是根对象。因此,您无法搜索 LI 根节点并获得任何结果。只需将 ID 应用于 jQuery 对象。
    4. 当您将 ID 分配给 HTML 元素时,它不能以任何 HTML5 之前的 HTML 版本的数字字符开头。它必须以字母字符开头。对于 HTML5,这可以是任何非空白字符。详情参考:What are valid values for the id attribute in HTML?

    PS:示例代码的最后一个问题是 LI 不能应用于 BODY。根据 HTML 要求,它必须始终包含在一个列表中,即 UL 或 OL。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-11-25
      • 2011-05-19
      • 1970-01-01
      • 1970-01-01
      • 2021-12-21
      • 2020-08-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多