Chrome扩展程序,如何延迟脚本直到页面完全加载

时间:2017-12-26 01:03:29

标签: javascript html google-chrome dom google-chrome-extension

我正在尝试在选项卡中打开新网站地址后按类名获取DOM元素。问题是我不知道如何让它等到页面完全加载。我尝试了闹钟,setTimeOut,setTimeDelay,但没有任何作用。

chrome.runtime.onMessage.addListener(message);

function message(msg) {
  chrome.tabs.update({url: 'https://www.website.com/'});
  chrome.tabs.executeScript({code:"var theBtn = document.getElementsByClassName('btn1');theBtn[0].click();"});
}

我在弹出窗口中使用chrome.runtime.sendMessage,因为我想从输入中发送网址,然后按下按钮,触发上面的代码。我简化了这个因为其他一切都有效。 (msg)只是一个网站地址

2 个答案:

答案 0 :(得分:2)

<强>更新

这不起作用,因为executeScript没有要执行的标签,因为你刚刚杀死(更新)了。您必须将其拆分为背景和内容脚本:

  1. 后台运行chrome.tabs.update
  2. 后台向内容发送确切的目标网址
  3. 内容会侦听每个网址,但会忽略所有内容,除非它只是从背景
  4. 获取了这个确切的网址
  5. 如果是这样,Content会运行脚本,(或告诉后台运行executeScript,但这看起来很愚蠢),忘记了网址,然后又回到空闲状态
  6. 也许2-3中的通信必须采用另一种方式:如果应该对此URL进行操作,则内​​容会询问每个页面加载的背景。

    非常有趣的用例! I made a Proof of concept because it's X-mas!

    <强>原始

    未测试!两个选项:

    2。在脚本中添加load侦听器包装器:

    chrome.tabs.executeScript({
      code:"window.addEventListener('load', function() { var theBtn = document.getElementsByClassName('btn1');theBtn[0].click(); });"
    });
    

    这是你的代码,包含在window.addEventListener('load', function() { ... });中。添加事件侦听器会立即执行,但仅在页面加载时才会执行代码。

    1。使用executeScript的{​​{1}}选项。我想你想runAtSee docs

    实际上看起来默认(document_end)更适合:“浏览器选择”document_end“和window.onload之后的时间”(from here

答案 1 :(得分:0)

有三种方法可以做到这一点 1.在Manifest.json中使用run_at =“document_end”(理想的开发人员应该尽可能使用这个) 2.使用java-script或jquery使用document是ready事件 3.使用executeScript