문제

나는 jQuery를 사용하여 asp.net (2.0) 드롭 다운 목록의 변경 이벤트는 jQuery가 처리합니다. 문제는 드롭 다운 목록이 GridView 내부에 있으며 사용자가 해당 GridView 내에서 행을 편집하기로 결정한 경우에도 있습니다.

ASP 코드 블록을 사용하여 객체를 선택했다고 생각하지만 문제는 페이지가 처음로드 할 때 행의 편집 색인이 존재하지 않고 오류가 발생한다는 것입니다. 블록을 a 안에 넣습니다 IF 성명서도 작동하지 않습니다.

$(document).ready(function() //when DOM is ready, run containing code
{
    <% if (grvTimeSheets.EditIndex > -1) {%>
        $(#<%=grvTimeSheets.Rows[grvTimeSheets.EditIndex].FindControl("ddlClients").ClientID %>).change(function() {
             $(#<%= grvTimeSheets.ClientID %>).block({ message: null }
        });
}
);
<% } %>

그것은 내가 한 하나의 시도이며, 또한 if 문장 ASP 코드를 JavaScript 블록 외부에 넣었습니다. 그것은 작동하지 않습니다.

jQuery 이벤트를 드롭 드롭 박스에 어떻게 적용 할 수 있습니까? 가능한 한 간결하게 이상적입니다.


