【问题标题】:Persistent display (hide/show) for dynamically created DOM elements?动态创建的 DOM 元素的持久显示(隐藏/显示)?
【发布时间】:2009-10-26 21:43:56
【问题描述】:

我有一组 DOM 元素,我只想在用户选中控制复选框时才显示这些元素。所有这些项目都有一个共同的类并且最初是隐藏的:

 .spec { display:none; }

在复选框的点击处理程序中,我最初有以下内容, 这对现有元素效果很好。但是,表格是通过 AJAX 动态生成的,当使用“spec”类添加新元素时,选中复选框时它们不会显示。

// Basic jQuery show/hide
if (btn.checked)
    $('.spec').show();
else
    $('.spec').hide();

因为在我的例子中这是在同一个 JS 模块中,我总是可以在添加到 DOM 之后重新执行这段代码。但总的来说,这可能不是真的,所以我的问题是:

解决此问题的常规 jQuery 方法是什么?

由于 jQuery 显示/隐藏函数改变了 element.style 而不是 样式对象本身,我最终编写了一个 jQuery 插件来改变 样式表,效果很好,但似乎有点过头了,因此是个问题。

var nval = btn.checked ? '' : 'none';
$.styleSheet('.spec', 'display', nval );

【问题讨论】:

标签: javascript jquery dom dynamic


【解决方案1】:

为此,您应该向<body>(或其他父元素)添加一个类,然后通过 jQuery 切换该类。

CSS:

body.spec_is_hidden .spec {
  display: none;
}

JS:

if (btn.checked)
    $('body').addClass('spec_is_hidden');
else
    $('body').removeClass('spec_is_hidden');

【讨论】:

  • 这很好用,谢谢。似乎很明显,但只是回想起来。
  • 因为我最初想隐藏它们,并且主体是在外部定义的,所以我使用 DOM 元素用定义的 hideStuff 包装“规范”元素:` #wrapper .hideStuff .spec { 显示:无; }`
  • 老鼠们,我说得太早了。当元素出现在 IE 中的表格中时,它不起作用,因为表格的 CSS 继承被破坏了。我想我坚持使用 $styleSheet() 方法。
  • 或许为 IE 添加一个额外的 CSS 选择器也会有所帮助? (例如#wrapper.hideStuff table tr.spec {})
【解决方案2】:

也许改变元素的类会更好。然后,当您在 DOM 中添加元素时,您可以为它们分配适合页面所在状态的类。

【讨论】:

  • 我想到了,但目前 JS 代码不知道模板的详细信息(从中创建元素)。
【解决方案3】:

我知道 2 个解决方案: 1) 对尚不存在的元素使用live 例如:`$('a .special').live("click", function(){...});

2) 使用load 的callback 函数。例如:$('p .special').load('x.html', {}, function(){ //search for new element and bind them new function. ...

恕我直言,第二个更好;)

【讨论】:

  • 元素本身没有事件处理程序,所以我认为 $.live() 不起作用,是吗?我会研究 .load() 我认为它不适用。
  • $.load() 函数没有帮助,因为:(1) 我正在从服务器返回的 XML 创建 HTML,并且 (2) 这不是事件处理,但可见性我想改变。请参阅我从“我总是可以...”开始的帖子。
【解决方案4】:

您似乎正在测试在加载文档时是否选中了btn。代替(或除此之外)这个,添加一个事件处理程序,只要用户与复选框交互,就会触发该事件处理程序。 change 处理程序是您想要的。这将始终使用 DOM 的当前状态,因此它将包括任何新添加的元素:

$(btn).change(function(){
  $('.spec').toggle();
});

为简单起见,我使用toggle 处理程序将display:hidden 更改为display:block/inline,反之亦然。如果你想明确,你可以这样做:

$(btn).change(function(){
  $('.spec')[$(this).val() ? 'show' : 'hide']();
});

【讨论】:

  • 不,正如我所说,我这样做是“在复选框的点击处理程序中......”。这不是问题,它是动态 DOM 元素。
  • 啊,你确实做到了。对不起,我错过了。
【解决方案5】:

你想出了两个很好的解决方案并把它们都击落了 :)

如果您正在寻找一个简单的解决方案,重新运行 $(".spec").show() 似乎是最好的。

否则,我不明白为什么调整样式表是矫枉过正?这正是应该做的——您想要控制所有元素与给定类的呈现,包括现有的和动态添加的。这正是 CSS 的用途。

【讨论】:

  • 有效点——但“矫枉过正”是在编写一个 jQuery 插件,到目前为止,我只需要在一个地方使用它,正如你指出的那样,我可以 将显示/隐藏调用添加到创建阶段。但是,由于我想将数据处理和 UI 分开,并且 jQuery 不支持 SS 修改,所以我问:“解决这个问题的 正常 jQuery 方法是什么?”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-03
  • 1970-01-01
  • 2013-11-25
  • 2011-03-26
  • 2013-01-20
相关资源
最近更新 更多