【问题标题】:Executing a block of code before browser sends any request to the server to manipulate the URI在浏览器向服务器发送任何请求以操作 URI 之前执行代码块
【发布时间】:2014-12-24 08:37:00
【问题描述】:

也许我问的太多了,但问比假设它不存在要好得多。

为了将网页转换器创建为单个文件(包括 html 的所有外部资源),我计划使用数据 URI 方案。但是这种转换的问题是很多页面都包含 Javascript 代码来提供资源的 URI。一世。 e.页面用JS设置图片的src是完全正常的。

在最坏的情况下,URI 是组合的,在这种情况下,绝对不可能用 Data URI Scheme 替换 URI,例如。 G。 img.src = 'domain.com/' + some_variable + '.png';.

我能想到的克服这种情况和所有其他情况的唯一方法是在 URI 更改之后和下载之前引入一个中间代码块。如果没有这样的机会,我可以处理请求的 URI 并将其替换为适当的数据 URI 方案。它还受益于全局数据 URI 方案存储,从而导致更小的 html 文件大小。

有谁知道这样的机会是否存在?或者如果有人可以创建它?

[编辑]

我希望我的单文件网页如下所示:

<script>
var uri_dictionary = {
    'http://www.domain.com/1.png': 'data:image/png;base64,iVBORw0KGgoAAAAN...',
    'http://www.domain.com/2.png': 'data:image/png;base64,iVBORw0KGgoAAAAN...'
};

function translateURI(url) {
    if (uri_dictionary[url]) {
        return uri_dictionary[url];
    }
    else {
        return url;
    }
}
</script>

以上是我计划注入到我将要生成的单文件网页中的代码的简化版本。只是translateURI函数需要在发出之前拦截所有的外发请求。并在可行的情况下替换他们请求的 URI。

【问题讨论】:

  • 您想在自己的网站还是其他网站上这样做?
  • 我自己,为我编码的网站。但我不明白这有什么关系?
  • 你能用 PhantomJS 吗?它可以运行整个 javascript,您以后可以使用完整的 url 来下载图像。如果你有兴趣,我可以提供一个例子。
  • 其实我确实打算使用 PhantomJs。但我认为这不会解决任何问题。演示该问题的最简单情况是图像在被单击后在两个源之间切换。并且新源的 URI 将由 JS 代码组成。您打算如何从 PhantomJs 解决如此复杂的问题中受益?

标签: javascript html events


【解决方案1】:

我认为这个问题没有通用的解决方案。您可以(理论上)分析代码路径并尝试所有可能的情况,但这会“有点”矫枉过正,可能会导致网站将数百万张图像加载到 HTML 中。您也可以尝试手动指定要加载的图像,因为它是您自己的网站。

你拦截图片加载事件的方法也是不可能的(根据https://stackoverflow.com/a/6974878/2224188

您不能只是“取消”图像的加载过程(将 src 属性设置为空字符串不是一个好主意)。事实上,即使你可以这样做,这样做只会让事情变得更糟,因为你的服务器会不断发送会被取消的数据,从而增加它的负载因子并减慢它的速度。

我也不太喜欢将图像嵌入 HTML 的想法,因为它绕过了所有缓存机制,并给您的服务器增加了更多负载。

编辑 我一起破解了一些代码,$("img").removeAttr 部分似乎工作正常(它足够快地中止加载,至少在 Chrome 上),其余部分未经测试。

<script type="text/javascript" charset="utf-8">
$(document).ready(function() {
  var links = $("img").map(function() {
    return $(this).attr("src");
  });
  $("img").removeAttr("src");
  $("img").each(function (image,index) {
    $(image).attr("src",translateURI(links[index]));
  }
} );
</script>

试着把它放在页面的头部

【讨论】:

  • 关于防止缓存和嵌入式资源的所有缺点,您是绝对正确的。但我正在研究一个不仅可行(由于资源少)而且是唯一方法的方案。换句话说,我不可能将一个网页保存在多个文件中。
  • 那么我的第一个方法是将数据插入到 Javascript 而不是链接中。如果这也不可能,请查看画布标签。
  • 坦率地说,如果我能做到我所要求的,我会感到惊讶。但是你提到的帖子不是我的问题的否决权。我不是要中止发送的请求。我试图在它发送之前转移它。这意味着我试图阻止发送任何请求,而是从以前下载的数据 URI 方案字符串中加载它们。
  • 尽管你的破解解决了src的初始值问题,但如果src稍后被代码更新,它也没有任何好处。
  • 注册一个 DOM 修改处理程序 (stackoverflow.com/a/13835369/2224188) 并对我上面所做的每个更改执行相同的操作。
猜你喜欢
  • 2013-08-13
  • 2019-03-30
  • 2021-03-30
  • 1970-01-01
  • 2021-07-15
  • 2018-09-17
  • 2012-02-01
  • 2022-01-12
  • 1970-01-01
相关资源
最近更新 更多