Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/381.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Chrome extension在不重新加载整个页面的情况下提取错误的元数据(原始HTML和浏览器的解释之间存在差异)_Javascript_Html_Google Chrome_Google Chrome Extension_Metadata - Fatal编程技术网

Javascript Chrome extension在不重新加载整个页面的情况下提取错误的元数据(原始HTML和浏览器的解释之间存在差异)

Javascript Chrome extension在不重新加载整个页面的情况下提取错误的元数据(原始HTML和浏览器的解释之间存在差异),javascript,html,google-chrome,google-chrome-extension,metadata,Javascript,Html,Google Chrome,Google Chrome Extension,Metadata,我有一个Chrome扩展浏览器操作,可以从当前选项卡中提取元数据。除某些网页(如YouTube)上的元素(如描述)不是来自当前页面,而是来自主页(或上次手动页面刷新发生在同一域内)外,它的工作原理与预期相同。标题和URL总是被正确检索,但使用不同的代码(chrome.tabs.query) 元描述的脚本代码示例(使用chrome.tabs.executeScript): 此代码将在任何YouTube.com页面上返回“与朋友、家人和世界共享您的视频”(这是主页元描述),除非我重新加载该页面或通过

我有一个Chrome扩展浏览器操作,可以从当前选项卡中提取元数据。除某些网页(如YouTube)上的元素(如描述)不是来自当前页面,而是来自主页(或上次手动页面刷新发生在同一域内)外,它的工作原理与预期相同。标题和URL总是被正确检索,但使用不同的代码(chrome.tabs.query)

元描述的脚本代码示例(使用chrome.tabs.executeScript):

此代码将在任何YouTube.com页面上返回“与朋友、家人和世界共享您的视频”(这是主页元描述),除非我重新加载该页面或通过直接链接到达该页面

我注意到原始HTML(“查看页面源代码”)总是正确的,但Chrome Developer Tools元素显示的标题数据不正确。


如何在不重新加载整页的情况下提取当前选项卡?除了querySelector之外,还有其他方法可以绕过浏览器的呈现直接访问HTML吗?

好的,我明白你的意思,我不久前也遇到过类似的问题,当时我正试图自动转到另一个页面上动态创建的锚定。为了让它工作,我用了

<body onload="goToAnchor();">
<script type="text/javascript">
   function goToAnchor() 
   {
     location.href = "#openModal";
   }
</script>

函数goToAnchor()
{
location.href=“#openmodel”;
}
也许你可以使用onload=yourFuntion();为了达到你的要求

希望这有帮助。

YouTube支持,并将页面的最新描述存储在正文中的
标记中。要使用此功能,请将
meta[name=“description”]
选择器替换为
meta[itemprop=“description”]

YouTube使用基于pushState的导航更新文档的视图,而无需真正“重新加载”页面。这就是为什么实时DOM和视图源DOM之间存在差异。如果要检测何时发生此类导航,请阅读


在不支持微数据但行为如问题中所述的页面上,您可以获取该页面并使用以下代码段查询DOM(假设您支持该页面):

var url='1〕https://www.youtube.com/'; // e、 g.从tab.url
var x=新的XMLHttpRequest();
x、 打开('GET',url);
x、 responseType='document';
x、 onload=函数(){
var doc=x.response;
var desc=doc.querySelector('meta[name=“description”]”);
如果(描述){
desc=desc.getAttribute('content');
//执行某些操作,例如在对话框中显示:
警报(desc);
}
};
x、 send();

查看这篇文章,了解如何在不刷新页面的情况下将新的HTML数据从服务器推送到浏览器。希望它能解决你的问题。@Sean Carroll除非我弄错了,否则我的问题不是WebSocket造成的。网页并不是在发送新数据。例如:只需访问YouTube.com。点击任何视频。检查Chrome开发者工具中的数据。这是错误的。刷新页面。现在,它是正确的。“查看页面源代码”重新检索页面,因此它与刷新页面的情况相同。看起来YouTube导航(实际上不导航,但操纵历史状态)不会刷新DOM的这一部分,因此这不是扩展的错。开发者工具代表了DOM的实际情况。@Xan我认为这绝对是问题所在。有什么办法可以绕过这个?有没有一种方法可以在不刷新页面的情况下访问有问题的DOM部分(例如)?另外,为什么网站不希望某些元数据与DOM相关?为什么?我认为这是因为
字段更多地用于机器人,而这些机器人不会使用基于JS的导航。您可以使用XHR(返回的结果与页面源代码相同)刮取页面,或者构造另一个查询来查找页面上的描述。这对于回答此问题毫无意义。首先,不能将内联脚本(onload=“”)放入chrome扩展。但是,您可以将其放入js文件本身。无论如何,我已经在使用“$(document.ready”。似乎不存在加载时间的问题。
<body onload="goToAnchor();">
<script type="text/javascript">
   function goToAnchor() 
   {
     location.href = "#openModal";
   }
</script>