开发者

How do I run a script right after the head is loaded, but before the DOM?

Making a Google Chrome extension and need to run a script after the head is loaded, because there are scripts in the head and I need them to run. And before the DOM is loaded, because there's an inlined script in there that I need to beat.

How would I d开发者_高级运维o this? How do I detect when head loads?


When you inject your content script, within the manifest you can state the "run_at" parameter to be "document_start", the files are injected after any files from css, but before any other DOM is constructed or any other script is run. More information can be found here.

{
  "name": "My extension",
  ...
  "content_scripts": [
    {
      "matches": ["http://www.google.com/*"],
      "css": ["mystyles.css"],
      "js": ["jquery.js", "myscript.js"],
      "run_at": "document_start"
    }
  ],
  ...
}

*Edited, added an example. One of the mutations event types could be used.

Example

manifest.json

{
  "name": "Content Script test",
  "version": "0.1",
  "description": "Content Script test",
  "content_scripts": [
    {
      "matches": ["http://*/*"],
      "js": ["cs.js"],
      "run_at": "document_start",
      "all_frames": true
    }
  ]
}

cs.js

document.addEventListener('DOMSubtreeModified', OnSubtreeModified, false);

function OnSubtreeModified(event) {
  console.log('Hello from extension!');
  document.removeEventListener('DOMSubtreeModified', OnSubtreeModified, false);
}

test.html (on the web somewhere)

<html>
<head>
  <script>
    alert('Hello from Web!');
  </script>
</head>
<body>
<h1>Hello World!</h1>
</body>
</html>

Results

You will two alerts, in the order:

  1. Hello from web!
  2. Hello from extension!


Just put it at the top of the <body> tag. Scripts execute where they are placed and will block the rest of the page, so a script at the top of the body will have awareness of everything in the head, but no awareness of the rest of the DOM, which is still loading. If you place it at the bottom of the <body> it will still be before DOMReady and before the page-load event, plus you should be able to access DOM elements that preceeded the script. One way this can be useful if you need to append scripts dynamically to the <head> -- you can't do that with a script that's inside the <head>, so you have to do it in the <body>.

[Edit] My answer can be applied generally to any HTML document, but Mohamed's answer applies more directly to Google extensions. I'd be inclined to take his answer ahead of mine, though both are probably correct.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