2011-01-04 5 views
15

나는 JavaScript의 변수에 레이블을 저장하려고하고 있지만 어떤 이유로이 태그가 document.getElementById('control');과 함께 작동하지 않습니다. 나는 다른 모든 것들이 작동하기 때문에 나의 자바 스크립트가 내 html 파일에 잘 연결되어 있다는 것을 안다. 여기getElementById가 ASP.net에서 생성 된 컨트롤을 찾지 못했습니다.

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


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

내 레이블의 HTML 코드입니다 : 여기

내 자바 스크립트 코드

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

내가 개체가 예상 말한다 오류가 무엇입니까?

답변

20

ASP.NET은 당신이 당신의 자바 스크립트 파일이 외부에있는 경우 그 ClientID

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

내가 보통 했어요하여 참조해야합니다 그래서 "lblError"되지 않습니다 생성합니다 ID

<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> 
: 확실히 내 ID 년대를 만들기 위해 자바 스크립트 방법 "초기화"의 유형을 작성하여 ASPX 페이지에서 재산

을 설정했다

이 그런 다음 자바 스크립트 파일에 당신은 당신이 적절한 asp.net을 가리키는 변수를 가지고 있는지 확인 InitializeVariables()를 호출해야합니다 라벨의 ID는 "lblError"아니다

function performEvapCooledCircuit(txt) 
{ 
    InitializeVariables(); 

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

는 자바 스크립트 코드에 포함되지 않습니다

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

는 다음과 같이로 렌더링됩니다 ASP.net 파일. –

+0

당신은 어떻게 압니까? – hunter

+0

Šime Vidas 설명과 함께이 대답이 도움이 될 수 있습니다. –

2

을 제어합니다. ASP.net 엔진이 ID를 변경했습니다. 실제 ID를 찾으려면 브라우저에서 HTML 소스 코드를 확인하십시오.

+0

@ imeVidas : 컨테이너 위치에 따라 ID 값을 변경할 수 있으므로 ID 값을 하드 코딩하지 않는 것이 좋습니다. 적당히 정적 인 페이지가 주어지면 괜찮을 것이지만, 향후 추가/재 설계 할 때 이것은 문제가 될 수 있습니다. –

+0

@Brad 예, 하드 코딩은 나쁜 생각입니다. ASP.net을 사용하지 않지만이 문제가 발생했음을 기억합니다. ClientID를 직접 정의 할 수있는 기능에 대해 읽었습니다. 이것이이 문제의 해결책이 될 것입니다. –

1

레이블에 HTML이 아닌 것은 응답으로 보내지기 전에 HTML로 렌더링되는 ASP.NET 컨트롤입니다. ASP.NET WebForms 컨트롤은 때때로 만든 HTML의 ID를 변경합니다.

HTML 요소의 ID가 렌더링 된 페이지에 있는지 확인하려면 웹 페이지의 소스를 확인하십시오.

6

"hunter"는 일을하는 데있어 단단한 방법을 제공하지만 제 생각에는 훨씬 더 좋은 방법은 컨트롤의 "CliendIDMode"속성을 사용하고 해당 속성을 "정적"으로 설정하는 것입니다. 그러면 클라이언트 ID와 서버 ID가 동일하게됩니다. 이처럼 :

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

와우 감사합니다. 하지만 [이] (http://stackoverflow.com/questions/6057490/is-there-any-drawback-to-set-clientidmode-static-on-every-object-set-on-main) 게시물에는 몇 가지있다 이것을 사용하는 결점. – Arman

+1

예, 컨트롤의 유형에 따라 항상 이상적인 것은 아닙니다. 전반적으로 나는 그것을 여전히 선호한다. 특히 외부 파일에 자바 스크립트가있는 경우 (예 : 좋은 소년 또는 소녀). – Maverick

1

이를 사용할 수 있습니다

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

는 ASP.NET 4.0에서 시작 당신이 요소에 대한 ClientIDMode 속성을 사용할 수 있습니다. 당신이 Static로 설정하면 다음 ClientID 값이 ID 속성의 값으로 설정됩니다 :

<span id="lblError" name="ctl00$MasterPageBody$ctl00$Label1" /> 
관련 문제