답변 주셔서 감사합니다. 아니요, 작동하지 않습니다 :(. JavaScript 코드는 출력되지 않은 것 같습니다 ... 혼란스러운 ...

<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="jquery.tablesorter.js"></script>
<script type="text/javascript" src="jquery.blockUI.js"></script>
<script type="text/javascript">
    $(document).ready(function() //When DOM is ready, run the containing code
    {

    }
    );
</script>

출력입니다. 이것은 코드이지만 :

<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="jquery.tablesorter.js"></script>
<script type="text/javascript" src="jquery.blockUI.js"></script>
<script type="text/javascript">
    $(document).ready(function() //when DOM is ready, run containing code
    {<% if (grvTimeSheets.EditIndex > -1) {%>
        var id = '#<%=grvTimeSheets.Rows[grvTimeSheets.EditIndex].FindControl("ddlClients").ClientID %>';
        $(id).change(function() {
             $(id).block({ message: null }
        });
     <% } %>
    }
    );
</script>

그것은 전에도 그렇게하고 있었고 나를 미치게했습니다.


죄송합니다. 약간 더 명확하게 만들 수 있습니까? 나는 코드의 전체를 그렇게 같은 것처럼 정의하려고 시도했습니다.

DropDownList ddl (DropDownList)grvTimeSheets.Rows[grvTimeSheets.EditIndex].FindControl("ddlClients");
if (ddl != null)
{
    ClientScriptManager csm = Page.ClientScript;
    Type cstype = this.GetType();
    String csname1 = "PopupScript";

    string script = @"
    <script language='javascript' type='text/javascript'>
    $(#" + ddl.ClientID + ").change(function() { $(" + grvTimeSheets.ClientID + ").blockUI({ message: null }});} </script>";
          csm.RegisterStartupScript(cstype, csname1, script, true);
}

그게 당신이 의미 하는가?

BTW, 위는 작동하지 않았습니다. 오류가없고 이벤트가 작동하지 않았습니다.

도움이 되었습니까?

해결책

여기 몇 가지.

  1. 선택기를 $() 기능. 위의 코드 스 니펫은 같은 것을 생성합니다 $(#some-generated-id), 작동하지 않습니다.
  2. 명령문이 Onready 함수 외부에있는 경우 서버 측면의 닫힌 곱슬 브레이스. 개구부와 같은 수준으로 중첩되어야합니다.

이거 한번 해봐:

$(document).ready(function() //when DOM is ready, run containing code
{
  <% if (grvTimeSheets.EditIndex > -1) {%>
      var id = '#<%=grvTimeSheets.Rows[grvTimeSheets.EditIndex].FindControl("ddlClients").ClientID %>';
      $(id).change(function() { 
           $(id).block({ message: null }
        }); 
 <% } %>
}
);

작동하지 않으면 계속해서 생성 된 JavaScript도 붙여 넣으십시오.

다른 팁

이것을 사용하십시오 :

cs.RegisterClientScriptBlock(cstype, csname, cstext2.ToString(), False)

스크립트 태그를 포함시키기 때문에 스크립트 태그를 작성하지 않는 것이 거짓입니다. MSDN 문서는 깃발을 설명하는 방법에 잘못되었습니다.

또한 컨트롤의 클라이언트 ID를 코드에서 별도의 변수로 배치합니다. jQuery 암호.

그런 다음 jQuery 코드 대신 ID를 포함하는 변수를 사용하십시오.

뒤에 코드에서 작성한 스크립트 블록 내부 :

string script = @"<script type=text/javascript> var myControlId = '" + ddl.ClientId  "';") + "</script>"

이 구문을 확인하지는 않았지만 가까워 야합니다. 추가 구문을 추가 할 수 있습니다 grvTimeSheets.ClientID 당신 자신. 이 작업을 수행하는 경우 JavaScript 배열을 만들고 ClientID를 저장하기 위해 변경하고 작업 해야하는 글로벌 JavaScript 변수가 하나뿐입니다.

또 다른 옵션은 동작을 설명하는 클래스 이름을 찾고있는 요소를 제공하는 것입니다. 그러면 jQuery 코드가 정말 명확 해집니다.

$(function() {
    $("select.yourMarkerClass").change(....);
});

편집 행이 없으면이 코드는 아무것도하지 않습니다. 선택기와 일치하는 요소가 있으면 새로운 동작이 추가됩니다.

페이지의 다른 곳에서 동일한 ID를 사용하지 않으면 방해 할 수 있습니다. asp.netjQuery의 고급 선택기 중 하나와 함께 독창적 인 것 :

$('[id$=ddlClients]')

이것은 전체가 아닌 ID 문자열의 끝에만 일치합니다. 컨트롤이 다른 행 내에 여러 번 존재하면 모든 인스턴스와 일치합니다.

보다 선택기 더 많은 예를 보려면.

나는 그것을 사용했다 page.clientscript jQuery와 함께 액세스 해야하는 ID를 포함하려면 스크립트 블록을 등록하는 속성.

다음은 외부 파일의 JavaScript의 예입니다.

var myFancySelector = '#' + myControlId;
selectedValue = $(myFancySelector).val();

myControlID는 ClientScriptBlock의 뒤에있는 코드에서 정의되어 있습니다.

열쇠는 원하는 것이 될 수 있습니다.하지만 독특해야합니다.

주말 후에 더 많은 것을 시도 할 것입니다. 그러나 이것은 코드였습니다.

DropDownList ddl = (DropDownList)grvTimeSheets.Rows[grvTimeSheets.EditIndex].FindControl("ddlClients");
if (ddl != null)
{
    ClientScriptManager csm = Page.ClientScript;
    Type cstype = this.GetType();
    String csname1 = "PopupScript";

    string script = @"
    <script language='javascript' type='text/javascript'>
    jQuery(#" + ddl.ClientID + ").change(function() { $(" + grvTimeSheets.ClientID + ").blockUI({ message: null }});} </script>";
    csm.RegisterStartupScript(cstype, csname1, script, false);

각 행에 드롭 다운이 있기 때문입니다. 각 드롭 다운에는 고유 한 ClientId가 있으므로 Ben이 제안한 것을 수행하고 클래스 선택기가 가장 간단한 솔루션이므로 사용하는 것이 좋습니다.

또는 편집 클릭에서 JavaScript 함수를 작성한 다음 편집중인 해당 행에서 드롭 다운의 고유 한 클라이언트 ID를 얻을 수 있습니다.

죄송합니다. 코드를 자세히 읽어야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top