代码之家  ›  专栏  ›  技术社区  ›  Giffyguy

为什么我的javascript对象设置为空?

  •  0
  • Giffyguy  · 技术社区  · 14 年前

    我有一个 <script> 包含以下行:

    var tbl = document.getElementById("<%= this.tblSelection.ClientID %>");
    

    …但是 tbl 总是被设定为 null .

    表声明如下:

    <asp:Table ID="tblSelection" runat="server" CellPadding="2" CellSpacing="0"
        cols="1" style="position: absolute; top: 0%; right: 0%">
    

    脚本和表都在同一个母版页文件中。

    这是什么原因?

    编辑:我应该提到这个脚本是在 onload

    3 回复  |  直到 14 年前
        1
  •  3
  •   cortijon    14 年前

    我猜您的javascript代码是在浏览器有机会完全呈现表之前执行的。此时,页面的dom将不完整,并且 getElementByID 函数将无法找到表,因为它还不存在!

    做这个实验:

    <head runat="server">
    <title></title>
    
    <script language="javascript">
    
        function showTable() {
    
            var tbl = document.getElementById("<%= this.tblSelection.ClientID %>");
    
            alert(tbl);
        }
    
        showTable();
    
    </script>
    

    这将在页面首次加载时显示“null”。但是,如果您添加一个按钮来再次调用此方法,您将看到 tbl 已填充。

    <input type="button" value="CheckTable" onclick="showTable();" />
    
        2
  •  1
  •   Valera Kolupaev    14 年前

    尼克是对的。表尚未解析/构造。 尝试将getElementByID代码移动到 document.ready 事件。 顺便说一句,jquery为文档事件等提供了很好的包装。

    下面是代码片段:

    $(document).ready(function()
    {
        $get('table-id').doManipulation();
    });
    
        3
  •  1
  •   n8wrl    14 年前

    gumbe和valera对javascript的时间选择是正确的。但我看到这种情况是有另一个原因的。我们已经有了服务器端逻辑设置tblselection.visible=false的实例,这意味着它甚至没有发送到浏览器。像你这样的客户端代码正在寻找id和bang。