直接从浏览器中执行 JavaScript 文件

23

听起来像是一个小问题,但我真的需要知道。

如果您将 HTML 文件的 URL 放入浏览器的地址栏中,它将呈现该 HTML。这就是浏览器的整个目的。

如果您给它一个 JPG、SWF 或甚至 PDF,它将为这些数据类型执行正确的操作。

但是,如果您提供了 JavaScript 文件的 URL,它将显示该文件的文本。我想要的是该文件直接被执行。

现在,我知道如果您使用 javascript: 协议,它会执行 URL 的文本,但这不是我需要的。

我可以让 URL 指向一个仅包含单个 <script> 标签的 HTML 文件,然后该标签再指向 JavaScript 文件,但由于我的某些神秘原因,我不能这样做。

如果位于 http://example.com/file.js 的文件完全包含:

 alert("it ran");

我把该URL放在地址栏中,希望"it ran"作为警示框弹出。

我对此持怀疑态度,但仍抱有一丝希望,期待能够设置某个头部信息或MIME类型来实现这一奇迹。


3
问题是:这个脚本将在哪种情境下执行?浏览器是否应该创建一个空的 HTML 页面? - Florian
很确定这是不可能的,因为Levu所描述的原因。 - George Mauer
@Smamatti - x-?它在2006年停止了实验性质(http://www.rfc-editor.org/rfc/rfc4329.txt)。但那样做行不通。 - Quentin
1
这并不是一个不合理的问题。开发人员可能想要在JS中创建一些内容,并且不想像在开发工具的控制台中输入时那样立即失去它。但是,下面Domenic的回答是有道理的。 - Andrew Koper
6个回答

15

这是不可能的。浏览器不知道JavaScript应该在什么上下文中运行; 例如,window 的属性是什么?如果您假定它可以提供一些随机的默认值,document 的行为如何?如果有人执行 document.body.innerHTML = "foo" ,会发生什么?

与图像或HTML页面不同,JavaScript取决于它运行的上下文。该上下文可以是HTML页面,也可以是Node服务器环境,甚至可以是Windows脚本宿主。但是,如果你只是导航到一个URL,浏览器不知道应该在哪个上下文中运行脚本。


作为解决方法,可以尝试使用about:blank作为主机页面。然后,通过在URL栏中粘贴以下代码,将脚本插入文档并给它适当的执行上下文:

javascript:(function () { var el = document.createElement("script"); el.src = "PUT_URL_HERE"; document.body.appendChild(el); })();

1
上下文的问题从未出现在我的脑海中。我想要的上下文与完全空白的HTML页面提供的上下文相同,但是显然我知道的和浏览器知道的之间存在巨大的差距。 - Michael Lorton
2
编程使你谦卑 @Malvolio :) - David

3

2

直接来说,是不能实现的,但你可以编写一个简单的服务器端脚本,比如PHP。不需要使用

http://example.com/file.js

请导航到:

http://localhost/execute_script.php?url=http://example.com/file.js

当然,你可以使用 Apache 中的 RewriteRule 来缩小这个范围,并/或者在你的 hosts 文件中添加另一个条目来重定向到 127.0.0.1。请注意,从安全角度来看,这并不是非常好的方法,但如果你自己使用并知道自己下载了什么,那应该就没问题了。
<html>
 <head>

  <script>
   <? echo file_get_contents($_GET['url']); ?>
  </script>

 </head>

 <body>

 </body>
</html>

0

2023年在Firefox浏览器上对我不起作用。 - cassepipe

0
使用Node.js。 下载并安装Node.js,创建一个http/s服务器,并在其中编写要在浏览器中显示的内容。使用localhost::端口号作为服务器上的URL来运行您的文件。请参考Node.js文档-https://nodejs.org/dist/latest-v7.x/docs/api/http.html 运行-http://localhost:3000 以下是示例代码:
  var http = require("http");
  var server = http.createServer(function(req,res){
  res.writeHead(200,{'Content-Type':'text/html'});
       res.end("hello user");
  }); server.listen(3000);`

-2

你可以使用Qt/WebKit编写自己的浏览器并实现这一功能。 当用户在URL位置输入JS文件时,您可以读取该文件并执行JavaScript代码。

http://code.google.com/apis/v8/get_started.html 是另一个渠道。 不确定它是否符合您的需求。


1
不用了,谢谢。我对脚本和服务器有控制权,但是浏览器没有。 - Michael Lorton

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接