2011-11-06 66 views
1

我發現自己一遍又一遍地閱讀相同的問題,所以我想要一種隱藏問題的方法。Greasemonkey腳本隱藏stackoverflow帖子?

我有一個腳本來做什麼是假設要做的,但它會癱瘓現有的javascript,比如upvote按鈕和在提問時添加標籤。有誰知道這是爲什麼發生,或者如何解決它?

編輯:哦,在錯誤控制檯我得到:

Error: $ is not a function 
Source File: http://cdn.sstatic.net/js/stub.js?v=b7084478a9a4 
Line: 1 

EDIT2:

解決方案

(固定@ 17/06/2014)

// ==UserScript== 
// @name   StackOverflowHidePosts 
// @namespace  StackOverflowHidePosts 
// @description Allows you to hide questions on Stack Overflow. 
// @include  http://stackoverflow.com/* 
// @require  http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js 
// ==/UserScript== 

var idListString = GM_getValue('idList', ''); 
var idList = idListString.split(','); 
GM_setValue('idList', idList.join(',')); 

function getId (idString) 
{ 
    return idString.split('-')[2]; 
} 

function removeQuestion (e) 
{ 
    var id = getId(e.data.questionSummaryDiv.id); 

    $(e.data.questionSummaryDiv).hide(250); 

    idList.push(id); 

    setTimeout(function() { 
     GM_setValue('idList', idList.join(',')); 
    }, 0); 

    return false; 
} 

$('div.question-summary').each(function (index, questionSummaryDiv) 
{ 
    var id = getId(questionSummaryDiv.id); 

    if (idList.indexOf(id) != -1) 
    { 
     $(questionSummaryDiv).hide(); 

     return; 
    } 

    var link = $('<a><em>(Hide Post)</em></a>'); 

    link.attr('href', '#' + questionSummaryDiv.id); 

    link.click({questionSummaryDiv: questionSummaryDiv}, removeQuestion); 

    $('div.started', questionSummaryDiv).append(link); 
}); 

回答

2

決不注入JS,如果你沒有,從來沒有在FF GM使用頁面的jQuery的 - 這是錯誤的主要來源在這種情況下。

整個腳本應該是:

// ==UserScript== 
// @name   StackOverflowImTooStupidMarker 
// @namespace  StackOverflowImTooStupidMarker 
// @description Allows you to hide questions on Stack Overflow when you can't answer them. 
// @include  http://stackoverflow.com/* 
// @require  http://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js 
// ==/UserScript== 

var idListString = GM_getValue('idList', ''); 
var idList = idListString.split(','); 
GM_setValue('idList', idList.join(',')); 

function getId (idString) 
{ 
    return idString.split('-')[2]; 
} 

function removeQuestion (e) 
{ 
    var id = getId(e.data.questionSummaryDiv.id); 

    $(e.data.questionSummaryDiv).hide(250); 

    idList.push(id); 

    setTimeout(function() { 
     GM_setValue('idList', idList.join(',')); 
    }, 0); 

    return false; 
} 

$('div.question-summary').each(function (index, questionSummaryDiv) 
{ 
    var id = getId(questionSummaryDiv.id); 

    if (idList.indexOf(id) != -1) 
    { 
     $(questionSummaryDiv).hide(); 

     return; 
    } 

    var link = $('<a><em>(Too Stupid)</em></a>'); 

    link.attr('href', '#' + questionSummaryDiv.id); 

    link.click({questionSummaryDiv: questionSummaryDiv}, removeQuestion); 

    $('div.started', questionSummaryDiv).append(link); 
}); 
+0

這不會給出任何錯誤,但腳本似乎也不起作用。我沒有隱藏問題,也沒有在問題旁邊註明「太愚蠢」鏈接。 –

+1

我剛測試過它,並在問題列表頁面上添加鏈接,並隱藏了單擊「太愚蠢」鏈接時的問題。你是否編輯腳本? jQuery的一次性副本並不總是這樣工作。將代碼保存爲'SO_filter.user.js',然後卸載舊版本的GM腳本,然後使用Firefox打開該文件,以便GM提示全新安裝(並安裝)。這樣jQuery的本地副本將被正確設置。 –

+0

哦,你說得對。是的,我正在編輯它,並保存它。 刪除它並添加然後添加它作爲一個新的副本修復它。謝謝。 –

2

該腳本試圖包含jQuery的第一件事:

(function() 
{ 
    if (typeof unsafeWindow.jQuery == 'undefined') 
    { 
     var GM_Head = document.getElementsByTagName('head')[0] || document.documentElement, GM_JQ = document.createElement('script'); 

     GM_JQ.src = 'http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js'; 
     GM_JQ.type = 'text/javascript'; 
     GM_JQ.async = true; 

     GM_Head.insertBefore(GM_JQ, GM_Head.firstChild); 
    }   
    GM_wait(); 
})(); 

這個問題有jQuery是保證在堆棧溢出加載開始...如果它不存在你有更大的問題。整個jQuery替換不應該發生,因爲它既影響已經註冊的插件(然後nuking),也使用Stack Exchange目前所做的更新版本的jQuery,這意味着其他潛在的破壞性更改。

由於腳本需要沒有的最新功能,上面整個塊應該簡單地:

GM_wait(); 

對於其他問題,也有一些更多的$衝突...但你還是想這裏的加載順序是安全的。這裏有一個更便宜,還是安全的版本...好,工作原理:

var idListString = GM_getValue('idList', ''); 
var idList = idListString.split(','); 
GM_setValue('idList', idList.join(',')); 
GM_wait(); 

function GM_wait() { 
    if (typeof unsafeWindow.jQuery == 'undefined') { 
     window.setTimeout(GM_wait, 100); 
     return; 
    } 
    unsafeWindow.jQuery(function($) { 
     var link = $('<a href="#"><em>(Too Stupid)</em></a>').click(removeQuestion); 
     $('div.question-summary').each(function (index, questionSummaryDiv) { 
      var id = getId(questionSummaryDiv.id); 
      if (idList.indexOf(id) != -1) { 
       $(questionSummaryDiv).hide(); 
      } else { 
       $('div.started', questionSummaryDiv).append(link.clone(true)); 
      } 
     }); 
    }); 
} 
function getId (idString) { 
    return idString.split('-')[2]; 
} 
function removeQuestion() { 
    var q = unsafeWindow.jQuery(this).closest("div.question-summary").hide(250); 
    idList.push(getId(q.attr("id"))); 
    setTimeout(function() { 
     GM_setValue('idList', idList.join(',')); 
    }, 0); 
    return false; 
} 
+0

我試過了,不解決它。 –

+1

@Ron - 在更改後運行它時,在控制檯中會遇到什麼錯誤? –

+0

哦,我沒想過檢查JavaScript控制檯呢。謝謝。我將錯誤添加到主帖子中。我認爲這是因爲var $;是在其他地方宣佈的,還有其他的東西? –