2017-12-31 138 views
1

을 새로 고칩니다. 따라서이 사용자 스크립트는 페이지 내부의 문자열을 찾습니다. 찾지 못하면 4 초 후 페이지를 새로 고칩니다.배열의 항목이 페이지에 있는지 확인하십시오. 그렇다면 경고하십시오. 그렇지 않은 경우 페이지

var item = 'apple'; 
if(document.body.innerHTML.toString().indexOf(item) > -1){ 
    setTimeout(function() { 
     alert(item + " was found"); 
    }, 150); 
}else{ 
    setTimeout(function() 
       { 
     location.reload(true); 
    }, 4000); 
} 

이 코드는 완벽하게 작동합니다. 그러나, 나는 배열, 1 개 이상의 항목을 검색하고 싶었 :

var item = [ 
    'apple', 
    'peach' 
]; 
for (var i = 0; i < item.length; i++){ 
    if(document.body.innerHTML.toString().indexOf(item[i]) > -1){ 
     player.play(); 
     setTimeout(function() { 
      var curitem = item[i]; 
      alert(item[i] + " was found"); 
     }, 200); 
    } 
} 
//else{ 
// setTimeout(function() 
//    { 
//  location.reload(true); 
// }, 4000); 
//} 

하지만, 나는 붙어 모르는 오전 :

  1. 어떻게 배열의 항목을 경고하는 발견? 지금 당장은 '정의되지 않은 것이 발견되었습니다'라는 경고 메시지가 표시됩니다.
    이것은 스크립트가 작동하고있어 배열의 항목을 찾는 중입니다. 그러나 알림에는 '정의되지 않은'것으로 표시됩니다.
  2. 아무 것도 발견되지 않으면 어떻게 페이지를 새로 고 칩니 까?
+0

"var curitem = item [i]"를 setTimeout 호출 위로 이동하고 "alert (curitem +"을 (를) 찾았습니다 "); 대신 "i"가 범위를 벗어났습니다. – arieljuod

+0

@Daniel, [그와 같은 goalposts 이동] (https://meta.stackoverflow.com/questions/258206/what-is-a-help-vampire)은 허용되지 않습니다. 새로운 문제는 쉽지만 새로운 문제도 있습니다. *** 여기에 * 원래 * 질문이 해결 된 후 ***에 대한 새로운 질문을하십시오 - 아래 답변이있는 것 같습니다. –

+0

@BrockAdams 이전에 그렇게 할 수 있었고 문제는 새로운 솔루션이 제공되어 새로운 것이 었습니다./그래서 그것에 대해 알지 못했습니다. 죄송합니다. –

답변

1

이렇게하면 배열에서 첫 번째 항목을 찾습니다. Div는 스크립트가 예제 스 니펫의 본문에 속하기 때문에 여기서 content이 사용됩니다.

var item = [ 
 
    'apple', 
 
    'peach' 
 
]; 
 

 
//make sure that items dont contain special regex chars 
 
var itemRe = new RegExp(item.join("|")); 
 
var result = document.getElementById("content").innerHTML.toString().match(itemRe); 
 

 
if (result) { 
 
    //player.play(); 
 
    setTimeout(function() { 
 
    alert(result.toString() + " was found"); 
 
    }, 200); 
 
} else { 
 
    setTimeout(function() { 
 
    location.reload(true); 
 
    }, 4000); 
 
}
<div id="content">gfg</div>

2

이 할 수있는 몇 가지 방법이 있습니다. 정규 표현식을 선호하는 이유는 많은 양의 단어에 대해 더 큰 힘을주고 루핑하는 것보다 일반적으로 빠르기 때문입니다.

코드처럼 :

var items = [ 
 
    'apple', 
 
    'peach' 
 
]; 
 
var itmRegEx = new RegExp (`(${ items.join("|") })`); 
 

 
var itmMtch = document.body.innerHTML.match (itmRegEx); 
 
if (itmMtch && itmMtch.length) { 
 
    //player.play(); 
 
    //setTimeout (alert, 200, itmMtch[1] + " was found"); 
 
    setTimeout (console.log, 200, itmMtch[1] + " was found"); 
 
} 
 
else { 
 
    console.log ("Reloading..."); 
 
    //setTimeout (() => {location.reload (true);}, 4000); 
 
}

참고 :

  1. toString()은 필요하지 않습니다.
  2. 이렇게하면 정규식의 모든 기능을 사용할 수 있습니다. 예를 들어 'apple\\b' 같은 표현식은 "사과"와 일치하지만 "사과"와는 일치하지 않습니다.
  3. innerHTML을 사용하여주의하시기 바랍니다. 이것은
    <a href="virusserver.net/badapple">free!</a>과 일치합니다.
    원하는 내용이 페이지에 눈에 띄게 표시되면 textContent을 대신 사용하십시오.
  4. setTimeout()의 최신 양식에 유의하십시오.
  5. document.body은 넓고 느린 그물을 던집니다. 가능한 경우 클래스 또는 ID별로 관심있는 노드를 대상으로 지정하십시오.
  6. location.reloadsetTimeout()의 매개 변수화 된 버전이 작동하지 않는 특수한 경우입니다. ("잘못된 호출"오류가 발생합니다.)
+0

답장을 보내 주셔서 감사합니다. 현재 게시물을 최신 문제로 업데이트했습니다. –