我从getElementById获取JAVA的错误

时间:2013-08-12 01:23:55

标签: javascript getelementbyid

我一直试图将值传递给代码,并通过论坛确定最佳方法。使用隐藏字段建议了许多答案。我一直试图做到这一点,但是当我通过ID检索JAVA变量为零时调试说JAVA变量是空的时候一直出错。我似乎无法弄清楚为什么,因为我使用的答案中的确切代码示例被标记为最佳解决方案并且正常工作。我一定是做错了,但我无法弄清楚是什么。下面是我从论坛中借用的ASPX页面代码和背后的代码。

***<Page Code>***

%@ Page Title="" Language="VB" MasterPageFile="~/Site.master" AutoEventWireup="false" CodeFile="test.aspx.vb" Inherits="test" %>

<asp:Content ID="Content1" ContentPlaceHolderID="HeadContent" Runat="Server">

<script type="text/javascript">
{
    var hidden1 = document.getElementById('hidvalue')
    hidden1.value=window.innerWidth.toString & "X" & window.innerHeight.toString;
}
</script>

</asp:Content>

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" Runat="Server">

    <input id="hidvalue" type="hidden" runat="server" />

    <asp:Label ID="Label1" runat="server" Text=""></asp:Label>

</asp:Content>

***<Code Behind Page>***

Partial Class test

    Inherits System.Web.UI.Page

    Protected Sub Page_Load(sender As Object, e As EventArgs) Handles Me.Load

        Label1.Text = hidvalue.Value

    End Sub

End Class

当JAVA脚本到达以代码'hidden1.value = window.innerWidth.toString'开头的行时,抛出错误。该错误表示它无法为变量“hidden1”赋值,因为它为null。它应该填充元素'hidvalue',但它显然不是,我无法弄清楚为什么。有没有人知道我在这里做错了什么?

REVISION: 感谢大家帮助解决了最初的问题,这个问题通过在页面中添加OnLoad和ReSize以及每个代码中的代码来修复,以使这些事件能够以正确的页面加载顺序跟踪窗口大小。 (参见下面的代码)对于test.aspx页面,我使用可见标签来存储大小,以便在更改时可以看到值。 test.aspx子页面在一个基本空白的母版页下运行,它在加载时显示窗口大小,并在完美调整大小时显示一个不变的值。

***<MASTER PAGE>***

    <%@ Master Language="VB" AutoEventWireup="false"  %>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
    <head runat="server">   
        <title></title>    
        <asp:ContentPlaceHolder ID="HeadContent" runat="server"/>
    </head>
    <body>
        <form runat="server">
        <div class="page">                      
            <div class="main">
                <asp:ContentPlaceHolder ID="MainContent" runat="server"/> 
            </div>                                
        </div>        
        </form>
    </body>
    </html>

***<TEST PAGE>***
<%@ Page Title="" Language="VB" MasterPageFile="~/Empty.master" AutoEventWireup="false" CodeFile="test.aspx.vb" Inherits="test" %>
<asp:Content ID="Content1" ContentPlaceHolderID="HeadContent" Runat="Server">
<script type="text/javascript">
    function attachEventHandlerResize(element, eventToHandle, eventHandler) {
        if (element.attachEvent) {
            element.attachEvent(eventToHandle, eventHandler);
        } else if (element.addEventListener) {
            element.addEventListener(eventToHandle.replace("on", ""), eventHandler, false);
        } else {
            element[eventToHandle] = eventHandler;
        }
    }
    attachEventHandlerResize(window, "onresize", function () {
        var hidden1 = document.getElementById('<%= LabelWindowSize.ClientID%>');
        hidden1.innerText=window.innerWidth + "X" + window.innerHeight;
    });
    function attachEventHandlerLoad(element, eventToHandle, eventHandler) {
        if (element.attachEvent) {
            element.attachEvent(eventToHandle, eventHandler);
        } else if (element.addEventListener) {
            element.addEventListener(eventToHandle.replace("on", ""), eventHandler, false);
        } else {
            element[eventToHandle] = eventHandler;
        }
    }
    attachEventHandlerLoad(window, "onload", function () {
        var hidden1 = document.getElementById('<%= LabelWindowSize.ClientID%>');
        hidden1.innerText = window.innerWidth + "X" + window.innerHeight;
    });
