首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >获取Chrome扩展的网页函数返回值

获取Chrome扩展的网页函数返回值
EN

Stack Overflow用户
提问于 2015-10-15 20:59:20
回答 1查看 1.8K关注 0票数 0

我正在做一个Chrome扩展,它需要从网页中获得一些值。该页面有一个带有函数的脚本元素:

代码语言:javascript
运行
复制
<script>D.setConst({"TIME":1444940082,"LANG":"En","ID":1463887,"DEV":false,"DEV_NAME":......

当我输入浏览器控制台D.TIME时,我会得到时间值。在这个函数中,有很多变量,我很少需要它们来扩展。

我已经完成的步骤: 1.清单文件具有所有权限,声明为内容脚本。2.有一个带有按钮的popup.html窗口,它可以执行我的内容脚本中的代码:

代码语言:javascript
运行
复制
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中注入一个脚本。

请帮帮忙。

编辑。

清单文件

代码语言:javascript
运行
复制
{
  "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

代码语言:javascript
运行
复制
<!doctype html>
<html>
<head>
</head>
<body>
<div id='message'>Geting code</div>
<script type="text/javascript" src="testevent.js"></script>
</body>
</html>

内容脚本 testevent.js

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
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);
EN

回答 1

Stack Overflow用户

发布于 2015-10-15 21:46:21

  1. 只有JSON可序列化的对象(如number、string、数组、简单的{...}对象)可以传递给回调,而不是DOM元素。
  2. 当交互式地输入控制台时,代码在页面的上下文中运行,因此页面变量是可访问的。在isolated world中运行的扩展的内容脚本不是这种情况。
  3. 通过<script>元素将脚本注入页面本身是一种异步操作,这意味着内容脚本将立即返回到executeScript的回调,其中包含由最后一个语句(代码中的document.body.appendChild)返回的不可序列化的值。 您在控制台日志中看到的第一个可用值来自内部<script>-injected代码,而不是回调。

有几种解决办法:

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33158442

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档