2011-01-04 3 views
15

Ich versuche einfach, ein Label in einer Variablen in Javascript speichern, aber aus irgendeinem Grund funktioniert dies nicht mit document.getElementById('control');. Ich weiß, dass mein Javascript zu meiner HTML-Akte gut ist, weil alles andere funktioniert.getElementById nicht gefunden Kontrolle von ASP.net

Hier ist mein Javascript-Code:

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


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

Hier ist der HTML-Code für mein Label:

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

ich eine Störung erhalte, das Objekt zu erwarten, sagt ??

Antwort

20

Die ID, die ASP.NET generiert wird nicht „lblError“ sein, so dass Sie auf sie verweisen müssen, um durch seine ClientID

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

Wenn Ihr JavaScript-Datei extern ist habe ich in der Regel hatte

<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> 
: eine Art „Init“ javaScript-Methode zu schreiben, dass mein IDs zu machen wurden Eigentum

auf Ihrer ASPX-Seite einrichten

Dann in Ihrem Javascript-Datei Sie InitializeVariables() anrufen müssen, um sicherzustellen, dass Sie die Variablen haben auf die richtige asp.net zeigt steuert

function performEvapCooledCircuit(txt) 
{ 
    InitializeVariables(); 

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

Der Code JavaScript ist eingebettet in die ASP.net-Datei. –

+0

woher weißt du das? – hunter

+0

Zusammen mit Šime Vidas Erklärung könnte diese Antwort hilfreich sein. –

2

Die ID des Etiketts ist nicht „lblError“. Die ASP.net-Engine hat die ID geändert. Überprüfen Sie den HTML-Quellcode im Browser, um die echte ID herauszufinden.

+0

@ ŠimeVidas: Ich würde nicht empfehlen, den ID-Wert hart zu codieren, da sich dies je nach Containerstandort ändern kann. Angesichts einer Seite, die mäßig statisch sein sollte, wäre das in Ordnung, aber bei zukünftigen Erweiterungen/Redesigns könnte dies ein Problem sein. –

+0

@Brad Ja, Hard-Coding wäre eine schlechte Idee. Ich mache kein ASP.net, aber ich erinnere mich, dass ich dieses Problem hatte, und ich las über ein Feature, mit dem Sie die ClientID direkt definieren können. Das wäre die Lösung für dieses Problem. –

1

Das ist kein HTML für das Label, das ist ein ASP.NET-Steuerelement, das in HTML gerendert wird, bevor es in der Antwort gesendet wird. ASP.NET-WebForms-Steuerelemente ändern manchmal die ID für den von ihnen erstellten HTML-Code.

Zeigen Sie die Quelle der Webseite an, um zu sehen, wie sich die ID für das HTML-Element auf der gerenderten Seite befindet.

6

"Hunter" gibt eine ziemlich solide Art, Dinge zu tun, jedoch ist eine, meiner Meinung nach weitaus bessere Methode, die "CliendIDMode" -Eigenschaft auf dem Steuerelement zu verwenden und diese Eigenschaft auf "Static" festzulegen. Dies macht die Client- und Server-IDs gleich. Wie folgt aus:

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

Wow danke. Aber [dies] (http://stackoverflow.com/questions/6057490/is-there-any-drackback-to-set-clientidmode-static-on-every-object-set-on-main) post sagt, es gibt einige Nachteil bei der Verwendung dieses. – Arman

+1

Ja, je nach Art der Steuerung ist es nicht immer ideal. Insgesamt bevorzuge ich es aber trotzdem. Vor allem, wenn Sie alle Ihre Javascript in externen Dateien haben (wie ein guter Junge oder ein Mädchen). – Maverick

1

können Sie verwenden:

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

ab ASP.NET 4.0 Sie ClientIDMode Immobilie für Sie Element verwenden können.

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

werden gerendert als so etwas wie dies: Und wenn Sie es in Static dann der ClientID Wert wird auf den Wert der ID-Eigenschaft festgelegt werden

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