在将可见性设置为隐藏后,getElementById找不到元素

时间:2013-06-20 20:52:58

标签: javascript asp.net

我正在开发一个asp.net页面,我有一个使用内容页面(我的网页控件)的母版页。在我的网页控件中,我有4个元素。当我更改picklisttype下拉列表时

PickListType - 下拉列表    UserPickList-不重要    组织 - 标签    身体 - 标签    地址 - 下拉

当我更改picklisttype dropdwon时,我想隐藏Body和Address,反之亦然。

当我第一次更改它时,它可以工作,但第二次,它说第二次无法找到Body和Address的ID(我将其可见性设置为隐藏)。在查看源代码时,似乎这些元素1)在回发期间改变了它们的ID并且.ClientId找不到它们或2)它们只是消失了。

我似乎无法弄清楚如何做到这一点。有任何想法吗?

function DropDownChange() {

            var picklist = document.getElementById("PickListTypeList");
            var usercontainer = document.getElementById("ctl00_ctl00_ctl00_PageContentPlaceHolder_PageContentPlaceHolder_paneDetails_ApplicerPickListContainer");
            var orgcontainer = document.getElementById("ctl00_ctl00_ctl00_PageContentPlaceHolder__C_OrganizationPickListContainer");
            var addresslabel = document.getElementById("LegalBodyAddressLabel");
            var addressbox = document.getElementById("ctl00_ctl00_ctl00_PageContentPlaceHolder_PageContentPlaceHolder_paneDetails_ApplicantsRadDock_C_ApplicantsControl_AddEditApplicantDock_C_AddApplicantDock_C_LegalBodyAddressComboBox");


            if(picklist.value.toLowerCase() === "sometext"){
                usercontainer.style.display = "none";
                orgcontainer.style.display = "inline";
                addresslabel.visibility = "visible";
                addressbox.style.display = "inline";
            }
            else{
                usercontainer.style.display = "inline";
                orgcontainer.style.display = "none";
                addresslabel.visibility = "hidden";
                addressbox.style.visiblity = "none";

            }


            }

这是源:我使用.ClientId动态查找id,但后来我将其更改为静态(每次都是相同的id),我似乎仍然无法获得地址和标签。我通过进入控件(controlname.nameofelementID.ClientID)从父(主)页面中找到这些元素。

2 个答案:

答案 0 :(得分:1)

2个想法/选项

  • 将类添加到要访问的控件,然后使用document.getElementsByClassName检索它们。在回发后,.NET不会更改html标记上的类。

OR

  • 将它们包含在具有id的div / span中,然后document.getElementById包装标记,然后访问其firstChild。我建议不要为此包装器执行runat="server"

答案 1 :(得分:1)

你有两种方法可以让它发挥作用:

  1. 使用类名(.net框架不会乱用它)
  2. 在运行时生成javascript id(使用ClientId)。由于有回发,这是正确的做法。类似于:document.getElementById("<%=LegalBodyAddressLabel.ClientId%>");