【问题标题】:Chrome Extension: Run Content Script before any Embedded Scripts run on PageChrome 扩展:在页面上运行任何嵌入式脚本之前运行内容脚本
【发布时间】:2018-07-25 11:34:45
【问题描述】:

我正在尝试通过更改嵌入到视频的 html 观看页面中的 player_api 脚本中的一些变量来更改 YouTube 播放器的某些行为。

问题是,无论我尝试什么,播放器的嵌入式脚本总是在我的扩展添加修改之前运行。从而保持玩家的行为相同。

我尝试将清单中的 run_at 属性设置为 document-start,但脚本根本没有运行

我可以做些什么来停止该脚本的执行,直到我对其进行更改?

PS:我尝试通过拦截 html 调用并使用 Charles Proxy 编辑正文来更改脚本,然后播放器的行为按照我的意愿进行了更改。所以它知道如果在正确的时间完成它应该可以工作。

.

ma​​nifest.json

{
    "manifest_version": 2,
    "name": "YouFit For YouTube",
    "version": "1",
    "content_scripts": [{
        "js": ["content.js"],
        "matches": ["https://*.youtube.com/watch?*",
        "https://*.youtube.com/watch?*"],
    }],
    "browser_action": {
        "default_icon": "icon.png"
    }
}

content.js

function changeBehavior() {
    var scriptElements = document.getElementsByTagName('script');
    for (var i = 14; i < scriptElements.length; i++) {
        var curScriptBody = scriptElements[i].outerHTML;
        // Find the script i'm interested in
        if (curScriptBody.indexOf("var ytplayer") != -1) {
            scriptElements[i].outerHTML = scriptElements[i].outerHTML.replace("<text>", "<replacement text>");
            alert("Replaced");
            break;
        }
    }
}
changeBehavior();

【问题讨论】:

  • 替换脚本元素的 html 没有任何作用,因为它发生在脚本执行之后,并且在 Chrome 中没有办法事先做到这一点。它不会像这样工作。您必须在加载之前取消脚本 URL,自己下载其内容,更改它,作为新的脚本元素插入。在某个地方应该有一个这样做的例子,继续寻找。
  • 脚本不是从 url 加载的。它的内容被注入到脚本标签中。这有什么不同吗?
  • 然后您需要覆盖整个页面:1) window.stop() 2) 获取原始 html vix XHR/fetch 3) 进行文本替换 4) 通过document.write()覆盖页面/跨度>
  • 我花了很多时间尝试遵循您的建议。但我不能,我还是 chrome 扩展和内容脚本的新手。我将在 8 小时内提供 50 - 100 点的赏金,以期获得更具指导性的答案。谢谢你的建议:)
  • 类似this script

标签: javascript google-chrome google-chrome-extension content-script browser-extension


【解决方案1】:

你尝试过这样的事情吗?

content.js

var script = document.createElement('script');
script.textContent = "/* What you have in content.js right now */";
(document.head||document.documentElement).prepend(script);

【讨论】:

  • document_start 运行它,似乎我目前还无法访问其他脚本元素。在 document_idle 运行它并不能足够早地完成替换。
  • 这样一个被低估的答案。使用 "run_at":"document_start",此解决方案在任何脚本执行之前和任何 DOM 元素加载之前在页面上下文中运行代码。正是我需要的。
  • 我一直在寻找这个!很好的答案谢谢!
猜你喜欢
  • 1970-01-01
  • 2016-09-09
  • 2015-12-24
  • 2012-06-20
  • 1970-01-01
  • 1970-01-01
  • 2023-03-19
  • 1970-01-01
  • 2011-06-24
相关资源
最近更新 更多