5

Chrome 확장 프로그램을 완벽하게 실행하기에 너무 가깝지만 지금은 마지막 문제가 하나 있습니다.Chrome 확장 프로그램 - AJAX 링크/내비게이션에서 여러 번 쌓여있는 콘텐츠 스크립트

문제는

내가 문제가 관련되어 생각 ... 등 전체 페이지가 링크를 클릭시 다시로드되지 페이스 북, 같은 사이트에 반복적으로 주입되는 콘텐츠 스크립트에 관련이있는 것으로 보인다 사이트는 AJAX에 매우 의존적입니다.

전체 페이지를 새로 고치거나 처음으로로드하면 문제가 없습니다. 내 확장 프로그램이 실행되고 콘텐츠 스크립트가 올바르게 삽입됩니다.

그러나 처음에 페이지를로드 한 다음 사이트의 링크를 클릭하면 Facebook의 '콘텐츠 섹션'에 클릭 한 모든 링크가로드되고 맨 위에있는 파란색 탐색 표시 줄에는 ' 새로 고침하거나 전혀 변경하지 마십시오.

I.E. 전체 페이지가 다시로드되지 않습니다. 사이트의 "콘텐츠 섹션"과 탐색 모음은 모두 같은 프레임에 있으므로 콘텐츠 스크립트는 클릭하는 모든 링크에 대해 다른 시간에 계속 주입됩니다.

결국 콘솔 로그에 2X, 3X, 4X, 5X 등이 표시됩니다. 링크를 클릭 할 때마다 매번 1 씩 증가합니다.

컨텐츠 스크립트를 다시 주입하기 전에/이미 활성화 존재 여부를 확인하는 간단한 방법이 있나요 :

그래서 제 질문은 이것이다? 또는 이와 같은 상황에서 해결할 수있는 다른 방법은 무엇입니까?

답변

1

내 확장 프로그램의 콘텐츠 스크립트를 작성할 때 유사한 문제가 발생할 것으로 예상되어 확장 이름과 버전이있는 각 페이지의 <body> 요소에 고유 한 특성을 추가했습니다.

콘텐츠 스크립트가 수행하는 첫 번째 작업은이 속성이 이미 스크립트로 작성되어 있는지 확인한 후 중지하는 것입니다. 그렇지 않으면이 속성 (값이 true)을 추가하고 용도를 ​​계속합니다.

solution을보고 싶다면;

이 기법의 다소 복잡한 측면은 message passing을 사용하여 버전을 페치하고 매니페스트 (AJAX 요청에서 검색 됨)를 JSON 객체로 구문 분석하는 것입니다.

initonRequestHelper에서이 모양을 얻은 방법을 정확하게 보려면 here;

물론 버전을 하드 코딩하거나 완전히 생략 할 수 있습니다. 속성 이름이 고유 한 한.

+0

감사에서 콘텐츠 스크립트를로드! – delta9

+0

그의 솔루션에 대한 업데이트 된 링크가 지금 https://github.com/neocotic/template/blob/master/chrome/bin/lib/content.js입니다. –

+0

Thanks @SarahVessels, 관련 링크를 모두 업데이트했습니다. – Alasdair

1

상위 프레임에는 window.doneInjecting = true; 또는 비슷한 것을 추가 할 수 있습니까? (또는 숨겨진 요소를 페이지에 추가하십시오. 하위 프레임이 부모 JavaScript 변수에 액세스 할 수 있는지 확실하지 않습니다.)

기본적으로 간단한 플래그를 설정하여 콘텐츠 스크립트가 삽입 될 때마다 깃발은 존재하고 그것이 아닌 경우에만 계속합니까?

1

onUpdated는 탭의 상태가 변경 될 때마다 실행됩니다.단지 changeInfo.status == "complete"

background.js 링크 및 코드 샘플에 대한

chrome.tabs.onUpdated.addListener(function(tabId, changeInfo, tab) { 
chrome.tabs.getSelected(null, function(tab) { 
    // Do some stuff 
    if (changeInfo.status == "complete") 
    { 
     // load your scripts here 
     chrome.tabs.executeScript(tabId, {file: "jquery.js"}); 
     chrome.tabs.executeScript(tabId, {file: "jquery.highlight.js"}); 
    } 
}); 
});