for 루프에서 이벤트 핸들러 바인딩

Hubert Schölnast

루프에서 html 요소를 만들고 일부 요소에 이벤트 처리기를 연결하고 싶습니다. 이 핸들러는 이벤트를 발생시킨 요소의 ID를 알아야하므로 바인딩 된 함수의 매개 변수로 요소 ID를 추가했지만 어쨌든 마지막에 클릭 한 요소는 항상 마지막 요소의 ID를 받았습니다. 클릭 한 요소가 아닙니다.

다음은 코드입니다 (다음 코드 블록에서보다 단순화 된 버전) (저는 jQuery를 사용하고 있지만 이것은 jQuery 문제가 아니라 JavaScript 문제 일뿐입니다)

receiveObjects = function (JSONobj, StatusString, jqXHR) {
    var html, i, el;

    // error-handling is not shown here

    html  = '<table>';
    for (i = 0; i <  JSONobj.list.length; i++) {
        el = JSONobj.list[i];

        html += '<tr>';

        html += '<td class="td1" id="td1'+el.itemID+'">';
        html +=     '<table>';
        html +=         '<tr>';
        html +=             '<td><img id="up9x'+el.itemID+'" src="pics/arrowUp9.png" alt="" style="width:25px;height:66px;"></td>';
        html +=             '<td><img id="up3x'+el.itemID+'" src="pics/arrowUp3.png" alt="" style="width:25px;height:66px;"></td>';
        html +=             '<td><img id="up1x'+el.itemID+'" src="pics/arrowUp1.png" alt="" style="width:25px;height:66px;"></td>';
        html +=         '</tr>';
        html +=         '<tr>';
        html +=             '<td><img id="down9x'+el.itemID+'" src="pics/arrowDown9.png" alt="" style="width:25px;height:66px;"></td>';
        html +=             '<td><img id="down3x'+el.itemID+'" src="pics/arrowDown3.png" alt="" style="width:25px;height:66px;"></td>';
        html +=             '<td><img id="down1x'+el.itemID+'" src="pics/arrowDown1.png" alt="" style="width:25px;height:66px;"></td>';
        html +=         '</tr>';
        html +=         '<tr>';
        html +=             '<td colspan="3">';
        html +=                 '<div><button id="delete'+el.itemID+'" name="delete'+el.itemID+'" value="delete'+el.itemID+'">delete</button></div>';
        html +=                 '<div id="saveDiv'+el.itemID+'" style="display:none;">';
        html +=                     '<button id="save'+el.itemID+'" name="save'+el.itemID+'" value="save'+el.itemID+'">save</button>';
        html +=                 '</div>';
        html +=             '</td>';
        html +=         '</tr>';
        html +=     '</table>';
        html += '</td>';

        html += '<td class="td2" id="td2'+el.itemID+'">';
        html +=     '<table>';
        html +=         '<tr>';
        html +=             '<td>Titel&nbsp;</td>';
        html +=             '<td>';
        html +=                 '<input class="grau" type="text" id="inTitel'+el.itemID+'" size="30" maxsize="50" value="'+el.Titel+'">';
        html +=             '</td>';
        html +=         '</tr>';
        html +=         '<tr>';
        html +=             '<td>ET</td>';
        html +=             '<td>';
        html +=                 '<input class="grau" type="text" id="inET'+el.itemID+'" size="20" maxsize="30" value="'+el.ET+'">';
        html +=             '</td>';
        html +=         '</tr>';
        html +=         '<tr>';
        html +=             '<td>Text&nbsp;</td>';
        html +=             '<td>';
        html +=                 '<textarea class="grau" id="inText'+el.itemID+'" rows="4" cols="30">'+el.Text+'</textarea>';
        html +=             '</td>';
        html +=         '</tr>';
        html +=     '</table>';

        html +=     '<button id="loadPdf'+el.itemID+'" name="loadPdf'+el.itemID+'" value="loadPdf'+el.itemID+'">upload pdf</button>';
        html += '</td>';

        html += '<td class="td3" id="td3'+el.itemID+'">';
        html +=     '<img src="'+el.pic+'">';
        html +=     '<div>';
        html +=         '<button id="newPic'+el.itemID+'" name="newPic'+el.itemID+'" value="newPic'+el.itemID+'">create pic from pdf</button> ';
        html +=     '</div>';
        html += '</td>';

        html += '</tr>';

    }

    html += '</table><div class="ErrorMsg" id="changeRedError"></div>';

    $('#workBlock').html(html);

    //after the elements are inserted into the dom, the eventhandlers should be binded:

    for (i = 0; i <  JSONobj.list.length; i++) {
        el = JSONobj.list[i];

        $('#up9x'+el.itemID).on('click',function(){evHd.clickMove(el.itemID,-9);})
        $('#up3x'+el.itemID).on('click',function(){evHd.clickMove(el.itemID,-3);})
        $('#up1x'+el.itemID).on('click',function(){evHd.clickMove(el.itemID,-1);})
        $('#down9x'+el.itemID).on('click',function(){evHd.clickMove(el.itemID,9);})
        $('#down3x'+el.itemID).on('click',function(){evHd.clickMove(el.itemID,3);})
        $('#down1x'+el.itemID).on('click',function(){evHd.clickMove(el.itemID,1);})

        $('#delete'+el.itemID).on('click',function(){evHd.clickDelete(el.itemID);})

        $('#save'+el.itemID).on('click',function(){evHd.clickSave(el.itemID);})

        $('#inTitel'+el.itemID).on('change keyup paste mouseup',function(){evHd.changed(el.itemID);})
        $('#inET'+el.itemID).on('change keyup paste mouseup',function(){evHd.changed(el.itemID);})
        $('#inText'+el.itemID).on('change keyup paste mouseup',function(){evHd.changed(el.itemID);})

        $('#loadPdf'+el.itemID).on('click',function(){evHd.clickLoadPdf(el.itemID);})

        $('#newPic'+el.itemID).on('click',function(){evHd.clickNewPic(el.itemID);})
    }
}

