문제

나는 다음과 같은(공정)간단한 JavaScript 코드 조각을 나는 유선으로 그리스 몽키.그것이 통 페이지 보기 위해 <a> 태그 그 href 포인트 tinyurl.com, 가"title"속성을 식별하는 진정한 목적의 링크입니다.의 많은 중요한 코드에서 이상(지원하지 않음)그리스 몽키는 스크립트 작업 종료할 때는 내부 구성 요소를 개최 XPath 구현을 변경되었습니다.내 스크립트:

(function() {
    var providers = new Array();
    providers['tinyurl.com'] = function(link, fragment) {
        // This is mostly taken from the (broken due to XPath component
        // issues) tinyurl_popup_preview script.
        link.title = "Loading...";
        GM_xmlhttpRequest({
                method: 'GET',
                url: 'http://preview.tinyurl.com/' + fragment,
                onload: function(res) {
                    var re = res.responseText.match("<blockquote><b>(.+)</b></blockquote>");
                    if (re)
                    {
                        link.title = re[1].replace(/\<br \/\>/g, "").replace(/&amp;/g, "&");
                    }
                    else
                    {
                        link.title = "Parsing failed...";
                    }
                },
                onerror: function() {
                    link.title = "Connection failed...";
                }
        });
    };
    var uriPattern = /(tinyurl\.com)\/([a-zA-Z0-9]+)/;
    var aTags = document.getElementsByTagName("a");

    for (i = 0; i < aTags.length; i++)
    {
        var data = aTags[i].href.match(uriPattern);
        if (data != null && data.length > 1 && data[2] != "preview")
        {
            var source = data[1];
            var fragment = data[2];
            var link = aTags[i];
            aTags[i].addEventListener("mouseover", function() {
                if (link.title == "")
                {
                    (providers[source])(link, fragment);
                }
            }, false);
        }
    }
})();

(한 이유"공급자"연관 배열 설정이 그것도록 확장할 수 있는 이 커버하는 다른 URL 단축시키는 서비스 뿐만 아니라.)

내가 있는지 확인한 모든의 여러 가지 코드가되고 올바르게 도달하는 경우 이 링크를 조사되는지와 일치하지 않는 패턴이 있습니다.What 일어나고,어떤 변화를"속성"제목의 앵커 태그가 있습니다.데 이를 통해 불을 지르,던져 alert() 통화에서 왼쪽과 오른쪽,그리고 그것은 결코 변하지 않습니다.에서 이전의 반복 표현의 형태로 되어 있습니다.

link.title = "...";

원:

link.setAttribute("title", "...");

작동 하지 않았습니다.내가 안돼서 자바스크립트나 그리스 몽키지만,이는 나황!

도움이 되었습니까?

해결책

를 교체하고 몸의 if 이 코드 대신 합니다.

        aTags[i].addEventListener("mouseover", (function(source, fragment)
        {
            return function()
            {
                if (this.title == "")
                {
                    (providers[source])(this, fragment);
                }
            }
        })(data[1], data[2]), false) ; 

참고가 루프가 완전한지 aTags = null;.

귀하의 문제는 경우 문을 차단하지 않은 진정한 범위를,아무것도 var d 에 속하는 것입니다 외부 기능은 범위가 있습니다.따라서 귀하의 내부는 기능을 제공하 이벤트로 핸들러를 사용하여 소스,링크 및 조각의 마지막 전달합니다.또한을 유지하여 참조하 DOM 개체 당신은 메모리 누출로 인해 원형 참조가 있습니다.

위의 방법을 만들 새로운 범위에 각각 전달을 통한 함수 호출에 그래서 각 소스와 조각은 그것의 자신의 범위가 있습니다.그것은 또한 사용하는 사실을 기능으로 불리는 이벤트를 수신가 this 시에서 가리키는 요소를 연결되어 있고,따라서 피하는 순환을 참조를 포함하는 DOM 요소입니다.

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