与侦听器不一致 - onUpdated在一台机器上,onReplaced在另一台机器上

时间:2014-01-20 00:53:46

标签: google-chrome google-chrome-extension

我正在使用eventPage.js中的下一个代码(google替换backgroundPage),我面临一些奇怪的不一致。 这是场景:

第一台机器

打开新标签页>

onActivated 
onUpdated  
onUpdated  
onUpdated

输入网址 - >

onUpdated
onUpdated 

输入其他网址 - >

onUpdated
onUpdated 

第二台机器

打开新标签页>

onActivated

输入网址

onReplaced
onActivated

输入其他网址

onReplaced 
onActivated

这是我的代码:

chrome.tabs.onUpdated.addListener(function(tabId, changeInfo, tab)
{   
    console.log("onUpdated");
       });

chrome.tabs.onActivated.addListener(function(tabId, changeInfo, tab)
{
    console.log("onActivated");
   });

 chrome.tabs.onReplaced.addListener(function(tabId, changeInfo, tab)
 {
    console.log("onReplaced");
   });

经过大量调试后,我发现造成这种差异的原因是Google Chrome设置中的“预测网络操作以提高网页加载效果”选项。

在第一台机器中,未选择上面的选项并且按预期工作。

第二台机器的预期行为是什么?

从文档中我可以理解onReplaced状态:

  

由于预渲染或使用另一个标签替换标签时触发   瞬间。

虽然文档记录很差,并且无法知道该选项与onUpdated onReplaced状态有某种关联但我真的不理解第二台机器中的onActivated状态以及为什么第一台机器和第一台机器之间存在差异第二台机器。

我在网上找不到有关此行为的任何文档。在stackoverflow上,我几乎找不到一个提到onReplaced listener的问题,但没有任何我可以使用的信息。

由于

1 个答案:

答案 0 :(得分:4)

选中“预测网络操作...”选项后,Chrome会尝试预测您的下一个操作(即您下次可能请求的资源或页面)并将其加载到背景(在您提出请求之前)。只要您确实请求该资源或页面,Chrome就不必先加载它然后再将其提供给您;相反,它只是为预先加载的实例提供服务。这样可以提高性能(只要您对下一步操作的预测准确无误)。

要投放预先加载的页面,Chrome会使用已在后台加载页面的标签替换当前标签(触发onReplaced时)(替换标签变为活动状态,因此{ {1}}事件)。由于事先已在替换标签中加载了内容,因此没有onActivated事件。


来自Chrome的 whitepaper on prerender

  

Prerendering 扩展了预取的概念。它不是仅下载顶级资源,而是完成向用户显示页面所需的所有工作,而不会在用户点击之前实际显示该页面。预渲染的行为类似于用户在页面上的中间点击(在后台选项卡中打开它)然后切换到该选项卡。但是,在预渲染中,“背景选项卡”对用户完全隐藏,当用户点击时,其内容将无缝交换到用户正在查看的同一选项卡中。从用户的角度来看,页面加载速度比以前快得多。

     

Web开发人员可以触发预渲染,如下所述。从Chrome 17开始,Chrome本身将根据用户与地址栏的互动在某些情况下启动预呈现。