如何仅在用户更改URL时触发事件?

我正在使用Chrome扩展程序,我想检测用户输入url的时间。 我知道:

chrome.tabs.onUpdated.addListener(eventLisenerObj.onUpdated); 

但是,只要URL被更改(例如,页面自动重新加载,或用户点击链接等),就会调用它。

我希望能够确定只有用户输入URL才能更改URL。

您可以使用webNavigation.onCommitted ( MDN )事件获取此信息。 事件侦听器接收属性transitionType ( MDN ) ,该属性将是基于导航原因的不同值 ( MDN ) 。 您触发的值取决于您想要的确切值。 对于您所描述的内容,您可能需要'typed' ( MDN ) ,但也可能需要'typed' 'generated' ( MDN )'keyword' ( MDN )和/或'keyword_generated' ( MDN )

可以在Chrome的历史记录API页面上解释可能的值列表(它们列在Chrome webNavigation页面上,但未在webNavigation说明)(在MDN上: TransitionType )(Chrome历史记录API页面中的文本):

  • "link"
    用户通过单击另一页面上的链接进入此页面。
  • "typed"
    用户通过在地址栏中键入URL来获取此页面。 还用于其他显式导航操作。 另请参见generated ( MDN ) ,它用于用户选择不像URL一样的选项的情况。
  • "auto_bookmark"
    用户通过UI中的建议到达此页面 – 例如,通过菜单项。
  • "auto_subframe"
    子框架导航。 这是在非顶级框架中自动加载的任何内容。 例如,如果网页包含多个包含广告的框架,则这些广告url具有此转换类型。 用户甚至可能没有意识到这些页面中的内容是一个单独的框架,因此可能不关心URL(另请参见manual_subframe ( MDN ) )。
  • "manual_subframe"
    对于用户明确请求的子帧导航,并在后/前列表中生成新的导航条目。 显式请求的帧可能比自动加载的帧更重要,因为用户可能关心所请求的帧已加载的事实。
  • "generated"
    用户通过键入地址栏并选择一个看起来不像URL的条目来到达此页面。 例如,匹配可能包含Google搜索结果页的url,但用户可能会将其显示为“搜索Google for …”。 这些与typed ( MDN )导航并不完全相同,因为用户没有键入或查看目标URL。 另请参阅keyword ( MDN )
  • "auto_toplevel"
    该页面在命令行中指定或是起始页面。
  • "form_submit"
    用户在表单中填写值并提交。 请注意,在某些情况下 – 例如表单使用脚本提交内容时 – 提交表单不会导致此转换类型。
  • "reload"
    用户通过单击重新加载按钮或在地址栏中按Enter键重新加载页面。 会话恢复和重新打开关闭选项卡也使用此转换类型。
  • "keyword"
    该URL是从默认搜索提供程序以外的可替换关键字生成的。 另请参见keyword_generated ( MDN )
  • "keyword_generated"
    对应于为关键字生成的访问。 另请参阅keyword ( MDN )

要区分某些类型的转换,除了transitionType值之外,您还需要查看TransitionQualifier ( MDN ) 。 可能的值是(来自Chrome文档 , 在MDN上描述的方式有所不同):

  • "client_redirect"
    导航期间发生了由页面上的JavaScript或元刷新标记引起的一个或多个重定向。
  • "server_redirect"
    在导航期间发生了由服务器发送的HTTP标头引起的一个或多个重定向。
  • "forward_back"
    用户使用“前进”或“后退”按钮启动导航。
  • "from_address_bar"
    用户从地址栏(也称为Omnibox)启动了导航。

你可以看看$locationChangeSuccess

你可以得到这样的路径:

 var loc = $location.path(); 

然后在更改loc您可以附加您的function。