65.9K
CodeProject 正在变化。 阅读更多。
Home

用户脚本 (JS) 和用户样式 (CSS)

starIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIconemptyStarIcon

1.63/5 (5投票s)

2016年5月4日

CPOL

6分钟阅读

viewsIcon

24120

在任何网站上运行/应用您自己的 JS/CSS

我曾在 2016 年 2 月的印度杂志《Open Source For You》上发表过这篇文章。我将文章的原始版本发布到 CodeProject,以触达更广泛的受众。

引言

JavaScript 和 CSS 不仅仅是服务器端技术。您可以编写自己的脚本和样式表,让您的 Web 浏览器将它们应用到任何网站上。在本文中,我们将快速浏览这种小众的 JavaScript 和 CSS 用法,并了解为什么它拥有数千名忠实粉丝,其中许多人甚至没有写过一行 JavaScript 或 CSS 代码,但他们发誓他们的浏览方式比其他人更胜一筹。

背景

您是否曾多次希望某些网站不要做出糟糕的颜色、对比度或字体大小选择?您是否曾希望其他网站不要对您的耐心提出无法忍受的要求,或者试图让您感到脆弱?嗯……用户样式和脚本可以提供帮助。它们可以使顽固的网站变得乖巧,使好的网站变得更好。最终,您将掌控一切。

用户脚本和用户样式

用户脚本和用户样式应由最终用户(我们,即使用浏览器的人)编写,以自定义我们(访问的)网站的功能或外观。

这与人们普遍认为 CSS 和 JavaScript 文件由网页设计师编写,并且只能是它们来源网站一部分的看法截然相反。

虽然看起来似乎需要 CSS 和 JavaScript 知识,但大多数粉丝只需访问 OpenUserJS.org 或 UserStyles.org 等网站即可获得他们想要的东西。就像书签小工具一样,几乎可以满足所有想象到的用途的上千个用户 JS 和用户 CSS 已经被发布。本文作者几乎编写了他所有的用户脚本/样式。如果您是一名 Web 开发人员,您可能也想这样做。

在 Firefox/Seamonkey/Iceape 浏览器中,您可以使用 Greasemonkey 插件来管理和执行用户脚本,使用 Stylish 插件来管理和应用用户样式。这两个插件都提供了一个文本编辑器来编写您的 JS/CSS。这些插件还可以让您将 CSS/JS 应用到特定站点(使用 URL 中的通配符)或所有站点。

The Greasemonkey and Stylish add-ons for Firefox makes it easy to manage and apply user scripts and styles.

Blink 之前的 Opera(12.x 及更早版本)浏览器一直内置了对用户脚本和样式的支持。它不得不这样做,因为它通常会被流行的网站排除在外,原因是一些不明智的 Web 程序员依赖浏览器检测(偏向 Internet Explorer),而不是功能检测。Opera 现在已经变成了一个 Chrome 克隆版,基于 Presto 引擎的 Opera 12.x 已经过时。

用户脚本和用户样式的用途最好通过示例来说明。

用户脚本示例

这是著名的 Gmail 登录页面。曾几何时,Web 邮件提供商默认不勾选“保持登录”选项。现在,默认勾选了(不仅是 Google,其他提供商也是如此)。每次登录时取消勾选此框都是一个容易忘记的额外步骤。

The "Stay signed-in" check box in many big websites are are selected by default. This means that these websites will continue to track you even when you click the log out link and when you are on any of their "partner" websites. A partner website is pretty much any any website these days - anything that has their ads or social networking plugins or webmaster tools/tracker JavaScript.

如何让它自动取消勾选?这个 Greasemonkey 脚本可以为您做到。

// ==UserScript==
// @name        Uncheck Google Signed-In Checkbox
// @description Automatically unchecks the "Stay signed-in" check box
// @include     https://#/*
// @version     1
// @grant       none
// ==/UserScript==

document.addEventListener("DOMContentLoaded",
                          uncheckGoogleStaySignedInButton,
                          false);

function uncheckGoogleStaySignedInButton() {
  try {
    document.getElementById("PersistentCookie").checked = false;
  } catch (err) {
    console.error("UGSIC Greasemonkey Error: " + err);
  }  
}

Greasemonkey 插件会在所有符合 `@include` 过滤器的页面上执行此脚本。该脚本会找到复选框并取消勾选它。(稍作修改,您就可以让同一个脚本在 Yahoo Mail 登录页面上也起作用。)

在编写脚本之前,您必须找到复选框的 HTML 元素 ID。任何有经验的 Web 开发人员都知道,这可以通过右键单击网页上的复选框并从上下文菜单中选择“**检查元素**”来完成。

This screenshot show the text editor of the Greasemonkey add-on with the code to uncheck the "Stay signed-in" check box.

