1

나는 현재 구글 크롬에서 Tampermonkey에서 다음 스크립트를 사용하고 있습니다 :왜이 스크립트는 연속적인 페이지 클릭과 함께 작동하지 않습니까?

// ==UserScript== 
// @name  Youtube opt in Ads per channel 
// @namespace schippi 
// @include  http://www.youtube.com/watch* 
// @version  1 
// ==/UserScript== 

var u = window.location.href; 
if (u.search("user=") == -1) { 
    var cont = document.getElementById("watch7-user-header").innerHTML; 
    var user=cont.replace(/.+\/user\//i,'').replace(/\?(?:.|\s)*/m,''); 
    window.location.href = u+"&user="+user; 
} 

그리스 몽키와 함께하지만, 구글 크롬 파이어 폭스에서 완벽하게 작동하는 것, 단지 YouTube 동영상의 첫 번째 클릭에 작동하는 것 같다 . 내가 YouTube 동영상을 클릭하면

이보다 구체적으로 :
youtube.com/watch?v=MijmeoH9LT4,
이 저를 리디렉션 : 나는 관련 동영상 수직 바에서 동영상을 클릭하면, 그러나
youtube.com/watch?v=MijmeoH9LT4&user=Computerphile

, 그것은 아무튼 더 이상 리디렉션을 수행하지 않는 것 같습니다.

+0

@BrockAdams는 : 흠 ... 여전히 작동하지 않을 것 같다. 새 스크립트 : http://pastie.org/pastes/8347656/text – user2805335

+0

네, 문제는 똑같습니다.하지만 YouTube가 더 이상 'hashchange'이벤트를 발생시키지 않기 때문에 솔루션이 완전히 동일하지는 않습니다. 나는 조금 대답을 게시 할 것이다. –

답변

2

아아, 아직 Chrome에서이 작업을 수행하는 데 "깔끔한"방법이 없습니다. (Firefox에는 더 많은 옵션이 있습니다.)

가장 좋은 건 단지 location.search입니다. 아래를보십시오. 크롬에서

귀하의 다른 옵션 현재은 권장되지 않습니다 - 그러나 여기에서 그들은 참조 용 :

  • Hack into the history.pushState function합니다. 이렇게하면 페이지 변경을 빠르게 알 수 있지만 코드를 실행하기 전에 실행되므로 타이머가 필요합니다. 또한, 사용자 스크립트 환경에서 크로스 - 스코프 문제를 야기합니다.
  • <title> 태그의 변경을 관찰하려면 Mutation Observers를 사용하십시오. 이 작업은 정상적으로 수행 될 수 있지만 원하는 후에는 지연 될 수 있으며 "깜박임"이라고 발음 될 수 있습니다. 잘못 설계된 페이지에서도 작동하지 않을 수 있습니다 (YouTube는 괜찮습니다).


는 또한 replace() 문, 질문에서, 여러 경우에 URL 404 스크립트를 날려 않습니다. DOM 메소드를 사용하여 사용자를 확보하십시오 (아래 참조).


폴링 코드 (단순, 강력한 크로스 브라우저) :

// ==UserScript== 
// @name  Youtube opt in Ads per channel 
// @namespace schippi 
// @include  http://www.youtube.com/watch* 
// @version  1 
// @grant  GM_addStyle 
// ==/UserScript== 
/*- The @grant directive is needed to work around a design change 
    introduced in GM 1.0. It restores the sandbox. 
*/ 
var elemCheckTimer  = null; 
var pageURLCheckTimer = setInterval (
    function() { 
     if (this.lastQueryStr !== location.search) { 
      this.lastQueryStr = location.search; 
      gmMain(); 
     } 
    } 
    , 111 //-- Nine times a second. Plenty fast w/o bogging page 
); 

function gmMain() { 
    if (! /user=/.test (window.location.href)) { 
     elemCheckTimer = setInterval (checkUserAndRelocate, 24); 
    } 
} 

function checkUserAndRelocate() { 
    var elem  = document.querySelector (
     "#watch7-user-header a[href*='/user/']" 
    ); 
    if (elem) { 
     clearInterval (elemCheckTimer); 
     var user = elem.href.match (/\/user\/(\w+)\W?/); 
     if (user && user.length > 1) { 
      location.replace (location.href + "&user=" + user[1]); 
     } 
    } 
} 
+0

스크립트가 오래된 것일 수 있습니다. 그것은 당신이 그것을 클릭하면 홈 페이지에 사용자를 넣습니다. 그리고 다시로드하지 않고 비디오에 넣지 않습니다. – Gopoi

+0

@Gopoi, 예, YouTube가 빠르게 변합니다. 다시 점검하기 위해 이것을이 큐에 넣을 것이지만 문제는 관심이 적은 것 같습니다. 그래서 우선 순위가 낮습니다. –

+0

나는 픽스 (fix)가 있는지 직접 확인하고있다. 스크립트가 켜기 /보기 페이지에서 시작되지 않는 것처럼 보이지만 다시로드 한 후에는 이상하게 보입니다. 그것은 tampermonkey 문제일까요? 게다가 (youtube 홈 버튼을 눌러) 페이지를 종료 할 때 user =는 주소로 들어가서 오류가 발생합니다. 나는 첫 번째 스크립트를 시도하고 /\ "(? : \\\\\\\\\\\\\\\\) \\\"와 일치하는 두 번째 바꾸기를 변경했지만 스크립트는 실행되지 않습니다. 디버그 창에서 그것은 스크립트가 대기열에 있음을 나타내지 만 실행하지 않습니다. – Gopoi