【问题标题】:Changing a remote website's JavaScript locally with a FireFox Extension?使用 FireFox 扩展在本地更改远程网站的 JavaScript?
【发布时间】:2016-06-28 08:43:53
【问题描述】:

我正在尝试编写一个浏览器扩展来添加一些功能并重新格式化第三方网站上的一些数据。

我安装了 Firefox 开发者版。然后,我基于Beastify 创建了一个简单的附加扩展。

我编写了一个简单的脚本来监控 span 元素的 innerHTML 何时发生变化,然后进行一些处理。

这段代码有效,但不是我想做的事情:

function fixformat(){
    var value = document.getElementById("value");

    var valueFloat = parseFloat(value.innerHTML);

    if (valueFloat < 1000) valueFloat += 1000;

    value.innerHTML = valueFloat;
}
setInterval(fixformat, 100);

在远程服务器上,它使用以下代码实时更新值:

totValue += _currentValue;
value = document.getElementById("value");
value.innerHTML = totValue;

但我想替换这一行:

value.innerHTML = totValue;

有了这个:

value.innerHTML = totValue + 1000;

这段代码隐藏在一个巨大的远程 javascript 文件中,这是我浏览他们的网站时加载的大约两打 javascript 之一。这个 javascript 文件有大约 4000 行代码。当有新信息可用时,它每 1-15 秒执行一次。

有没有办法以编程方式挂钩到那个远程 javascript 文件?对那行代码做一些简单的搜索和替换,这会让其他一切正常执行吗?

【问题讨论】:

  • 也许您可以创建脚本的副本并进行所需的修改。然后当页面加载时,删除原始脚本标签并添加修改后的脚本。
  • 嗯,这可能会奏效,但每当第三方站点更新某些内容时,这似乎是一场维护噩梦。我打算写很多小的 UI hack,在这里和那里搜索和替换一行代码比保留数千行代码的本地副本要好得多。
  • 感谢您的建议,我正在调查this

标签: javascript firefox-addon


【解决方案1】:

您将使用beforescriptexecute 事件侦听器并更改脚本的.textContent

https://developer.mozilla.org/en-US/docs/Web/Events/beforescriptexecute

这是一个例子:

document.addEventListener("beforescriptexecute", function(e) {
        src = e.target.src;
        content = e.target.text;

        if (src.search("i18n.js") > -1) {
            // Stop original script
            e.preventDefault();
            e.stopPropagation();
            window.jQuery(e.target).remove();

            var script = document.createElement('script');

            script.textContent = 'script you want';

            (document.head || document.documentElement).appendChild(script);
            script.onload = function() {
                this.parentNode.removeChild(this);
            }
        }
    }
}

【讨论】:

  • 嗯,这不适用于 WebExtension,但我将尝试 xpi 样式的扩展。似乎 adblock plus 能够从执行中删除 javascript,所以我只需要一种替换它们的方法。去学习ABP源码。
  • 感谢您的帮助,您的想法奏效了,我只是不知道如何在浏览器扩展中做到这一点,但我找到了一种使用 GreaseMonkey 的方法 :)
【解决方案2】:

好的,我现在放弃了浏览器扩展的想法,因为我可以使用Greasemonkey 脚本做我想做的事。这是我编写的脚本,用于在远程 JavaScript 中创建一个“挂钩”以替换一行代码:

// ==UserScript==
// @name        test load
// @namespace   testing
// @description testing
// @include     https://addons.mozilla.org/en-US/firefox/addon/greasemonkey/
// @version     1
// @grant       none
// @run-at document-start
// ==/UserScript==
document.addEventListener("beforescriptexecute", function(e) {
    src = e.target.src;
    content = e.target.text;
    console.log("src: " + src);
    if (src.search("script.js") > -1) {
        var newContent = "";
        $.ajax({
            async: false,
            type: 'GET',
            url: '/script.js',
            success: function(data) { //inject code via search and replace
                newContent=data.replace('totValue += value;', 'totValue += value + 1000;');
            }
        });
        // Stop original script
        e.preventDefault();
        e.stopPropagation();
        window.jQuery(e.target).remove();
        var script = document.createElement('script');
        script.textContent = newContent;
        (document.head || document.documentElement).appendChild(script);
        script.onload = function() {
            this.parentNode.removeChild(this);
        }
    }
});

【讨论】:

  • 非常感谢分享。您应该尝试使用 WebExtension。您应该将内容脚本设置为在页面开始时加载,然后在那里执行。它应该可以工作。
  • 我试过了,但无法弄清楚。我决定虽然我要朝着不同的方向前进,但现在我发现了CefSharp。一旦我弄清楚了,就会在那里发布我的解决方案。
  • 谢谢。我已删除我的评论,因为它不再相关。一些额外的事情:A)只有正在制作 cmets 的帖子的作者才会收到您的评论,除非您在评论中包含他们的姓名,例如:@Makyen。 B)鉴于这是您用作问题答案的解决方案,您应该接受此答案。 C)我删除了代码中的空白行,使其无需滚动代码即可显示。在可能的情况下,如果可以一次显示所有代码而不需要垂直或水平滚动,代码会更容易理解。
  • 好的@Makyen 感谢您让我知道。它说我必须再等几个小时才能将解决方案标记为已接受。
  • 您使用过 .search ,这使得 .通配符
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多