超链接与主播

时间:2011-09-30 12:13:51

标签: gwt

何时使用HyperLink以及何时使用Anchor?

使用HyperLink时如何处理点击? com.google.gwt.user.client.ui.Hyperlink.addClickHandler(ClickHandler)已弃用 com.google.gwt.user.client.ui.Hyperlink.addClickListener(ClickListener)也已弃用。

Doc建议使用Anchor#addClickHandler,但在使用 HyperLink

时如何使用 Anchor #addClickHandler

这是否意味着如果我需要处理点击,我应该始终使用Anchor并且永远不要使用HyperLink

2 个答案:

答案 0 :(得分:23)

很好的问题,因为它非常简单,但却为许多GWT程序员开辟了一个全新的领域。我之所以投票,只是因为它可以成为人们探索GWT可以做什么的一个很好的引导。

Anchor是用于存储和显示超链接的小部件 - 基本上是< a>。标签。真的没有那么令人兴奋。如果您希望页面链接到某个外部网站,请使用锚点。

链接也用于内部导航。假设我有一个需要用户登录的GWT应用程序,所以在我的第一个面板上我放了一个登录按钮。当用户点击它时,我会显示一个带有小部件的新面板来收集用户的信息,验证它的代码,然后如果验证成功,则重建用户所在的第一个面板。

按钮很好,但这是一个浏览器,我希望我的用户体验更像是一个网页,而不是一个桌面应用程序,所以我想使用链接而不是按钮。超链接做到了这一点。 documentation for hyperlink描述得很好:

  

用作“内部”超链接的小部件。也就是说,它是一个链接   到运行应用程序的另一个状态。点击后,它会   使用History.newItem(java.lang.String)创建一个新的历史框架,   但没有重新加载页面。

     

作为真正的超链接,用户也可以   “右键单击,在新窗口中打开链接”,这将导致   应用程序将在由...指定的状态下加载到新窗口中   超链接。

第二句应该有助于澄清它。超链接以URL意义更改页面(锚点的方式),但URL将通过显示与附加到基本URL的超链接关联的“标记”来反映程序的状态在斜线之后。您定义令牌。这将是描述性的东西,如“登录”或“帮助”或“约”。但这不是一个新页面。例如,您无需构建其他HTML文件来显示帮助页面。正在改变的是当前GWT应用程序的 state 。即使您“在新窗口中打开”,您只是在特定状态下运行相同的应用程序。

它看起来像一个链接,但它实际上是一个操作历史框架的小部件,这反过来又允许您移动GWT应用程序的状态。您没有为超链接小部件编写单击处理程序,而是为历史堆栈编写值更改处理程序。当您看到“帮助”标记已放在历史堆栈上时,您的处理程序将执行GWT代码以将带有嵌入式HTML文本的FlowPanel附加到RootPanel以及您的帮助信息。这被用户视为“新页面”,这是他在点击超链接时所期望的。该URL将是something.html / help。现在假装他通过后退按钮返回此URL,而不是您的超链接。没问题。你不关心超链接点击。你只关心历史堆栈的变化。您的值更改处理程序再次触发,并执行与以前相同的操作以显示帮助面板。用户仍然享受浏览网页的体验,即使您和我知道只有一个网页,并且您正在将面板附加到RootPanel(或用于显示GWT面板的任何方案)。

这导致了一个奖金主题。

这个奖金有点复杂,但具有讽刺意味的是,它可以帮助更好地理解超链接。我说更复杂,但实际上,它有助于巩固这一观念,即GWT应用程序由一系列状态组成,并且屏幕上的网页只是用户对这些状态变化的感知。那是Activities and Places。活动和地点抽象出这个历史框架操作,一旦你设置了一个GWT提供的专门用于此目的的映射器,就可以在后台处理它,允许你将你的应用程序分解为一系列活动,并作为用户通过这些活动进行交互,他被放置在不同的地方,每个地方都有一个视图。此外,用户可以使用地址栏,书签,历史记录和后退/前进按钮等浏览器控件从一个地方移动到另一个地方,从而为用户提供真实的网络体验。如果你真的想要掌握超链接和锚点之间的概念差异,你应该尝试学习这个GWT主题。它真的可以让你改变你看待你的应用程序的方式,并且做得更好。

答案 1 :(得分:6)

Hyperlink(或InlineHyperlink)基本上只是一种Anchor ClickHandlerHistory.newItempreventDefault()事件(以便实际上没有遵循链接) 实际上,Hyperlink如果它认为(并且只是猜测)你在链接上右键单击或中键(或按住Ctrl键单击)(取决于浏览器),则不会这样做新窗口或标签中的链接。

如果您还需要其他行为,请不要使用Hyperlink并使用Anchor代替。如果您想向Hyperlink添加一些行为,请使用Anchor并模仿Hyperlink的内容。您可以重复使用HyperlinkImpl进行右键单击/按住Ctrl键单击处理(请参阅下面的链接)。

但实际上,如果您需要看起来像链接的东西并在点击时执行某些操作,但没有“目标URL”(即不应右键单击/按住Ctrl键单击以在新窗口中打开/ tab,或者它并不意味着要做任何事情),然后不要使用ANchorHyperlink,而是使用Label的任何内容,并使其看起来像链接(但是,也许你应该使用Button并让它看起来像一个按钮;谷歌曾经有类似链接的按钮 - 比如GMail中的“刷新”链接/按钮 - 并将它们改为外观像按钮,当它们真的不是链接时)。

另请参阅https://groups.google.com/d/msg/google-web-toolkit/P7vwRztO6bA/wTshqYs6NM0Jhttps://groups.google.com/d/msg/google-web-toolkit/CzOvgVsOfTo/IBNaG631-2QJ

相关问题