getElementById返回null引用

时间:2014-02-01 19:42:54

标签: javascript

我的页面中有以下脚本:

    window.onload = LoadElement;
    function LoadElement() {
        document.getElementsByTagName('asp:Panel');
    };
     function setPage(frame, page) {
         document.getElementById('WindowShow').innerHTML = page;
    }

首先,我想让asp:Panel读取它。继续我正在调用setPage函数,以便将Page加载到此Panel ...中 但调试器会抛出错误“我无法将属性.innerHTML加载到空引用值。” 我从调试器中看到,实际上getElement的值为null,但是里面的值不是null 有人知道这里发生了什么吗?我很困惑......非常......

其他信息 用于调用脚本的子是:

Private Sub button1_Click(sender As Object, e As System.EventArgs) Handles button1.Click
        Dim url As String = "/Pages/Support/Asp/Help01.aspx"
        Dim urlURI As String = HttpContext.Current.Request.Url.AbsoluteUri
        Dim urlPath As String = HttpContext.Current.Request.Url.AbsolutePath
        Dim root_url As String = Strings.Left(urlURI, urlURI.Length - urlPath.Length)
        Dim frameName As String = "WindowShow"
        iPageLoad(frameName, sender, root_url + url)
    End Sub
Public Sub iPageLoad(FrameId As String, sender As Object, msg As String)
        Dim cstype As Type = Me.GetType()
        Dim innerMess As String = msg
        Dim url As String = HttpContext.Current.Request.Url.AbsoluteUri
        Dim script As String = "setPage('" + FrameId + "', '" + innerMess + "')"
        If Not Page.ClientScript.IsStartupScriptRegistered(Me.GetType(), "iPage") Then
        Page.ClientScript.RegisterStartupScript(cstype, "iPage", script, True)
        End If
    End Sub

新脚本

<td  id="TD1" rowspan="9"  runat="server">
  <asp:Literal id="WindowShow" runat="server" Mode="PassThrough" />
    <script type="text/javascript">
        function setPage(page) {
            document.getElementById('WindowShow');
        }
    </script>

</td>

用这个脚本抛出错误“nnerHTML不是...的有效属性。”。

更新

这就是我的代码:

    <table id="tbl" runat="server" class="maintable" >
    <tr><td id="line1" class="tableline" runat="server">
    <asp:Button ID="button1" runat="server" CssClass="tablebutton"  Text="bla bla bla" />
    </td>    
    <td  id="TD1" rowspan="9"  runat="server">
    <asp:Literal id="WindowShow" runat="server" Mode="PassThrough" />
    <script type="text/javascript">
        function setPage(page) {
            document.getElementById('WindowShow').innerHTML = page;
        }
    </script>

    </td>
</tr>
</table>

这就是Server站点的样子:

    <table id="MainContent_tbl" class="maintable">
    <tr>
       <td id="MainContent_line1" class="tableline">
       <input type="submit" name="ctl00$MainContent$button1" value="bla bla bla"      id="MainContent_button1" class="tablebutton" />
       </td>
      <td id="MainContent_TD1" rowspan="9">
    '--------- It Shaw the TD1 but can't see the Literal element
    <script type="text/javascript">
        function setPage(page) {
            document.getElementById('WindowShow').innerHTML = page;
        }
    </script>

      </td>
    </tr>
</table

2 个答案:

答案 0 :(得分:0)

而不是asp:Panel使用此:

window.onload = function () {
    var panel;

    panel = document.getElementById('<%=ServerSidePanel.ClientID %>');

    // do something with panel
    setPage(panel, "<span>Page inside panel.</span>");
};

function setPage(frame, page)
{
     frame.innerHTML = page;
}

在代码隐藏中,在属性中公开控件:

protected ServerSidePanel
{
    get
    {
        return ... // the panel you want to get in JS
    }
}

编辑:服务器端html注入面板

如果您在服务器上有HTML并希望将其放在面板中,则根本不需要使用JS。您可以通过这种方式将其分配到Literal而不是Panel

在ASPX页面中:

<asp:Literal ID="injectionPoint" runat="server" CssClass="looks_like_a_panel" Mode="PassThrough" />

在后面的代码中(这里是C#,抱歉我不会说VB):

string html;

// load somehow the html, here it is simply assigned
html = "<span>internal HTML</span>";

// assign html to literal
injectionPoint.Text = html;

这就是全部。根本没有JS。

在这里你可以找到一个完全相同但没有PassThrough模式的VB示例:

Literal VB example on MSDN

答案 1 :(得分:0)

最后,我找到了一个可以解决这个问题的问题的解决方案,可能会打开另一个问题...

我使用两个脚本:

<script type="text/javascript">
    window.onload = getTag()
    function getTag() {
        var td = document.getElementsByTagName('td');
        return td;
    }
    </script>
    <script type="text/javascript">
        var myTD = getTag();
        function setPage(page) {
           // var ch = myTD.item(1).children[0];
            //ch.value = page;
            myTD.item(1).childNodes[1].innerHTML = '<iframe class="tablecolumndiv" src="' + page + '" />';  
        }
    </script>

我的asp.net代码:

<td  id="TD1" rowspan="9"  runat="server" class="tablecolumn">
<div id="WindowShow" runat="server" class="tablecolumndiv">


</div>

</td>

在第一个脚本中,我为onload元素调用了td 在第二个中,我从第一个调用返回的td,并通过iFrame动态传递我想要的页面。
现在提出的问题是“为什么我没有从asp.net代码中执行此操作”。
好吧,我做到了,但是当我完成工作时,我正面临着离开iFrame的问题。
所以现在......明天......我会尝试关闭动态打开的iFrame并完成所有问题......