2012-04-27 2 views
4

나는 eval을 사용하지 않고 Crockford가 다음과 같은 점이 무엇인지 잘 모르겠습니다. 다음 문제를 해결하기위한 더 나은 접근법이 있습니까 아니면 무시할 필요가있는 것입니다 (개선의 여지가있는 경우 솔루션을 완벽하게 개선하는 것을 선호합니다).함수 (..) throws 'eval is evil'메시지

일부 픽셀 추적 기능을 사용하고 있는데이 경우 클라이언트는 JS 기능을 사이트 외부로 리디렉션되는 HTML 이미지 태그의 onclick 속성에 바인딩했습니다. 이미지의 이벤트 리스너를 여러 번 사용하여 경쟁 조건을 뛰어 넘지 않고 안정적으로 클릭 수를 추적해야합니다. 전략은 런타임에 이벤트를 무시하고 내 자신의 기능에서 이벤트를 복사 및 실행하는 것입니다. 이것은 내가 제어 할 수없고 변경할 수없는 사이트에 적용된다는 점에 유의하십시오. 그래서 해결책은 같은 같습니다

... 
func = Function(img.attr('onclick')); 
... 
img.attr('onclick', ''); 
... //some custom tracking code 
func.call(this); 

을하고 JSLint 검사기는 eval is evil 오류가 발생합니다.

href 개의 여러 이벤트에 대한 경쟁 조건을 피할 수있는 더 좋은 방법이 있습니까? 당신이이 문자열로 HTML의 속성으로 지정되었을 때 콜백 함수 요청 후와 Function을 구성하고 있기 때문에 당신은 암시 적으로 eval을 사용하고

+0

에 공급 될 때 원래의 핸들러가 동일한 매개 변수와 함께 호출되는 것을 보장

  • 당신처럼 보인다 익명 폐쇄 내부에 숨겨져 자바 스크립트 코드가 들어있는 경우 onclick 이벤트 핸들러를 트리거하면됩니다. img.onclick(); 또는 img.onclick.call(); – GillesC

  • +0

    @ gillesc 기술적으로는 _attribute_가 아닌 _property_입니다. – Alnitak

    +0

    실제로 이벤트 핸들러를 사용했지만 실제로는 올바르게 처리 할 수 ​​없으므로 속성이 아님을 지적 해 주셔서 감사합니다. – GillesC

    답변

    7

    .

    그냥 대신 img.onclick특성을 사용하고, 직접 브라우저 속성에서 내장이 기능을 얻을 것이다 할 수 있습니다 다음 .call :

    var func = img.onclick; // access already compiled function 
    img.onclick = null;  // property change updates the attribute too 
    
    ... // some custom tracking code 
    
    func.call(img, ev);  // call the original function 
    

    또는 더 나은 아직 :

    (function(el) { 
        var old = el.onclick; 
        el.onclick = function() { 
         // do my stuff 
         .. 
         // invoke the old handler with the same parameters 
         old.apply(this, arguments); 
        } 
    })(img); 
    

    이 후자의 방법의 이점은 두 배입니다.

      ,
    1. 그것은 새로운 글로벌 변수를 생성하지 - 모든 것이 그것은 당신의 교체 기능
    +0

    복사 한 후에'onclick'을 벗겨서 더 이상 이미지의 속성이 아닙니다. 나 자신의 코드 내부에서 함수를 호출한다고 언급했다. 거기에 그대로두면 리디렉션이 끝나기 전에 추적 코드가 완료되지 않을 수도 있습니다. – patrickgamer

    +1

    @patrickgamer 그래서 원래 속성 텍스트가 아닌 (함수 참조) 속성 값을 복사합니다. – Alnitak

    +0

    나는 당신과 프로그 사이에 앞뒤로 튀어 오르고있다. 필자는 애트리뷰트를 함수로 복사하고 엘리먼트의 프로퍼티를 복사하는 것의 차이점을 결코 고려하지 않았다. 매우 감사합니다. – patrickgamer

    2
    var oldClick = myImg.onclick; 
    myImg.onclick = function(evt){ 
        // Put you own code here 
        return oldClick.call(this, evt); 
    }; 
    
    +0

    아, 네가 지금 무슨 말하는지 알 겠어. 이것은 더 이상 JSLint 에러를 던지지 않을 것입니까? – patrickgamer

    +0

    직접 TIAS :) – Phrogz