您是否觉得 Yahoo Mail 预播页面要求您提供电话号码很烦人?那么,这个用户脚本将自动让您跳过该页面。

// ==UserScript==
// @name        Bypass Phone Number Prompt on Yahoo Mail
// @description Get past the page that asks for your phone number
// @include     https://edit.yahoo.com/progreg/*
// @exclude     %exclude%
// @version     1
// @grant       none
// ==/UserScript==

document.addEventListener("DOMContentLoaded", 
                          getPastPhoneNumberPage, 
                          false);

function getPastPhoneNumberPage() {
  try {
      //window.alert("Moving past the page");
      location.href = "https://mail.yahoo.com";
  } catch (err) {
    console.log("BPNPYM Greasemonkey Error: " + err);
  }  
}   

如果您曾经拒绝提供您的号码,那么该网站不应该尊重并记住您的决定吗?每次登录时都假装不知道,它试图强迫您提供您的号码。

用户样式示例

这是 DuckDuckGo 页面。我将此搜索引擎用作默认设置,因为它更能尊重用户。但是,我发现其网页的颜色和对比度并不符合我的喜好。因此,我为其编写了一个用户 CSS,并记得在样式后加上“!important”属性,以覆盖页面作者的设置。

These screenshots show the "before" and "after" appearances of a DuckDuckGo search engine results page. The actual stylesheet code is not so much important as the scope and possibility that these screenshots illustrate.

对于 Wikipedia 网站,我使用此 CSS,因为页面通常文字密集且占用屏幕的全部宽度。在大显示器上,这简直是一种折磨。

* { font-family: Century Schoolbook L!important; }
div#content { font-size: 1.2em; width: 7in;  }

The menu of the Stylish add-on will allow you to install not only your stylesheets but also those published by others on the userstyles.org website.

移动设备上的用户 JS/CSS

作为用户脚本和样式的爱好者,我将运行它们的功能添加到了我为 Android 创建的一个同名浏览器中。虽然用户样式可以按常规方式编写,但用户脚本必须以书签小工具 [1] 格式编写——前缀为“javascript:”。例如,为了编辑网页,我使用此脚本。

javascript:(function() { document.body.contentEditable=true;document.designMode='on'; }) ();  

此脚本甚至可以在桌面浏览器(如 Internet Explorer 或 Firefox)中运行,但可能不适用于 Chrome。请继续尝试。

Subhash Browser & Feed Reader, an app created by me, supports user scripts and styles. JS and CSS files prefixed with an underscore will be executed/applied automatically on all pages.

维护

当然,网页会发生变化,ID(或您试图修改的任何内容)也会随之改变。您的 Greasemonkey 脚本可能最终会停止工作。您必须自己修复它,或者从网上更新它,或者找到一个新的。

去年,我发布了一个Greasemonkey 脚本,该脚本可以遍历 Facebook 个人资料活动日志中的所有帖子,逐个删除——这样更有趣,而不是要求 Facebook 一次性全部删除。这是因为一个被一篇同样古老的文章 [2] 引用的旧 Greasemonkey 脚本已经过时。在另一个例子中,我编写的用于将 YouTube 视频下载为 MP4/FLV/WebM 格式的 Greasemonkey 脚本在发布一个月内就停止工作了。尽管我修复了它,但脚本可能很快就需要再次关注。

This screenshot shows two of my User JS in action. One has displayed a button to download a YouTube video. The video in turn shows a User JS in Opera 12.x browser deleting my Facebook posts!

关注点

尽管用户脚本和样式似乎有有限的保质期,但开源的美妙之处在于任何人都可以复兴 JS 或 CSS 并将其带回社区。

除了上述网站,greasyfork.org 也提供用户脚本。长期以来,Greasemonkey 开发者一直拥有 UserScripts.org 网站来分发用户脚本。在失效 [3] 之前,该网站受到了一些不理解用户脚本的控制狂站长的 DMCA 请求的困扰,遭受了垃圾邮件/DDoS 攻击,并且没有全职管理员。Userscripts.org 的许多原始开发者尚未迁移到新网站。因此,许多用户脚本散布在网上,包括 gist.github.com 等网站。我建议普通读者在安装任何脚本或样式之前,先浏览评论区或论坛。Greasemonkey 和 Stylish 扩展程序可以通过在 Firefox 附加组件管理器中搜索轻松安装。


参考文献

  1. 书签小工具构建器 - http://subsimple.com/bookmarklets/jsbuilder.htm
  2. Jennifer Golbeck:我决定删除我所有的 Facebook 活动 - http://www.slate.com/articles/technology/future_tense/2014/01/facebook_cleansing_how_to_delete_all_of_your_account_activity.html
  3. Hacker News:将接力棒传给 userscripts.org - https://news.ycombinator.com/item?id=1574840
© . All rights reserved.