Skip to content

Latest commit

 

History

History
110 lines (95 loc) · 4.5 KB

2016-10-24-刷知乎的正确姿势,自动加载!.md

File metadata and controls

110 lines (95 loc) · 4.5 KB
title date tags
刷知乎的正确姿势,自动翻页!
2016-10-24 10:58:52 -0700
ggf
脚本
知乎

本来打算写一下网络工具在开发中应用的文章,不过呢,咱公司网络工具用的不是很多,只是在用charles, gas mask 和 mamp没有用,好像是也没有用的必要。而且真要写,篇幅也是挺大的。

所以呢,咱就写篇接地气的,解决一个痛点。刷知乎居然要用鼠标,不能忍。

大家在刷知乎的过程中,可能会点赞,收藏,关注,这些行为都会在 最新动态 中展示。如果想要回味一下自己感兴趣的东西,刷一遍 最新动态 那是极好的。

可是知乎的 最新动态 是有长度限制的,每看几条,就得点一下 更多 按钮,简直不能忍。如下图:

更多按键

点一下,点一下,完全没有刷的快感。 所以呢,我决定用个脚本来让它自动加载。 准备工具: firefox GreaseMonkey(油猴子)插件

chrome 也可以,名字叫Tampermonkey。其它浏览器就未知了。以下仅以火狐为例

装好GreaseMonkey之后,新建脚本

新建脚本

起一个名字,自己能看懂就好。 脚本应用到 把最后一个单词换成 *, 意味着匹配所有的用户的 最新动态 页。 知乎的搜索用的也是一样的加载模式,所以可以再加上一条 https://www.zhihu.com/search* 然后就可以写代码了,闲话不多说,接下来就到了上代码的时候了。 配置一下

// ==UserScript==
// @name        scroll for zhihu
// @namespace   594030667
// @include     https://www.zhihu.com/people/*
// @include     https://www.zhihu.com/search*
// @version     1
// @grant       none
// ==/UserScript==
// 注册一个滚动事件监听,绑定Loadmore方法
window.addEventListener('scroll', loadmore, false)
// requestFlag 是为了防止重复请求的,因为滚动是个触发频率很高的事件,滚一下触发个几十次,显然不是很合适
// 使用requestFlag 目的就是尽量一次滚动只触发一次加载
var requestFlag = true
function loadmore() {
  // scrollMaxY - scrollY = 滚动条距底部的距离
  // warn 不保证兼容性
  // scrollMaxY 很神奇啊,dash上查不到兼容性, can i use 上完全查不到......
  // 不过因为看起来和scrollY 很和谐,所以我要用它
  var pixToBottom = window.scrollMaxY - window.scrollY
  // 找到知乎的 更多 按钮
  var zhMore = document.querySelector('.zu-button-more')
  // 什么时候触发 自动加载
  // 这里取得是 屏幕调试一半 与 600 之中的最小值
  // 比如屏幕调试是 1080 ,那么就是 540
  var triggerPix = Math.min(window.screen.availHeight / 2, 600)
  console.log('pixToBottom', pixToBottom)
  console.log('MaxY', window.scrollMaxY)
  console.log('scrollY', window.scrollY)
  // 滚动条距底部的距离符合判定时
  if (0 < pixToBottom && pixToBottom < triggerPix) {
    // requestFlag 派上用场了
    if (requestFlag) {
      // 模拟点击知乎 更多 按钮
      zhMore.click()
      //  requestFlag 初始为true, 加载一次后,变成false
      requestFlag = false
      console.log('request success')
    }
  }
  // requestFlag 终究要变回 true的, 要不然就不能进入模拟点击的判定了
  // requestFlag 变成 true 的条件可以根据自己的体验来写
  // 写得宽泛的话,重复触发的概率大一点,比如说,一下子加载了10页
  // 写得比较严苛,重复触发的概率小一点,也有可能不触

  if (pixToBottom > triggerPix && pixToBottom < triggerPix + 500) {
    requestFlag = true
  }
  console.log('pixToBottom', pixToBottom)
  console.log('requestFlag', requestFlag)
}

代码比较少,可能有3分之2都是注释和console.log,让诸位见笑了。 再献上一个网页淘宝登录时,不用手动从二维码切换密码输入的脚本。(有了1password,我还怕输密码?)

// ==UserScript==
// @name        taobao-no-qr
// @namespace   594030667
// @include     https://login.taobao.com/member/login.jhtml*
// @version     1
// @grant       none
// ==/UserScript==
document.addEventListener('DOMContentLoaded', function (event) {
  console.log('DOM fully loaded and parsed');
  var loginForm = document.getElementById('J_StaticForm');
  loginForm.setAttribute('style', 'display:block !important')
  console.log(loginForm.style.display)
});

效果如图 淘宝不想扫二维码