【问题标题】:Element with hidden css not changing with javascript .show()隐藏css的元素不随javascript .show()改变
【发布时间】:2014-11-27 05:47:41
【问题描述】:

我有一个在初始化时隐藏的下拉列表,因为它不需要,除非客户端实际选择了特定的单选按钮列表对象。我目前通过

将其设置为 false
dlInterval.Attributes.CssStyle[HtmlTextWriterStyle.Visibility] = "hidden";

但是,尝试通过 javascript 在选择时更改此设置失败了,目前,我已将我的代码设置为这样执行。

<script type="text/javascript" language="javascript">
    $(document).ready(function () {          
        $("#<%=rblVectorChoices.ClientID%>").click(function() {
            var intVectorSelectedIndex = $('#<%=rblVectorChoices.ClientID %> input[type=radio]:checked').val();
            $("#<%=dlInterval.ClientID %>").style.visibility="visible";
            if (intVectorSelectedIndex == 1) {
                $("#<%=dlInterval.ClientID%>").show();
            } else {
                $("#<%=dlInterval.ClientID%>").hide();
            }
        });
    });
</script>

如您所见,我目前正在尝试将可见性从隐藏更改为可见,但我在浏览器控制台中收到错误“TypeError: Cannot set property 'visibility' of undefined'

这对我来说没有多大意义,因为字段应该被隐藏,而不仅仅是 null。导致这种情况发生的原因是什么,有什么好的解决方案?

【问题讨论】:

  • 为什么设置为可见,然后再调用show/hide?为什么不直接使用show()
  • 你确定是visibility?在 CSS 中,.show()/.hide() 的对应属性是 display
  • 这是一种让可见性发挥作用的尝试。如果没有该行,我不会收到任何错误,但下拉列表仍然隐藏。
  • 感谢北基尔多南,解决了它!如果你不介意写下答案,我会确保我选择它。
  • 我刚才在我的回答中加入了 CssStyle["display"] = "hidden"

标签: javascript jquery css asp.net


【解决方案1】:

HTML 属性不称为visibility

在 CSS 中,.show() / .hide() 的对应属性是 display

【讨论】:

  • 这是真的,但是 jquery 所做的不仅仅是更改 css 类以进行显示,它还有额外的代码让您可以操作隐藏元素的值
  • omg - 我明白了,只是指出 jquery 所做的不仅仅是更改一个 css 类,你是对的,重新阅读我的评论听起来好像我在说答案不正确, 我更新了 cmets
  • @ScottSelby afaik jquery .hide()display 设置为 none.show() 回到原来的值 - 例如:inline-block
  • @mason - 你是对的,就像我说的,更新评论
【解决方案2】:

您要查找的代码是:

 dlInterval.Attributes.CssStyle["display"] = "none";

或者你可以改变 javascript 的样子,我个人认为如果你要在 javascript 中显示它,你应该在 javascript 中隐藏元素。而不是在 .Net 代码中设置 display:none; 会在页面呈现时消失

只需像这样重写您的代码:

<script type="text/javascript" language="javascript">
    $(document).ready(function () {  

        // hide element initially
       $("#<%=dlInterval.ClientID%>").hide();     

        $("#<%=rblVectorChoices.ClientID%>").click(function() {

             // much easier way to check if check box is checked
            if ( $("#<%=rblVectorChoices.ClientID input[type=radio]:checked%>").is(":checked)) {
                $("#<%=dlInterval.ClientID%>").show();
            } else {
                $("#<%=dlInterval.ClientID%>").hide();
            }
        });
    });
</script>

另外,我强烈,强烈建议使用类来选择你的 html 元素,使用 javascript 或 jquery,.Net 会破坏 id,你必须写出这个奇怪的语法来获得正确的 id,使用类可以防止所有这些

注意:如果您要使用第二个示例,那么您永远不需要弄乱

   dlInterval.Attributes.CssStyle["display"] = "none";

【讨论】:

  • 你是说dlInterval.Attributes.CssStyle[HtmlTextWriterStyle.Visibility] = "hidden";相当于调用dlInterval.Visible=false吗?我认为这根本不正确。
  • 我实际上并不确定,我知道我对答案的编辑将毫无顾忌地解决它
  • 我认为您可能是正确的,我从答案中删除了那部分,因为我认为其余部分仍然有用
  • 你的回答没有任何意义。问题完全出在客户端。不是服务器。并且使用内联 C# 嵌入 ID 是完全可以接受的,即使有点难看。可以通过将 ClientIDMode 设置为静态来避免。在这种情况下不需要使用 CSS 类,当您想要引用一组对象而不是一个元素时,它更合适。
  • @mason ,我发现不同的浏览器,我忘记了哪些,但实际上呈现的 ID 不同。我知道为每件事制作一个独特的课程需要做很多事情。但是我以前在 Web 表单中个人所做的只是制作专门用于选择以下划线开头且没有实际样式目的的元素的类。这样,javasctipt 就更干净了,可以跨不同的页面使用。
【解决方案3】:

你能用 prop 来比较它是真还是假吗?另外,您不能调用 $("#").style.visibility="visible";你必须这样称呼它:

对于那些回忆缺失的 .NET 内联 ID 的人来说,这是我修改后的代码:

$(document).ready(function () {
    $("#<%=rblVectorChoices.ClientID%>").click(function () {
        var intVectorSelectedIndex = $('#<%=rblVectorChoices.ClientID%>').prop('checked');
        $("#<%=dlInterval.ClientID%>").css('visibility', 'visible');
    if (intVectorSelectedIndex == true) {
        $("#<%=dlInterval.ClientID%>").show();
    } else {
        $("#<%=dlInterval.ClientID%>").hide();
    }
});

【讨论】:

  • 如果您不理解 .Net 问题,请不要回答
  • 我取消了我的反对票,这实际上非常重要,因为 OP 使用的是 web 表单,显然是 jquery 的新手,并且您拥有 id 选择器的方式适用于world ,但不是 OP 使用的特定的,因此只会导致更多的混乱
  • 我不得不承认我的行为是出于不应该的懒惰。我对 Stackoverflow 还很陌生,我非常感谢我的回答中的所有反馈(特别是错误的做法)。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-07-07
  • 2020-11-30
  • 1970-01-01
  • 2019-05-12
  • 1970-01-01
  • 2014-07-23
  • 1970-01-01
相关资源
最近更新 更多