2013-05-24 4 views
0

일치하는 문자열을 문서에 쿼리하고 얻은 문자열에서 URL을 만드는 코드를 만들었습니다. 일치하는 태그 요소를 살펴보고 URL 문자열을 만든 다음 지정된 parentNode 객체에 링크를 추가합니다. 이 코드는 일반 자바 스크립트에서는 잘 작동하지만 Greasemonkey에 붙이면 깨집니다. 나는 이유를 알 수 없다.Greasemonkey 스크립트에서 innerText가 정의되지 않았습니다.

은 여기가 크롬 콘솔에 충실 할 때 완벽하게 작동 버전 :

/* 
    Exception: Tags[i].innerText is undefined 
    @Scratchpad:18 
*/ 
:

//loop through elements by classname and find string matches 
regexQueryEmail = "(AccountEmailAddress\\s)(.+?)(\\n)" 
regexQueryContact = "(Contact with ID:)(.+?)(\\D)" 

var Tags = document.getElementsByClassName('msg-body-div') 
for (i = 0; i < Tags.length; i++) { 
    matchEmail = Tags[i].innerText.match(regexQueryEmail) 
    matchContact = Tags[i].innerText.match(regexQueryContact) 
    if (matchEmail != null) { 
     var emailString = matchEmail[2] 
     var placeHolder = Tags[i] 
    } 
    if (matchContact != null) { 
     var idString = matchContact[2] 
    } 
} 

var urlFirst = "https://cscentral.foo.com/gp/stores/www.foo.com/gp/communications/manager/main/191- 4559276-8054240?ie=UTF8&customerEmailAddress=" 
var urlSecond = "%3E&initialCommId=" 
var cscURL = urlFirst + emailString + urlSecond + idString 

var cscLink = document.createElement('a') 
cscLink.innerText = 'Communication History' 
cscLink.href = cscURL 
placeHolder.parentNode.appendChild(cscLink) 

내가 그리스 몽키에 스틱, 그것은 나에게 그리스 몽키 "편집"화면에서이 오류를 제공합니다


"placeHolder"는 정의되지 않았지만 지금은 복제 할 수 없습니다. 변수의 범위와 관련이 있다는 느낌이 들었습니다. "var 태그;"를 추가했습니다. 및 "var placeHolder;" 스크립트 상단으로 이동하면 도움이되지 않습니다.

답변

1

Firefox는 element.textContent 속성을 사용합니다.

https://developer.mozilla.org/en-US/docs/Web/API/Node.textContent?redirectlocale=en-US&redirectslug=DOM%2FNode.textContent

당신은 그것을 사용하려고. 대신 당신의 for 루프 어딘가에 선언 된 것 범위에서 선언 결코에서 변수 placeholder. 같은 범위 내에서 선언해야합니다.

예.

var Tags = document.getElementsByClassName('msg-body-div') 

var placeholder; // declare in same scope 

for (var i = 0; i < Tags.length; i++) { 

    // lookup the tag once 
    var tag = Tags[i]; 

    // get the text only once 
    var text = tag.textContent; 

    matchEmail = text.match(regexQueryEmail) 
    matchContact = text.match(regexQueryContact) 

    if (matchEmail != null) { 
     var emailString = matchEmail[2] 

     placeHolder = tag // deleted var statement 
    } 
    if (matchContact != null) { 
     var idString = matchContact[2] 
    } 
} 

... 

// now you can use it. 

if (placeHolder) { 
    placeHolder.parentNode.appendChild(cscLink); 
} 
+0

당신이 맞습니다. 고마워요! –

관련 문제