-1

我不知道我在说什么,我走了。

在某些页面上,它会过滤它们,而其他页面(如 Youtube 评论)则不起作用。需要更改哪些代码才能在这些站点中工作?

// ==UserScript==
// @name        profanity_filter
// @namespace   localhost
// @description Profanity filter
// @include     *
// @version     1
// @grant       none
// ==/UserScript==

function recursiveFindTextNodes(ele) {
  var result = [];
  result = findTextNodes(ele,result);
  return result;
}

function findTextNodes(current,result) {
  for(var i = 0; i < current.childNodes.length; i++) {
    var child = current.childNodes[i];
    if(child.nodeType == 3) {
      result.push(child);
    }
    else {
      result = findTextNodes(child,result);
    }
  }
  return result;
}

var l = recursiveFindTextNodes(document.body);

for(var i = 0; i < l.length; i++) {
  var t = l[i].nodeValue;
  t = t.replace(/badword1|badword2|badword3/gi, "****");
  t = t.replace(/badword4/gi, "******");
  t = t.replace(/badword5|badword6|badword7/gi, "*****");
  t = t.replace(/badword8/gi, "******");
  l[i].nodeValue = t;
}

*将代码中的亵渎替换为badword

4

1 回答 1

0

Youtube 评论是异步加载的,页面加载后很长一段时间(默认情况下用户脚本在DOMContentLoaded事件中执行),因此您需要将代码包装为waitForKeyElements的回调函数,并带有评论容器的选择器或MutationObserveror setInterval

replaceNodes(); // process the page
waitForKeyElements('.comment-text-content', replaceNodes);

function replaceNodes() {
    ..............
    ..............
}

使用setInterval而不是 waitForKeyElements:

replaceNodes(); // process the page
var interval = setInterval(function() {
    if (document.querySelector('.comment-text-content')) {
        clearInterval(interval);
        replaceNodes();
    }
}, 100);

function replaceNodes() {
    ..............
    ..............
}

PS不要盲目的给节点赋值,先检查是否有变化,避免布局重新计算:

if (l[i].nodeValue != t) {
    l[i].nodeValue = t;
}
于 2015-10-20T06:28:54.073 回答