Greasemonkey脚本隐藏stackoverflow帖子

Greasemonkey script to hide stackoverflow posts?

本文关键字:帖子 stackoverflow 隐藏 脚本 Greasemonkey      更新时间:2023-09-26

我发现自己一遍又一遍地读同样的问题,所以我想要一种隐藏问题的方法。

我有一个脚本做什么是应该做的,但它削弱了现有的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);
});

如果没有必要,永远不要注入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);
});

该脚本试图首先包含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;
}