问题 如何指定打开URL的按钮?


我想编写一个Web应用程序,触发用户的默认电子邮件客户端发送电子邮件。

因此,我创建了一个链接,它导致符合mailto URI方案的URL(http://en.wikipedia.org/wiki/Mailto):

Link emailLink = new Link("Send Email", 
    new ExternalResource("mailto:someone@example.com"));

但是,我想提供一个允许触发相应功能的Button,而不是使用Link。但是,对于按钮,我无法设置要打开的ExternalResource。

有没有人知道为Buttons解决这个问题,或者如何创建一个看起来和行为完全像按钮的链接?我也尝试了一些CCS修改,但没有自己管理任务。我还为前Vaadin版本找到了一些解决方案(https://vaadin.com/forum/#!/thread/69989),但不幸的是,他们不适用于Vaadin 7。


11635
2018-03-12 14:41


起源

使用CSS使链接看起来像一个按钮。 - Kevin Workman
好吧,这听起来很简单,但是我的应用程序使用了一个大的CCS主题,其中包含许多用于按钮的类和属性(包括悬停内容等)。有没有一种简单的方法将所有这些CCS类应用于相应的链接? - Claas Wilke
确保链接具有正确的类和/或ID?你尝试过什么?你也可以google“html make button open link”。 - Kevin Workman
您可能会发现此类似问题有用: Vaadin:用BUTTON的ABSOLUTE url路径打开新窗口 - Basil Bourque


答案:


我记得使用ResourceReference解决类似的问题。

Button emailButton = new Button("Email");
content.addComponent(emailButton);
Resource res = new ExternalResource("mailto:someone@example.com");
final ResourceReference rr = ResourceReference.create(res, content, "email");

emailButton.addClickListener(new Button.ClickListener() {

    @Override
    public void buttonClick(ClickEvent event) {
        Page.getCurrent().open(rr.getURL(), null);
    }
});

14
2018-03-13 09:54



就像谷歌Chrome中的魅力一样。但是,在我的歌剧中(第12.16节)根本没有任何事情发生。知道为什么吗? - Claas Wilke


为了解决类似问题,我之前申请过:

    String email="info@ORGNAME.org";
    Link l=new Link();
    l.setResource(new ExternalResource("mailto:" + email));
    l.setCaption("Send email to " + email);
    addComponent(l);

1
2017-07-09 10:01





经过一些进一步的尝试后,我们设法调整了提议的LinkBut​​ton解决方案 https://vaadin.com/forum/#!/thread/69989 对于Vaadin 7:

public class LinkButton extends Button {
    public LinkButton(final String url, String caption) {
        super(caption);
        setImmediate(true);
        addClickListener(new Button.ClickListener() {
            private static final long serialVersionUID = -2607584137357484607L;

            @Override
            public void buttonClick(ClickEvent event) {
                LinkButton.this.getUI().getPage().open(url, "_blank");
            }
        });
    }
}

但是,此解决方案仍然不完美,因为它会导致弹出窗口的打开被某些Web浏览器阻止。


0
2018-03-12 15:18



考虑使用kris54321的方法,使用Resources和Reference比仅仅操作字符串更安全。另外:你不会解决“一些浏览器阻止弹出窗口”的问题,那就是客户端配置。考虑一个广告可以决定忽略弹出窗口拦截器的世界......在每个用户使用相同浏览器的公司中,您可以通过中央策略取得成功。 - Jan Galinski