我正在做一个Chrome扩展,它需要从网页中获得一些值。该页面有一个带有函数的脚本元素:
<script>D.setConst({"TIME":1444940082,"LANG":"En","ID":1463887,"DEV":false,"DEV_NAME":......当我输入浏览器控制台D.TIME时,我会得到时间值。在这个函数中,有很多变量,我很少需要它们来扩展。
我已经完成的步骤: 1.清单文件具有所有权限,声明为内容脚本。2.有一个带有按钮的popup.html窗口,它可以执行我的内容脚本中的代码:
function click(e) {
  chrome.tabs.executeScript(null,
      {code:'var btn = document.createElement("SCRIPT"); btn.innerHTML = "console.log(D.nonce.name);"; document.body.appendChild(btn);'},function(results){ console.log(results); } );
  //window.close();
}
document.addEventListener('DOMContentLoaded', function () {
  var divs = document.getElementById('message');
    divs.addEventListener('click', click);
});因此,在我的扩展控制台中,我得到了一个结果对象,但是没有我需要的值。我在浏览器控制台中得到了结果,但是我无法为扩展获得结果。
我试图找到一个解决方案,但我所发现的只是如何在DOM中注入一个脚本。
请帮帮忙。
编辑。
清单文件
{
  "name": "tesiting",
  "description": "generic",
  "version": "1.0",
  "permissions": [
   "https://www.example.lv/*",
   "https://*.example.*",
   "activeTab"
  ],
    "content_scripts": [
    {
      "matches": ["https://www.example.lv/*"],
      "js": ["testevent.js"]
    }
  ],
  "browser_action": {
  "default_icon": "icon.png",
    "default_title": "Mhmmm",
    "default_popup": "popup.html"
  },
  "manifest_version": 2
}popup.html
<!doctype html>
<html>
<head>
</head>
<body>
<div id='message'>Geting code</div>
<script type="text/javascript" src="testevent.js"></script>
</body>
</html>内容脚本 testevent.js
window.addEventListener("MyCustomEvent", function (e) {
  var check = e.detail.passback;
  console.log(check);
});
function click(b) {
  chrome.tabs.executeScript(null,
      {file: "eventer.js"});
}
document.addEventListener('DOMContentLoaded', function () {
  var divs = document.getElementById('message');
    divs.addEventListener('click', click);
});eventer.js
var scr = document.createElement('script');
scr.textContent = '(' + function () { 
  var check = [console.log(D.nonce.name)]; //this is the function which I execute to get the desired values from it, right now it should get a Name.
  var event = document.createEvent("CustomEvent");  
  event.initCustomEvent("MyCustomEvent", true, true, {"passback":check});
  window.dispatchEvent(event); } + ')();';
(document.head || document.documentElement).appendChild(scr);
scr.parentNode.removeChild(scr);发布于 2015-10-15 21:46:21
{...}对象)可以传递给回调,而不是DOM元素。isolated world中运行的扩展的内容脚本不是这种情况。<script>元素将脚本注入页面本身是一种异步操作,这意味着内容脚本将立即返回到executeScript的回调,其中包含由最后一个语句(代码中的document.body.appendChild)返回的不可序列化的值。
您在控制台日志中看到的第一个可用值来自内部<script>-injected代码,而不是回调。有几种解决办法:
postMessage和自定义事件发送值,用window.addEventListener在注入的内容脚本中接收它,然后通过chrome.runtime.sendMessage将其发送到扩展,在弹出式脚本中用chrome.runtime.onMessage接收它。"externally_connectable":从网页发送消息。简而言之:在manifest.json中显式地允许页面的url,在页面注入的代码中使用chrome.runtime.sendMessage发送,在弹出/背景脚本中使用chrome.runtime.onMessageExternal接收)。chrome extension access page variables找到其他示例/解决方案https://stackoverflow.com/questions/33158442
复制相似问题