从popup.js|Chrome扩展访问DOM
Access DOM from popup.js | Chrome Extension
我正在尝试制作一个Chrome扩展,它将接受页面的一些内容(带有id="productTitile"
的<span>
的内部HTML),然后我需要获取该值并将其放入popup.HTML中的字段中。
我试过这个:
document.getElementById('input_87').value = chrome.tabs.executeScript({
code: 'document.getElementById("productTitle").innerHTML'
});
但它只是将undefined
返回到字段中。然后,我在父页面的控制台中运行document.getElementById("productTitle").innerHTML
,它给了我期望的值,但当我在弹出扩展的控制台中执行整个代码时,它再次返回undefined。
我做错了什么?
首先,正如Haibara Ai所说,chrome.tabs.executeScript
是异步的-它不会返回任何东西(也不会立即执行任何操作)。
一般来说,一个很好的来源是这个问题:如何从异步调用返回响应(剧透:你不能)
如果你看一下文档(顺便说一句,这应该是你的第一个无条件反射),你会发现它有一个回调,如果你读了上面的问题,你就会明白这是你唯一的选择。然而,还有两个额外的并发症:
-
回调获取结果的数组。之所以会发生这种情况,是因为
executeScript
可以选择性地(在指定了allFrames: true
或frameId
的情况下)在子帧中运行。因此,您需要使用结果数组的第一个元素:chrome.tabs.executeScript({ code: 'document.getElementById("productTitle").innerHTML' }, function(results) { document.getElementById('input_87').value = results[0]; });
-
对
executeScript
的调用可能会失败,例如,当页面无论权限如何都不可编写脚本时,例如Chrome Web Store。明智的做法是在使用之前检查你是否真的得到了结果:chrome.tabs.executeScript({ code: 'document.getElementById("productTitle").innerHTML' }, function(results) { if (chrome.runtime.lastError) { // Couldn't execute the script at all } else if (typeof results[0] === "undefined") { // Couldn't find what we wanted } else { // Everything is fine document.getElementById('input_87').value = results[0]; } });
相关文章:
- 从popup.js|Chrome扩展访问DOM
- 从Chrome扩展访问Google Cloud SQL数据库
- 如何从chrome扩展访问angularjs根范围
- 如何从Chrome扩展访问所有窗口对象
- 使用AJAX从扩展访问远程域
- 从Chrome扩展访问API
- 从扩展访问document.activeElement.value
- Chrome扩展-访问iframe元素
- GMail API从chrome扩展访问?403禁止
- 如何全局存储扩展访问令牌
- 在共享扩展访问网页属性
- 应该chrome扩展访问标签内容(其他网站)
- Chrome扩展访问唯一的client_id (UUID)
- Chrome扩展:访问DOM的弹出.html和让jQuery工作
- 无法使用Chrome扩展访问页面数据
- 从chrome扩展访问当前的HTML页面
- 只能从Chrome扩展访问页面
- 通过Google chrome扩展访问本地文件
- 从bootstrap扩展访问Firefox插件SDK
- 使用AJAX (Firefox扩展)访问带有页面的DOM