Javascript 在GWT中,在任何主机页标记上添加事件处理程序

Javascript 在GWT中,在任何主机页标记上添加事件处理程序,javascript,gwt,Javascript,Gwt,我想为任何标记添加MouseOver事件处理程序。举个例子,我想为遗留HTML页面中的每个锚页面添加事件处理程序 之后,我能够使用他们建议的JSNI方法在纠正小错误(缺少括号和类型)后检索所有锚标记 但是,我想使用ArrayList中收集的元素,并将它们全部绑定到事件处理程序。我该怎么做 下面列出了我编写的代码: private native void putElementLinkIDsInList(BodyElement elt, ArrayList list) /*-{ var

我想为任何标记添加MouseOver事件处理程序。举个例子,我想为遗留HTML页面中的每个锚页面添加事件处理程序

之后,我能够使用他们建议的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);
    }
  }-*/;

  /**
   * 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");
    }
  }
私有本机void PutElementLinkId列表(BodyElement elt,ArrayList列表)/*-{ var links=elt.getElementsByTagName(“a”); 对于(变量i=0;i您可能需要使用,它返回一个包含元素的
节点列表,可以将其强制转换为
锚定元素
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");
  }
}

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

谢谢您的详细回答。但您必须纠正这些错误:在第一行必须写:NodeList elems=Document.get().getElementsByTagName(“a”);我很难将它用于div。。。您有什么建议吗?您可以在
标签中包装
div
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!");
    }
  });
}