Скрипт Greasemonkey, чтобы скрыть сообщения stackoverflow? - PullRequest
1 голос
/ 06 ноября 2011

Я снова и снова читал одни и те же вопросы, поэтому хотел найти способ скрыть вопросы.

У меня есть скрипт, который делает то, что должен делать, однако он наносит вред существующему javascript, например кнопке upvote и добавлению тегов при задании вопросов. Кто-нибудь знает, почему это происходит, или как это исправить?

Редактировать: о, в консоли ошибок я получаю:

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

Редактировать2:

Решение

(исправлено 17 июня 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 ]

2 голосов
/ 06 ноября 2011

Никогда не вводите JS, если в этом нет необходимости, и никогда не используйте jQuery для страницы в FF GM - это основной источник ошибок в этом случае.

Весь скрипт должен быть:

// ==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);
});
2 голосов
/ 06 ноября 2011

Этот скрипт пытается включить 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 не должно произойти, так как она влияет как на уже зарегистрированные плагины (затем на нюкинг), так и на использование более новой версии jQuery, которую в настоящее время делает Stack Exchange, что означает и другие потенциально разрушительные изменения.

Поскольку сценарию не требуется ни одна из последних функциональных возможностей, весь вышеуказанный фрагмент должен быть просто:

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;
}
...