el.itemID이벤트 처리기 함수에 ID ( )를 연결하는 방식에 문제가 있어야합니다 . 쉽게 한:

for (i = 0; i < 500; i++) {
    el = JSONobj.list[i];
    $('#prefix'+i).on('click',function(){
        handler(i); //this seems to be problematic
    })
}

문제가 어디에 있는지 알고 있지만 어떻게 해결해야할지 모르겠습니다. 도와 주 시겠어요?

스테판 맥스

이것은 JavaScript의 클로저 (함수와 함수 본문에서 참조 된 함수 외부의 모든 변수에 대한 포인터) 개념으로 인해 매우 일반적인 실수 입니다. IIFE (즉시 호출 된 함수 표현식) 로이 문제를 해결할 수 있습니다 .

for (i = 0; i < 500; i++) {
  (function(num) {
    $('#prefix' + num).on('click',function() {
      handler(num);
    })
  })(i);
}

이 즉시 호출 함수는 새 범위를 만들 따라서 올바른가있을 것이다 i저장 num. 그렇지 않으면 JavaScript의 클로저 (함수가 포인터를 유지 i하므로 for루프가 끝난 후 항상 500을 참조 함 )는 이벤트 핸들러를 엉망으로 만듭니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

PyQT에서 이벤트 핸들러 바인딩

분류에서Dev

핸들러에 바인딩 된 jQuery 이벤트 제거

분류에서Dev

객체와 함수를 jQuery '변경'이벤트 핸들러에 바인딩

분류에서Dev

Ember 핸들 바 도우미의 이벤트 핸들러에 인수 전달

분류에서Dev

Ember 핸들 바 도우미의 이벤트 핸들러에 인수 전달

분류에서Dev

이 이벤트 핸들러를 jQuery 플러그인에 어떻게 바인딩합니까?

분류에서Dev

핸들러에서 자바 스크립트 제거 이벤트,

분류에서Dev

이벤트 핸들러를 jQuery의 여러 요소 변수에 바인딩 하시겠습니까?

분류에서Dev

Telerik MVC ClientTemplates에서 이벤트 핸들러를 어떻게 바인딩 할 수 있습니까?

분류에서Dev

바인딩 할 테이블 행에 대한 반응 (이) 클릭 이벤트 핸들러

분류에서Dev

HTML에서 다중 인수 onMouseover 이벤트 핸들러 전달

분류에서Dev

.on () 이벤트 핸들러 앞에 확인 대화 확인 추가

분류에서Dev

이름이 지정되지 않은 함수를 사용하여 요소를 JS 이벤트 핸들러에 바인딩 / 바인딩 해제

분류에서Dev

여러 이벤트 핸들러를 스크롤 이벤트에 바인딩하면 성능이 저하됩니까?

분류에서Dev

루프없이 여러 요소에 이벤트 바인딩 (바닐라 JS)

분류에서Dev

typescript를위한 강력한 형식의 이벤트 패키지입니다. 이벤트에 바인딩 된 핸들러를 추가하는 방법

분류에서Dev

이벤트 핸들러에서 대기

분류에서Dev

JavaScript의 이벤트 핸들러에 올바른이 컨텍스트를 어떻게 제공하거나 바인딩합니까?

