如何改进此脚本以删除左侧表格?

时间:2014-06-20 23:15:55

标签: javascript greasemonkey

此脚本基本上是为了从论坛中删除特定用户的内容。它按预期工作,但删除的内容中仍有一个剩余元素(表)。任何想法都受到高度赞赏。

代码: https://greasyfork.org/scripts/2690-fitmisc-total-ignore/code

// ==UserScript==
// @name Fitmisc_Total_Ignore
// @author Arris
// @description This script is designed to completly eradicate from sight the worst posters on Fitmisc.com
// @include http://fitmisc.com/*
// @namespace http://fitmisc.com/
// @version 0.9
// ==/UserScript==

function canIgnore(sUser) {
    if( sUser.match(/niko/i) )
        return true;
    if( sUser.match(/thesavagepony/i) )
        return true;
    if( sUser.match(/Lloyd Banks/i) )
        return true;
    if( sUser.match(/Lil B/i) )
        return true;
    if( sUser.match(/Round-Mound/i) )
        return true;
    return false; 
}

function setIgnoreThread() {
    var a; var s;

    a=document.evaluate(
    "//div[starts-with(@class, 'threadmeta')]",
    document,
    null,
    XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,
    null);
    for (var i=0; i<a.snapshotLength; i++) {
        s=a.snapshotItem(i).innerHTML;
        if( canIgnore(s) ) {
            //a.snapshotItem(i).parentNode.parentNode.parentNode.style.display = 'none';
            a.snapshotItem(i).parentNode.parentNode.parentNode.innerHTML = '';
        }
    }
}

function setIgnorePost() {
    var a; var s;

    a=document.evaluate(
    "//div[starts-with(@class, 'username_container')]",
    document,
    null,
    XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,
    null);
    for (var i=0; i<a.snapshotLength; i++) {
        s=a.snapshotItem(i).innerHTML;
        if( canIgnore(s) ) {
            //a.snapshotItem(i).parentNode.parentNode.parentNode.parentNode.parentNode.parentNode.style.display = 'none';
            a.snapshotItem(i).parentNode.parentNode.parentNode.innerHTML = '<li class="postbitlegacy postbitim postcontainer old" style="background:white;border-color:white;"></li>';
        }
    }
}

function setIgnoreQuote() {
    var a; var s;

    a=document.evaluate(
    "//div[starts-with(@class, 'bbcode_postedby')]",
    document,
    null,
    XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,
    null);
    for (var i=0; i<a.snapshotLength; i++) {
        s=a.snapshotItem(i).innerHTML;
        if( canIgnore(s) ) {
            //a.snapshotItem(i).parentNode.parentNode.parentNode.style.display = 'none';
            a.snapshotItem(i).parentNode.innerHTML = '';
        }
    }
}

if(window.opera) { //opera only
    (function(){
        document.addEventListener('DOMContentLoaded', function() {
            setIgnoreThread();
            setIgnorePost();
            setIgnoreQuote();
        }, false);
    })()
} else {
    setIgnoreThread();
    setIgnorePost();
    setIgnoreQuote();
}

1 个答案:

答案 0 :(得分:-1)

不是在专用的正则表达式中对每个用户名进行硬编码,而是考虑生成与被忽略的用户名数组中的任何项匹配的单个表达式。当您不需要存储结果时,请使用RegExp.test()方法。

(我在我的示例中删除了用户名,但匿名运营商帐户“OP”除外。我不喜欢公开诽谤。)

var
  ignoredUsers = ['user 1', 'another user', 'OP', 'yet another user']
;

function canIgnore(sUser)
{
  return new RegExp(ignoredUsers.join('|'), 'i').test(sUser);
}

但是,不需要提取用户名,针对正则表达式检查它们并进行进一步处理,因为您正在使用可以在DOM树中查找内容并退回的XPath表达式。他们能够使用容器类中的一个用户列表检索所有文本节点,并返回由类选择的祖先([grand]父级)。

// = =UserScript= =
// @name Fitmisc_Total_Ignore
// @author Arris
// @description This script is designed to completly eradicate from sight the worst posters on Fitmisc.com
// @include http://fitmisc.com/*
// @namespace http://fitmisc.com/
// @grant          GM_xpath
// @version 0.9
// = =/UserScript= =

var
  // TODO: GM_ get/set Value as JSON ; put users into igno list by mouse click
  ignoredUsers = ['user 1', 'another user', 'OP', 'yet another user']
;

function removeContents(ignoreList)
{
  if(ignoreList instanceof Array && ignoreList.length)
    GM_xpath
    ( { path: "//div[@class='username_container']//*[text() = '"
            + ignoreList.map(function(user) { return user.replace("'", "\\'"); } ).join("' or text() = '")
            + "']/ancestor::li[contains(@class, 'postcontainer')]",
        all :true 
      }
    ).forEach(function(elem){ elem.parentElement.removeChild(elem); });
}

removeContents(ignoredUsers);

由于可以重命名用户帐户,因此请考虑过滤用户ID,例如在个人资料链接或照片的href属性中,而不是依赖于可变名称。

上面的示例在线程帖子上完成了工作。您可以通过“|”将多个XPath表达式合并为一个炭。