2011-01-04 16 views
15

Estoy simplemente tratando de almacenar una etiqueta en una variable en javascript, pero por alguna razón esto no funciona con document.getElementById('control');. Sé que mi javascript está enlazando mi archivo html bien porque todo lo demás funciona.getElementById no encuentra el control generado por ASP.net

Aquí está mi código javascript:

function performEvapCooledCircuit(txt) 
{ 
    var error = document.getElementById('lblError'); 


    if (txt.value == null || isNaN(txt.value)) 
    { 
     error.style.visibility = "visible"; 
    } 
} 

Aquí es el código HTML para mi etiqueta:

<asp:Label ID="lblError" class="NormLabel" runat="server" 
    style="color:red; visibility:hidden;" Text="Invalid Input."></asp:Label> 

Recibo un error que dice que espera objeto ??

Respuesta

20

El ID que ASP.NET generará no será "lblError", por lo que tendrá que hacer referencia a ella por su ClientID

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

Si el archivo JavaScript externo es por lo general he tenido para escribir un tipo de "Init" javascript método para asegurarse de mi identificación se establecieron propiedad

en su página ASPX:

<script type="text/javascript"> 
    var lblError = null; 
    function InitializeVariables() 
    { 
     if (lblError == null) // make sure you only do this once 
     { 
      lblError = document.getElementById("<%=lblError.ClientID %>"); 
     } 
    } 
</script> 
<asp:Label 
    ID="lblError" 
    class="NormLabel" 
    runat="server" 
    style="color:red; visibility:hidden;" 
    Text="Invalid Input."></asp:Label> 

A continuación, en el archivo JavaScript que tendrá que llamar a InitializeVariables() para asegurarse de que tienes las variables que apuntan a la asp.net adecuada controla

function performEvapCooledCircuit(txt) 
{ 
    InitializeVariables(); 

    if (txt.value == null || isNaN(txt.value)) 
    { 
     lblError.style.visibility = "visible"; 
    } 
} 
+0

El código JavaScript no está incrustado en el archivo ASP.net. –

+0

¿cómo lo sabes? – hunter

+0

Junto con la explicación de Šime Vidas, esta respuesta podría ser útil. –

2

El ID de la etiqueta no es "lblError". El motor de ASP.net cambió la ID. Compruebe el código fuente HTML en el navegador para descubrir la identificación real.

+0

@ ŠimeVidas: No recomendaría la codificación estricta del valor de ID ya que esto puede cambiar según la ubicación del contenedor. Dado que una página es moderadamente estática, estaría bien, pero en futuras adiciones/rediseños, esto podría ser un problema. –

+0

@Brad Sí, la codificación difícil sería una mala idea. No hago ASP.net, pero recuerdo haber tenido este problema, y ​​leí sobre una función que le permitiría definir el ClientID directamente. Esa sería la solución a este problema. –

1

Eso no es HTML para la etiqueta, es decir, un control ASP.NET que se procesará en HTML antes de enviarse en la respuesta. Los controles ASP.NET WebForms a veces cambian la identificación del HTML que crean.

Ver el origen de la página web para ver cuál es la identificación del elemento HTML en la página representada.

6

"hunter" ofrece una forma bastante sólida de hacer las cosas, sin embargo, en mi opinión, un método mucho mejor es usar la propiedad "CliendIDMode" en el control y establecer esa propiedad en "Static". Esto hará que los ID del cliente y del servidor sean los mismos. De esta manera:

<asp:TextBox ID="ServerAndClientId" runat="server" ClientIDMode="Static" /> 
+1

Wow gracias. Pero [este] (http://stackoverflow.com/questions/6057490/is-there-any-drawback-to-set-clientidmode-static-on-every-object-set-on-main) post dice que hay algunos inconveniente en el uso de esto. – Arman

+1

Sí, dependiendo del tipo de control, no siempre es ideal. En general, aún así lo prefiero. Especialmente si tienes todos tus javascript en archivos externos (como un buen chico o una chica). – Maverick

1

Puede utilizar esta:

document.getElementById('<%= lblError.ClientID %>').click() 

A partir de ASP.NET 4.0 se puede utilizar ClientIDMode propiedad para usted elemento. Y si se establece en Static entonces el valor ClientID se establece en el valor de la propiedad ID:

<asp:Label ID="lblError" runat="server" ClientIDMode="Static" /> 

será mostrado como algo parecido a esto:

<span id="lblError" name="ctl00$MasterPageBody$ctl00$Label1" /> 
Cuestiones relacionadas