2013-07-13 3 views
1

빠른 배경 : 기존 코드를 업데이트하여 html 개체에서 이벤트 처리기를 분리하고 onload 함수에서 필요한 모든 처리기를 할당합니다.기존 이벤트 처리기의 값을 동적으로 수정

$('input[name^="interactiveElement_"]').each(function() { 
    var fieldName = "interactiveElement_"; 
    var elementNumber = $(this).attr("name").substring(fieldName.length,$(this).attr("name").indexOf("_",fieldName.length)); 
    var subElementNumber = $(this).attr("name").substring((fieldName+itemNumber+'_').length,$(this).attr("name").lastIndexOf('_')); 
    var rowNumber = $(this).attr("name").substring($(this).attr("name").lastIndexOf('_')+1); 

    $(this).on("click.custNamespace", function() { 
     updateThisElementsMetadata(elementNumber, subElementNumber, rowNumber); 
     updatePreview(elementNumber); 
    }); 
}); 

이제 어려운 부분입니다. 이 인터페이스에서 사용자는 기존 요소의 클론을 트리거 할 수 있습니다. 이러한 클론은 핸들러 인수 중 일부를 새 값으로 업데이트해야합니다.

var regex = /([^0-9]+[0-9]+[^0-9a-zA-Z]+[0-9]+[^0-9a-zA-Z]+)([0-9]+)([^0-9]+)?/g; 
$(element).attr("onclick", 
       $(element) 
        .attr("onclick") 
        .replace(regex, "$1"+newValue+"$3")); 

등 가능한 각 이벤트에 대한 이러한 요소 수 :

이벤트를 분리하기 전에, 나는이 함께 것을하고 있었다.

하지만 이제 jQuery의 on (event, handler)을 사용하여 더 이상 처리기가 무엇인지에 대한 가시성이 없습니다. 이 변수 이름없는 값으로 함수를 반환

jQuery._data(element).events.click[0].handler 

을하지만 -

나는 (Get value of current event handler using jQuery이 질문에 다음과 같은)이 시도했습니다. 내가 기대 한 것

function() { 
    updateThisElementsMetadata(elementNumber, subElementNumber, rowNumber); 
    updatePreview(elementNumber); 
} 

:

function() { 
    updateThisElementsMetadata(1, 2, 1); 
    updatePreview(1); 
} 

콘솔 로그에 보면 나는 jQuery._data(element).events.click[0] 핸들러에서 => < 기능 범위> => 클로저 값을 가지고 있음을 볼 수 있지만하지 않는 것 거기에 액세스 할 수있는 점 표기법이 있거나 동적으로 순환 할 수있는 배열이 있습니다.

이것이 불가능하다고 말하면 모든 함수 'args를 $ (this)로 변경하고 각 함수에서 필요한 값을 구문 분석하거나 헬퍼 함수를 ​​가질 수 있다고 생각합니다. ...하지만 거기에 무엇이 비슷한 설치를 유지할 수 있다면 그것은 다른 dev의 학습 곡선을 완화 것입니다.

최종 솔루션

나는 (데이터 - 중복 정보를 줄이기 위해 속성 대신) 이름/ID 태그에서 필요한 정보를 파싱 자바 스크립트 함수/객체를 생성, 중복 코드를 줄일 수 있습니다. 이벤트 처리기가 트리거 될 때마다 필요한 값을 먼저 구문 분석 한 다음 w/w 함수를 실행합니다. (당신은 data-이 청소기 만들기 위해 속성을 사용할 수 있습니다, 대신 요소의 name에서 모든 분석의 예 data-element-number="1"

$('input[name^="interactiveElement_"]').on("click.custNamespace", function() { 

    var fieldName = "interactiveElement_"; 
    var elementNumber = $(this).attr("name").substring(fieldName.length,$(this).attr("name").indexOf("_",fieldName.length)); 
    var subElementNumber = $(this).attr("name").substring((fieldName+itemNumber+'_').length,$(this).attr("name").lastIndexOf('_')); 
    var rowNumber = $(this).attr("name").substring($(this).attr("name").lastIndexOf('_')+1); 

    updateThisElementsMetadata(elementNumber, subElementNumber, rowNumber); 
    updatePreview(elementNumber); 
}); 

또한 :

$('input[name^="interactiveElement_"]').on("click.custNamespace", function() { 
    var inputField = inputFieldClass(this); 
    updateThisElementsMetadata(inputField.elementNumber, inputField.subElementNumber, inputField.rowNumber); 
    updatePreview(inputField.elementNumber); 
}); 


var inputFieldClass = function(field) { 
    var fieldIdentity = $(field).attr("name") === undefined ? $(field).attr("id") : $(field).attr("name"); 
    var fieldName = fieldIdentity.substring(0,fieldIdentity.indexOf("_")), 
     elementNumber = fieldIdentity.substring(fieldName.length + 1,fieldIdentity.indexOf("_",fieldName.length + 1)), 
     subElementNumber = fieldIdentity.substring((fieldName+'_'+elementNumber+'_').length,fieldIdentity.lastIndexOf('_')), 
     rowNumber = fieldIdentity.substring(fieldIdentity.lastIndexOf('_')+1); 

    return { 
     fieldName : fieldName, 
     elementNumber : elementNumber, 
     subElementNumber : subElementNumber, 
     rowNumber : rowNumber, 
     getInputName : function() { 
      return this.name + "_" + this.elementNumber + "_" + this.subElementNumber + "_" + this.rowNumber; 
     } 
    }; 
}; 
+0

"모든 함수 'args를 $ (this)로 변경하고 각 함수에서 필요한 값을 파싱 할 수 있습니다."- 그렇게하면 다른 개발자에게 도움이됩니다. 사실, 당신은 arg를 전혀 필요로하지 않습니다.'this'는 핸들러에서 자동으로 사용 가능합니다. 또한 모든 처리기를 한 번에 바인딩하거나 단일 처리기를 공통 조상에 위임 할 수 있습니다. – bfavaretto

+0

예, 아마도 맞을 것입니다. 이 인수에 관해서는, 예를 들어 foreach의 somefucntion()이 anotherfunction()을 호출 할 때 함수를 명시 적으로 받아 들여야한다고 생각합니다. anotherfunction()도 핸들러에서 호출됩니다.또는 foreach가 이것을 다른 함수로 전달하지 않는다고 가정 할 때 나는 틀린가? – Ivonne

답변

1

것은 내가 코멘트에 제안 된 어떤 것은이 같은했다 기타.).

+1

이것은 지난 밤에 내가 끝내었던 것과 꽤 비슷합니다. 위의 질문에 내가 한 일을 게시 할 것입니다. 이것은 반드시 이벤트 처리기에서 동적으로 변경되는 값의 질문에 대답하는 것은 아니지만, 중요한 변경 사항은 이름/ID 또는 데이터 속성 중 하나에 있어야합니다. 이러한 값은 동적으로 변경 될 수 있기 때문입니다. – Ivonne

관련 문제