ここから本文です

回答リクエスト失礼します。

f10********さん

2018/7/2902:03:25

回答リクエスト失礼します。

特定の質問者や回答者及びID非公開さんによる、質問や回答を自分の環境において非表示にするGreasemonkeyのユーザースクリプトを書いてみたのですが、リンク先の質問も読み込む仕様にしているためか、非表示にするのに時間が掛かってしまいます。何か時間を短縮する良い方法は無いでしょうか?
また、私の書いたスクリプトはまだごちゃごちゃしていると思うので、よろしければ添削していただけないでしょうか?できればもう少し短く簡潔なスクリプトにしたいです。何かアドバイスをください。

※知恵袋の仕様上連続するスペースはアンダースコアに置き換えています。以下スクリプトです。



// ==UserScript==
// @name____ QABlocker
// @version_ 1
// @grant___ none
// @include_ https://*chiebukuro.yahoo.co.jp/*
// @require_ https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js
// ==/UserScript==

$(function() {
_ var ngUser = new RegExp("xxx1|xxx2|xxx3");
_ var ngWord = new RegExp("ID非公開|カテゴリ");

_ removeAnon();_ // ID非公開さんを非表示にする。
_ removeUser();_ // 特定の利用者を非表示にする。
_ removeLink();_ // リンク先の内容によってリンクを非表示にする。

_ function remove(x0, x1, x2, x3) {
___ var flag = 0;
___ var e1 = $(x0).find(x1);
___ for (var i = 0; i < e1.length; i++) {
_____ var e2 = $(e1[i]).find(x2);
_____ for (var j = 0; j < e2.length; j++) {
_______ var e3 = $(e2[j]).attr(x3);
_______ var e4 = $(e2[j]).text();
_______ if (ngUser.test(e3) || ngWord.test(e4)) {
_________ e1[i].remove();
_________ flag = 1;
_______ }
_____ }
___ }
___ return flag;
_ }

_ function removeAnon() {
___ remove("html", "li", "dd", "");_ // 質問一覧
___ if (remove("html", ".mdPstdQstn", "p", "")) {_ // 質問
_____ $(".mdQstnrCmmnt").remove();_ // コメント
___ }
___ remove("html", ".othrAns", "p", "");_ // 回答
___ remove("html", ".mdCmnt", "p", "");_ // 返信
___ $(".cmntMore input[name='']").parents(".cmntMore").remove();_ // 返信詳細
_ }

_ function removeUser() {
___ remove("html", "li", "a", "href");_ // 質問一覧
___ remove("html", ".mdPstdQstn, .mdQstnrCmmnt", "a", "href");_ // ngUserの質問
___ remove("html", ".mdPstdQstn, .mdQstnrCmmnt", ".ptsQes p", "");_ // ngWordを含む質問
___ remove("html", ".othrAns", "a", "href");_ // ngUserの回答
___ remove("html", ".othrAns", ".ptsQes p", "");_ // ngWordを含む回答
___ remove("html", ".mdCmnt", "input", "name");_ // 返信
_ }

_ function removeLink() {
___ var que = $("a[href*='qa/question_detail'], a[href*='o/chiebukuro']");
___ for (var i = 0; i < que.length; i++) {
_____ $.ajax({
_______ url: $(que[i]).attr("href"),
_______ type: "get",
_______ dataType: "html",
_______ async: false
_____ })
_____ .done(function(data) {
_______ var x1, x2, x3, x4, x5, y1, y2;
_______ x1 = x2 = x3 = x4 = x5 = y1 = y2 = 0;

_______ x1 = remove(data, ".mdPstdQstn", "a", "href");_ // 質問者の判定
_______ x2 = remove(data, ".othrAns", "a", "href");_ // 回答者の判定
_______ x3 = remove(data, ".mdPstdQstn, .mdQstnrCmmnt", ".ptsQes p", "");_ // 質問内容の判定
_______ x4 = remove(data, ".othrAns", ".ptsQes p", "");_ // 回答内容の判定
_______ x5 = remove(data, ".topicPass", "a", "");_ // カテゴリの判定
_______ y1 = remove(data, ".mdPstdQstn", "p", "");_ // 質問者の判定(ID非公開)
_______ y2 = remove(data, ".othrAns", "p", "");_ // 回答者の判定(ID非公開)
_______ if (x1 || x2 || x3 || x4 || x5 || y1 || y2) {
_________ $(que[i]).parents("li").remove();
_______ }
_____ })
_____ .fail(function() {
_______ console.log("failed.");
_____ });
___ }
_ }
});

補足より正確な表現をすると自分自身の環境から見えなくするスクリプトです。特に他意はなく方法自体に興味があります。firefoxのアドオンには期待するものがなかったので、自分でスクリプトを書いてみた次第です。

この質問は、bac********さんに回答をリクエストしました。

閲覧数:
81
回答数:
2
お礼:
500枚

違反報告

ベストアンサーに選ばれた回答

プロフィール画像

カテゴリマスター

bac********さん

リクエストマッチ

2018/7/2903:06:58

ぱっと見なんですが、まず removeLink() が遅いかどうかで問題点を切り分けてみてください。
ご存知の通り、こちらは ajaxでリンク先を読み込んでますので queに溜まる数に依存して処理に時間がかかると思います。

removeAnon()と removeUser() ですが、最初のステップとして jQueryの findで要素の総当りをやっていると思います。
しかも2重ループ+正規表現マッチングですのでここが冗長ではないでしょうか。
クラス名や親要素などを組み合わせてもっと要素を絞り込んでみてください。

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

質問した人からのコメント

2018/8/3 10:12:07

ありがとうございました。とても参考になりました。

ベストアンサー以外の回答

1〜1件/1件中

oti********さん

2018/7/2902:04:28

よく分からない

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる