运行javascript以外的其他方式:从url

Other way than running javascript: from url?

本文关键字:方式 url 其他 javascript 运行      更新时间:2023-09-26

有没有其他方法可以在不更改其URL的情况下将我自己的javascript注入另一个页面?例如,看看这个网站:http://somadesign.ca/projects/fontfriend/

它正在通过输入 url 地址长脚本来工作,像这样:JavaScript:{脚本代码}稍后将脚本注入任何网站。

有没有其他更自动、更简单的方法可以做到这一点?

你可以通过用户脚本(改变网站行为的小段JavaScript代码(来做到这一点。

用户脚本通常具有类似于以下内容的格式:

// ==UserScript==
// @name Example Script
// @description Whatever it does
// @match http://www.example.com/*
// @require http://code.jquery.com/jquery-latest.js
// ==/UserScript==
alert("hello");

这里重要的是以 @match 开头的行,它指定脚本应运行的时间。上面的例子会在您访问网址以 http://www.example.com/ 开头的页面时提醒"hello"。该@require允许您导入其他脚本,例如jQuery。

为了使生活更轻松,大多数人使用用户脚本管理器,例如Tampermonkey或Greasemonkey。这些允许您在浏览器中编辑、调试和一般脚本。他们还为您照顾波利尔板。

如果您有兴趣,我写了一个关于如何设置和开始使用Tampermonkey的简短教程。

您在问题中发布的链接实际上是书签的用例,正如我在之前的评论中简要解释的那样。

根据您的描述,我猜您误解了它的使用方式。如果我错了,请纠正我,你可以跳到最后一部分。

书签是一个锚点(<a>标签(,其href以伪协议javascript:开头。典型的书签可能如下所示:

<a href="javascript:alert(document.title)">Say my name!</a>

(请打开片段演示(当您单击链接时,它会提醒当前页面标题。但是,它不会像这样使用!您需要做的是,将其拖到浏览器的书签栏中,另存为书签!然后,在您正在访问的任何网页上,单击书签。该脚本将在该页面的上下文中执行,并告诉您其页面标题。这是使用书签的正确方法。

书签的长度有限,因为URL有限制(2,000+左右(。所以你不能在书签中写太多内容。好消息,您可以使用该书签插入<script>标签。例如,如果您单击jQuery,则此书签会将jQuery注入到您的访问页面:

<a href="javascript:(function(){var s = document.createElement('script');s.src = 'http://code.jquery.com/jquery-2.1.1.min.js';document.body.appendChild(s);})()">Inject jQuery</a>

因此,如果您的应用程序超出限制,您可以将其保存到 JS 文件中,并通过书签注入。

正如您告诉您的要求:针对老年人的服务,我认为这是一个实用的解决方案。他们只是保存一个书签,并在需要时单击。就是这样!

此外,这种技术具有非常好的跨浏览器兼容性(甚至到上个世纪(。还有一件事,IE6 的 URL 长度有限为 500+(不过对于脚本注入来说仍然足够了(。

最后但并非最不重要的一点是,正如我之前所提到的,由于潜在的 XSS,这也可能是危险的!所以请密切关注您的服务,不要让您的 JS 文件被黑客入侵!


编辑:我上次错过了一件事。不要在书签函数中返回除undefined以外的任何内容。

看看这个例子。在警报对话框之后,页面内容将被替换为返回值 'Oops' ,工作原理如下document.write('Oops')

<a href="javascript:(function(){alert('Oops');return 'Oops';})()">Oops</a>

所以一个更有保证的方法是使用 void 关键字,它强制函数调用返回 undefined

<a href="javascript:void function(){alert('Oops');return 'Oops';}()">Oops</a>


编辑:或者,更用户友好的方法是开发浏览器扩展:Chrome的CRX,Firefox的XPI等。如果扩展设计良好,则只需要用户安装。另一方面,它显然更昂贵。