</script>
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" Runat="Server">
    <asp:Label ID="LabelWindowSize" runat="server"/>
</asp:Content>

***<CODE BEHIND TEST.ASPX>***
Imports System.Diagnostics
Partial Class test
    Inherits System.Web.UI.Page
    Protected Sub Page_Load(sender As Object, e As EventArgs) Handles Me.Load
        Debug.Print("LabelWindowSize.text value=" + LabelWindowSize.Text)
    End Sub
End Class

页面上的标签在浏览器中正确显示值(即:1050X724)。但是,由于某些原因,从标签获取文本时,后面的代码无法访问显示的值。调试输出为:'LabelWindowSize.text value =',没有值,并检查LabelWindowSize的文本值显示“”。

由于页面加载,执行和访问元素的顺序,我预感到问题正在发生,就像之前解决的解决方案一样。有没有人知道究竟是什么导致了这个问题?

REVISION: 好的,更改了aspx页面以使用隐藏文本控件

<%@ Page Title="" Language="VB" MasterPageFile="~/Empty.master" AutoEventWireup="false" CodeFile="test.aspx.vb" Inherits="test" %>
<asp:Content ID="Content1" ContentPlaceHolderID="HeadContent" Runat="Server">
<script type="text/javascript">
    function attachEventHandlerResize(element, eventToHandle, eventHandler) {
        if (element.attachEvent) {
            element.attachEvent(eventToHandle, eventHandler);
        } else if (element.addEventListener) {
            element.addEventListener(eventToHandle.replace("on", ""), eventHandler, false);
        } else {
            element[eventToHandle] = eventHandler;
        }
    }
    attachEventHandlerResize(window, "onresize", function () {
        var hidden1 = document.getElementById('<%= labelwindowsize.ClientID%>');
        hidden1.value = window.innerWidth + "X" + window.innerHeight;
    });
    function attachEventHandlerLoad(element, eventToHandle, eventHandler) {
        if (element.attachEvent) {
            element.attachEvent(eventToHandle, eventHandler);
        } else if (element.addEventListener) {
            element.addEventListener(eventToHandle.replace("on", ""), eventHandler, false);
        } else {
            element[eventToHandle] = eventHandler;
        }
    }
    attachEventHandlerLoad(window, "onload", function () {
        var hidden1 = document.getElementById('<%= LabelWindowSize.ClientID%>');
        hidden1.value = window.innerWidth + "X" + window.innerHeight;
    });
</script>
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" Runat="Server">
    <input id="labelwindowsize" type="hidden" runat="server"/>
</asp:Content>

从页面检查器视图中可以看到正常填充:

<form name="aspnetForm" id="aspnetForm" action="test.aspx" method="post">...</form>
<div>...</div>
</div>
<div>...</div>
</div>
<div class="page">...</div>
<div class="main">...</div>
<input name="ctl00$MainContent$labelwindowsize" id="ctl00_MainContent_labelwindowsize" type="hidden" value="645X557"></input>
</input>
</div>
</div>
</form>

但是,后面的代码仍然无法看到值...以下行为'value'生成“”

Debug.Print("LabelWindowSize.text value=" + labelwindowsize.Value)

有关更详细的说明: 我试图实现的代码的目的是检索浏览器窗口大小,以便将App_Code模块中的宽度和高度存储为页面访问的全局变量。想要全局窗口大小变量的原因是将在几个页面上打开的可滚动弹出窗口的大小设置为当前窗口的完整大小。我试图这样做,以尽可能多地显示图像和其他大型项目,如巨大的表格或比平均显示窗口大得多的网格。我想这样做的原因是减少用户需要做的滚动量来查看可滚动弹出窗口的全部内容,并且能够在用户调整浏览器大小时将弹出窗口大小调整为完整窗口大小窗口。

2 个答案:

答案 0 :(得分:2)

您的隐藏字段具有属性runat="server",因此在呈现页面时会更改其ID。这样找:

var hidden1 = document.getElementById('<%= hidvalue.ClientID %>');

答案 1 :(得分:1)

您的脚本在创建元素之前正在执行。把它放在document.onload中,它应该工作:

<script type="text/javascript">
{
    document.onload(function()
    {
        var hidden1 = document.getElementById('hidvalue')
        hidden1.value=window.innerWidth.toString & "X" & window.innerHeight.toString;
    });
}
</script>