분류에서Dev

동적으로 추가 된 이벤트 핸들러는 자바 스크립트에서 이전 이벤트 핸들러를 비활성화합니다.

분류에서Dev

여러 이벤트가있는 jQuery .on () 메서드-이벤트 핸들러 함수에 인수 전달

분류에서Dev

이벤트 핸들러가 문서에 첨부되었는지 확인

분류에서Dev

클래스 인스턴스에서 이벤트 핸들러 가져 오기

분류에서Dev

React에서 이벤트 핸들러 외부에서 바인딩 된 함수를 실행하는 방법은 무엇입니까?

분류에서Dev

ajax가 진행되는 동안 이벤트 핸들러 바인딩 해제

분류에서Dev

닫기 버튼으로 jQuery UI Accordion 확장-이벤트 핸들러 바인딩

분류에서Dev

Jquery .on () 함수가 PHP에 의해 동적으로 생성 된 요소와 이벤트 핸들러를 올바르게 바인딩하지 않습니다.

분류에서Dev

jQuery에서 DOM을 만들기 전에 이벤트 바인딩

분류에서Dev

하나의 솔루션에있는 두 프로젝트와 이벤트 핸들러 간의 인터페이스 이벤트

분류에서Dev

이벤트 핸들러에 인수를 어떻게 전달합니까?

Related 관련 기사

  1. 1

    PyQT에서 이벤트 핸들러 바인딩

  2. 2

    핸들러에 바인딩 된 jQuery 이벤트 제거

  3. 3

    객체와 함수를 jQuery '변경'이벤트 핸들러에 바인딩

  4. 4

    Ember 핸들 바 도우미의 이벤트 핸들러에 인수 전달

  5. 5

    Ember 핸들 바 도우미의 이벤트 핸들러에 인수 전달

  6. 6

    이 이벤트 핸들러를 jQuery 플러그인에 어떻게 바인딩합니까?

  7. 7

    핸들러에서 자바 스크립트 제거 이벤트,

  8. 8

    이벤트 핸들러를 jQuery의 여러 요소 변수에 바인딩 하시겠습니까?

  9. 9

    Telerik MVC ClientTemplates에서 이벤트 핸들러를 어떻게 바인딩 할 수 있습니까?

  10. 10

    바인딩 할 테이블 행에 대한 반응 (이) 클릭 이벤트 핸들러

  11. 11

    HTML에서 다중 인수 onMouseover 이벤트 핸들러 전달

  12. 12

    .on () 이벤트 핸들러 앞에 확인 대화 확인 추가

  13. 13

    이름이 지정되지 않은 함수를 사용하여 요소를 JS 이벤트 핸들러에 바인딩 / 바인딩 해제

  14. 14

    여러 이벤트 핸들러를 스크롤 이벤트에 바인딩하면 성능이 저하됩니까?

  15. 15

    루프없이 여러 요소에 이벤트 바인딩 (바닐라 JS)

  16. 16

    typescript를위한 강력한 형식의 이벤트 패키지입니다. 이벤트에 바인딩 된 핸들러를 추가하는 방법

  17. 17

    이벤트 핸들러에서 대기

  18. 18

    JavaScript의 이벤트 핸들러에 올바른이 컨텍스트를 어떻게 제공하거나 바인딩합니까?

  19. 19

    동적으로 추가 된 이벤트 핸들러는 자바 스크립트에서 이전 이벤트 핸들러를 비활성화합니다.

  20. 20

    여러 이벤트가있는 jQuery .on () 메서드-이벤트 핸들러 함수에 인수 전달

  21. 21

    이벤트 핸들러가 문서에 첨부되었는지 확인

  22. 22

    클래스 인스턴스에서 이벤트 핸들러 가져 오기

  23. 23

    React에서 이벤트 핸들러 외부에서 바인딩 된 함수를 실행하는 방법은 무엇입니까?

  24. 24

    ajax가 진행되는 동안 이벤트 핸들러 바인딩 해제

  25. 25

    닫기 버튼으로 jQuery UI Accordion 확장-이벤트 핸들러 바인딩

  26. 26

    Jquery .on () 함수가 PHP에 의해 동적으로 생성 된 요소와 이벤트 핸들러를 올바르게 바인딩하지 않습니다.

  27. 27

    jQuery에서 DOM을 만들기 전에 이벤트 바인딩

  28. 28

    하나의 솔루션에있는 두 프로젝트와 이벤트 핸들러 간의 인터페이스 이벤트

  29. 29

    이벤트 핸들러에 인수를 어떻게 전달합니까?

뜨겁다태그

보관