JavaScript 学着写了一个在本站模拟 block 用户的 userscript 脚本,但是用起来有点问题。

blacktulip · 2015年03月08日 · 最后由 flowerwrong 回复于 2015年03月08日 · 2629 次阅读
// ==UserScript==
// @name         My Fancy New Userscript
// @namespace    http://your.homepage/
// @version      0.1
// @description  enter something useful
// @author       You
// @match        https://ruby-china.org/*
// @grant        none
// @require      http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js
// ==/UserScript==

$(document).ready(function() {
    $(".info").each(function() {
        if ($(this).find("a[data-name]").eq(0).attr("data-name") === "某个用户名") {
            $(this).parents(".topic").hide();
            $(this).parents(".reply").hide();
        }
    });
});

肯定是可用的,问题是时灵时不灵,当不灵的时候,cmd+r 硬刷一下就灵了。但是作为 block 用户的脚本老是要这样搞就没什么点了。

想来想去,我也只能觉得有可能是 turbolinks 的影响?请问有谁确定知道是什么原因么?

需要监听 page:load 事件

正好借此机会学习下 js,我看的学习资料有提到 js 中的 this 是在 runtime 时候判断的,this 在 call side,谁调用函数谁就是 this,那这个脚本中的 this 是指的是 window 对象吗?

我想和 LZ 心灵感应一下,看看是不是同一个人~

写成函数,然后在页面的 js 里面调用呢 我在 rails 用 foundation 的 js 组件也是必须硬刷才行,看了 Rei 的 turbolinks 的介绍才知道估计是 turbolinks 的问题,后来就在页面的 js 代码里面调用$(document).foundation() 也就解决了

#1 楼 @flowerwrong 正解!

$(document).on('ready page:load', function(){
// blablabla...
})

page:change 事件就可以了,另外有两个地方可以改进:

  1. 用正则,速度快一点,而且支持多用户过滤
  2. 用 id 检查当前是哪个页面
$(document).on('page:change', function() {
  var isReply = $('#replies').length;
  $(".info").each(function() {
    if (/用户名/.test(this.innerHTML)) {
      $(this).parents(isReply ? ".reply" : ".topic").hide();
    }
  });
});

#6 楼 @saiga 循环里面再加一个break,如果只过滤一个。😄

#2 楼 @ted 这个 jQuery 中的 this 指的是上一级选出来的 dom 对象。这里是 $(".info") 对应的 dom nodes

#9 楼 @blacktulip 不然咱们学着 V2EX,给 Ruby China 加个拉黑名单功能……不过其实 userscript 就能很好解决问题啦,不要费那么多事

基于 chrome 的浏览器 [非 chrome] 不知道是否支持 userscript,呵呵

@flowerwrong @saiga @lyfi2003 请问这个 page:load , page:change 事件是 turbolinks 特有的对吧?

需要 登录 后方可回复, 如果你还没有账号请 注册新账号