在GWT中,在任何主机页面标签上添加一个事件处理程序 [英] In GWT, adding an event handler on any of the host page tags

查看:113
本文介绍了在GWT中,在任何主机页面标签上添加一个事件处理程序的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想为任何标签添加一个MouseOver事件处理程序。比方说,我想为传统HTML页面中的每个锚点页面添加事件处理程序。



GWT指南中,我能够使用他们的JSNI方法建议在修正小错误(缺少括号和类型)。

但是,我想使用ArrayList中收集的元素并将它们全部绑定到事件处理程序。我该怎么做?



我写的代码如下:

  private native void putElementLinkIDsInList(BodyElement elt,ArrayList list)/ *  -  {
var links = elt.getElementsByTagName(a);

for(var i = 0; i< links.length; i ++){
var link = links.item(i);
link.id =(uid-a-+ i);
list。@ java.util.ArrayList :: add(Ljava / lang / Object;)(link.id);
}
} - * /;

/ **
*找到所有锚点标记,并且如果网站外的任何点将其重定向到
*阻止页面。
* /
private void rewriteLinksIterative(){
ArrayList links = new ArrayList();
putElementLinkIDsInList(Document.get()。getBody(),links);
for(int i = 0; i< links.size(); i ++){
Element elt = DOM.getElementById((String)links.get(i));
rewriteLink(elt,www.example.com);
}
}

/ **
*阻止所有与网站名称不符的网站访问
*
* @param元素
*锚点链接元素
* @param sitename
*要检查的网站名称。例如www.example.com
* /
private void rewriteLink(Element element,String sitename){
String href = DOM.getElementProperty(element,href);

if(null == href){
return;
}

//我们希望重新编写超出此网站的绝对网址
if(href.startsWith(http://)
&&!href.startsWith(http://+ sitename +/)){
DOM.setElementProperty(element,href,http://+ sitename
+/Blocked.html);



$ div $解析方案

你可能要使用 Document.getElementsByTagName(a) ,它返回一个 NodeList 包含这些元素,它们可以转换为 AnchorElement s来暴露标签的 href 属性。



试试这段代码:

  NodeList< Element> elems = Document.get()。getElementsByTagName(a); 
for(int i = 0; i< elems.getLength(); i ++){
Element elem = elems.getItem(i);
AnchorElement a = AnchorElement.as(elem);
if(!a.getHref()。startsWith(http://yoursite.com)){
a.setHref(http://yoursite.com/blockedpage);


$ / code $ / pre

要添加一个事件处理函数, 元素锚点中使用 wrap()

  for(int i = 0; i< elems。 getLength(); i ++){
Element elem = elems.get(i);
Anchor a = Anchor.wrap(elem);
a.addClickHandler(new ClickHandler(){
@Override
public void onClick(ClickEvent event){
Window.alert(yay!);
}
});

$ / code>

(如果处理程序总是执行相同的操作,那么您需要只实例化一个 ClickHandler ,并将其添加到每个元素,而不是为每个元素创建一个处理程序)


I want to add a MouseOver event handler for any tag. Let say just for the example, that I want to add the event handler for every anchor page in a legacy HTML page.

Following the GWT guide, I was able to use their a JSNI method suggested to retrieve all anchor tags after correcting small errors (missing parenthesis and types).

However, I want to use the elements collected in the ArrayList and bind all of them to an event handler. How can I do that?

The code I wrote is listed below:

  private native void putElementLinkIDsInList(BodyElement elt, ArrayList list) /*-{
    var links = elt.getElementsByTagName("a");

    for (var i = 0; i < links.length; i++ ) {
      var link = links.item(i);
      link.id = ("uid-a-" + i);
      list.@java.util.ArrayList::add(Ljava/lang/Object;) (link.id);
    }
  }-*/;

  /**
   * Find all anchor tags and if any point outside the site, redirect them to a
   * "blocked" page.
   */
  private void rewriteLinksIterative() {
    ArrayList links = new ArrayList();
    putElementLinkIDsInList(Document.get().getBody(), links);
    for (int i = 0; i < links.size(); i++) {
      Element elt = DOM.getElementById((String) links.get(i));
      rewriteLink(elt, "www.example.com");
    }
  }

 /**
   * Block all accesses out of the website that don't match 'sitename'
   * 
   * @param element
   *          An anchor link element
   * @param sitename
   *          name of the website to check. e.g. "www.example.com"
   */
  private void rewriteLink(Element element, String sitename) {
    String href = DOM.getElementProperty(element, "href");

    if (null == href) {
      return;
    }

    // We want to re-write absolute URLs that go outside of this site
    if (href.startsWith("http://")
        && !href.startsWith("http://" + sitename + "/")) {
      DOM.setElementProperty(element, "href", "http://" + sitename
          + "/Blocked.html");
    }
  }

解决方案

You'll probably want to use Document.getElementsByTagName("a"), which returns a NodeList containing the elements, which can be cast to AnchorElements exposing the tag's href attribute.

Try this code:

NodeList<Element> elems = Document.get().getElementsByTagName("a");
for (int i = 0; i < elems.getLength(); i++) {
  Element elem = elems.getItem(i);
  AnchorElement a = AnchorElement.as(elem);
  if (!a.getHref().startsWith("http://yoursite.com")) {
    a.setHref("http://yoursite.com/blockedpage");
  }
}

To add an event handler, you can instead wrap the Element in an Anchor using wrap()

for (int i = 0; i < elems.getLength(); i++) {
  Element elem = elems.get(i);
  Anchor a = Anchor.wrap(elem);
  a.addClickHandler(new ClickHandler() {
    @Override
    public void onClick(ClickEvent event) {
      Window.alert("yay!");
    }
  });
}

(If the handler will always do the same thing, you'll want to only instantiate one ClickHandler and add it to each element instead of creating a handler for each element)

这篇关于在GWT中,在任何主机页面标签上添加一个事件处理程序的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