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

时间:2017-02-09 09:25:10

标签: javascript jquery angularjs google-chrome-extension firefox-webextensions

我正在开发Chrome扩展程序,我想检测用户输入网址的时间。我知道:

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

但是,无论何时更改URL(例如,当页面自动重新加载,或用户点击链接等)时都会调用它。

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

2 个答案:

答案 0 :(得分:4)

您可以使用webNavigation.onCommitted MDN 事件获取此信息。事件侦听器接收属性transitionType MDN ,这将是different values MDN 基于导航的原因。您触发的值取决于完全您想要的是什么。对于您所描述的内容,您可能需要'typed' MDN ,但也可能需要{{3} } 'generated' MDN 'keyword' 和/或MDN 'keyword_generated'

Chrome的MDN(Chrome History API page页面上列出了可能的值列表,但未在此处说明)(在MDN上:webNavigation) (Chrome历史记录API页面中的文字):

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

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

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

答案 1 :(得分:-1)

您可以查看$locationChangeSuccess

你可以得到这样的路径:

var loc = $location.path();

然后在更改loc时,您可以附加您的功能。