如何从javascript中的脚本标记获取窗口变量

时间:2015-08-24 13:24:20

标签: javascript html google-chrome-extension

我需要获取脚本标记内的 window.configData 变量。我的HTML代码中有多个脚本标记。但是我只需要获取包含 window.configData 变量的脚本标记。 我知道这可以使用 document.scripts / document.getElementsByTagName('script')来完成,并搜索所需的变量。

我需要将这个元素放在一行中,以便将其作为变量传递给chrome扩展中的内容脚本。 以下是我的内容脚本的代码。

function getPageDetails(jsonValueToFind, callback) { 
chrome.tabs.executeScript({code:
            "document.defaultView.configData"
        }, function(result) {
    var value = result[0];
    chrome.tabs.query({currentWindow: true, active: true}, function(tabs) {
        callback({
            url: tabs[0].url,
            title: tabs[0].title,
            jsonValue: value
        });
    });
}); 

}

我需要将此变量传递给内容脚本的代码部分。 任何人都可以建议我如何实现这个

2 个答案:

答案 0 :(得分:0)

解析页面的源代码以从页面的window中挖出变量可能不是一个好主意。如果这不是一个简单的任务怎么办?如果<script>代码会自行删除,该怎么办?

正如您可能已经注意到的那样,如果您尝试在内容脚本的上下文中评估window.configData,它将返回undefined

原因是the isolated world concept:目标页面将附加2个独立的JS上下文,一个用于页面(具有configData)和内容脚本的上下文。 window个对象不一样。

要访问页面的对象,您需要在页面的上下文中执行代码。如果你inject a <script> tag with your code,这是可能的。然后,您可以pass the data to your content script或在DOM中的内容脚本可以访问的位置将其写入。

+-----------------+ -(executeScript)-> +----------------+ --(<script>)---> +-------------+
| Background page |                    | Content script |                  | Page script |
+-----------------+ <--(sendMessage)-- +----------------+ <-(CustomEvent)- +-------------+

由于数据收集将是异步的,因此您不能依赖executeScript的返回值 - 您需要传回消息。

因此,甚至可以更好地包含始终加载(通过清单)并抢先收集数据的内容脚本,然后后台页面可以查询它:

                                       +----------------+ --(<script>)---> +-------------+
                                       |                |                  | Page script |
                                       | Content script | <-(CustomEvent)- +-------------+
                                       | (in manifest)  |
+-----------------+ --(sendMessage)--> |                |
| Background page |                    |                |
+-----------------+ <--(sendResponse)- +----------------+

I answered about it in detail before

答案 1 :(得分:-1)

只需使用onload处理程序和id补充实现window.configData的脚本。

var script document.getelementbyid("scriptid");
script.onload= function(){ window.configData;  }