【问题标题】:How can I invisiblize groups of controls via jQuery?如何通过 jQuery 隐藏控件组?
【发布时间】:2015-06-17 18:15:04
【问题描述】:

在我的 Sharepoint 项目/Web 部件/网页中,我在 *.ascx.cs 文件中使用 C# 动态创建页面元素/控件。

在 *.ascx 文件中,我使用 jQuery 来响应页面上发生的事件(选择、复选框状态的更改等)。

我需要有条件地隐藏页面上的控件/元素组。具体来说,如果用户选中某个复选框,我可以“删除”整个页面,在这种情况下,不适用于她。

我该怎么做?我有这个起点:

/* If the select "Yes" (they are seeking payment for themselves, as opposed to someone else), omit (invisibilize) sections 2 and 3 on the form */
$(document).on("change", '[id$=ckbxPaymentForSelf]', function () {
    var ckd = this.checked;
    if (ckd) {
        // what now?
    }
});

我可以用拔头发的方式(这对我来说很痛苦,因为我的头发几乎和押沙龙一样多),然后设置每个单独的元素,如下所示:

if (ckd) {
    var $this = $('[id$=txtbxthis]');
    var $that = $('[id$=txtbxthat]');
    var $theother = $('[id$=txtbxtheother]');
    . . . // store a reference to all the other to-be-affected elements in vars
    $this.visible = false; // <= this is pseudoscript; I don't know what the jQuery to invisiblize an element is
    $that.visible = false; // " "
    $theother.visible = false; // " " 
    . . . // invisiblize all the other to-be-affected elements 
}

肯定有更优雅/更好的方法!

是将所有有条件的不可见元素分配给特定类,然后使分配该类的每个元素不可见,还是什么?

另外,我希望这片现在看不见的地带以前使用的区域“走开”或“卷起”,而不是呆在那儿,面无表情,打着哈欠的鸿沟,或者像戈壁沙漠一样毫无特色的广阔。

【问题讨论】:

  • 来重新检查我的代码,我想我可以简化我必须的“if (this.checked)”

标签: javascript c# jquery sharepoint-2010 invisible


【解决方案1】:

有很多方法可以做到这一点。但是在您的 jquery 实现中,我会用数据标签来装饰元素,这些标签会告诉代码要隐藏和显示哪些元素。

<input data-group="1" type="text" />
<input data-group="2" type="text" />

var $group1 = $('*[data-group="1"]');
var $group2 = $('*[data-group="2"]');
if (ckd) {
  $group1.hide(); 
  $group2.show(); 
}
else{
 $group2.hide(); 
 $group1.show(); 
}

你也可以对 css 类做同样的事情,但我更喜欢使用 data 属性

【讨论】:

  • 所有答案都是正确的,但这是迄今为止最优雅的一个。 +1
  • 我是data 属性的忠实粉丝,但请考虑以下情况:一个控件属于两个不同的组。使用(多个)类,可以轻松选择该元素,而使用 data 属性需要额外的逻辑。
  • 非常正确。我更喜欢使用数据的唯一原因是,类在技术上是元素 css 的一部分,您可以轻松创建任意数量的非 css 类,并根据需要使用它们,但这并不是类的真正含义对于(但我有时也会这样做)。有了足够好的逻辑,这也可以通过多种方式同样完成
  • @QBM5,我完全同意。这就是 data 属性的设计目的:HTML 中的附加数据。
  • 我喜欢这个,但还不能让它工作。我在这里问了一个后续问题:stackoverflow.com/questions/30899973/…
【解决方案2】:

如果您可以使用类对控件进行分组,则可以选择需要在特定场景中隐藏的类,然后使用 hide() 函数:

if (ckd) {
    var cls = getClassForCurrentScenario();
    $("." + cls).hide(); //slideUp() would be an animated alternative
}

例如,如果控件可以在 div 内分组,那么您只需隐藏该元素:

if (ckd) {
    var id = getElementIdForCurrentScenario();
    $("#" + id).hide(); //slideUp() would be an animated alternative
}

这实际上取决于您如何将控件分组到“目标组”中,以便您以后可以有效地访问它们。

【讨论】:

  • 还要考虑hide()等价于.css("display", "none"),所以如果您的设计需要元素占用的空间在页面中仍然可用,请使用.css("display", "hidden")
  • @whitelettersandblankspaces,说得好,虽然这种情况很少发生
【解决方案3】:

你可以像这样隐藏一个元素:

$('...').hide();

或者您可以使用以下命令将其向上滑动:

$('...').slideUp();

获得漂亮的向上滑动动画。

顺便说一句,您可以一次对多个元素执行此操作,在您的情况下:

$('[id$=txtbxthis], [id$=txtbxthat], [id$=txtbxtheother]').slideUp();

【讨论】:

  • 我赞成将其恢复为 0,但想知道为什么有人反对它。
  • 我的猜测是因为这是一个懒惰的答案,它提供了非常基本的知识,并假设复杂的实现不是原始问题的一部分。如果有人想知道如何使用 jquery 显示和隐藏元素,那么有数百万种方法可以找到答案。考虑到这一点,有人可能已经假设 OP 也想要实现细节,而不是这两行“没有帮助”的答案:)
猜你喜欢
  • 1970-01-01
  • 2020-08-29
  • 1970-01-01
  • 2010-11-05
  • 2014-05-10
  • 2011-07-15
  • 1970-01-01
  • 1970-01-01
  • 2015-09-14
相关资源
最近更新 更多