2014-09-03 43 views
2

我正試圖在<li>內部的錨點元素上下載一個事件,而<li>上的偵聽器正常工作正常,但它不適用於任何其他元素上的錨點。 怪異的事情,它的工作FireFoxGWT SinkEvent不能正常工作,除非在Firefox上

的HTML輸出是一樣的東西:

<li> 
    Some Text 
</li> 
<li> 
    Some Text<a class='myClass'>Anchor</a> 
</li> 

Java代碼聽者

this.eventListener = new EventListener() { 
     @Override 
     public void onBrowserEvent(Event e) { 
      Element elem = e.getTarget(); 

      //This means we want to use the option selection 
      switch (e.getTypeInt()) { 
       case Event.ONCLICK: 

        if (LIElement.is(elem) && !elem.hasClassName('myClass')) { 
         selectOption((LIElement) elem); 
        } else { 
         LIElement li = (LIElement) elem.getParentElement(); 
         createContact(li); 
        } 

        break; 
       case Event.ONMOUSEOVER: 
        //do something 

        break; 
       case Event.ONMOUSEOUT: 
        //do something 
        break; 
      } 

     }//End of onBrowserEvent 
    };//End of event listener 

我使用它來創建內容:

LIElement li = Document.get().createLIElement(); 
AnchorElement createContactLI = Document.get().createAnchorElement(); 
createContactLI.addClassName(NEW_CONTACT_CLASS); 
createContactLI.setInnerText("Add new contact"); 
createContactLI.setId("myID"); 
li.appendChild(createContactLI); 
ulPanel.appendChild(li); 

這下沉事件:

Event.sinkEvents(ulPanel, Event.ONCLICK | Event.ONMOUSEOVER | Event.ONMOUSEOUT); 
Event.setEventListener(ulPanel, this.eventListener);` 

我試了一下

  • Sinked錨的情況下,沒有鐵鍋
  • 包裹anchorElement錨並添加clickHandler事件,沒有工作
  • 將anchorElement轉換爲liElement,沒有工作
  • 順便提一下,處理anchorEl時不會觸發斷點EMENT
  • 也試過CSS和z索引,沒有工作

我所要做的 - 寫全功能小部件,這將要花費很長一段時間

你的幫助確實真的很感謝

+0

我想你可能需要添加一個特定的事件處理程序到錨元素。並在錨元素事件偵聽器調用。 event.preventDefault()。否則,瀏覽器將自動處理默認的定位點擊。錨元素可能會捕獲點擊事件,並且不會將事件傳播到您的ulPanel。我知道你在做什麼可能會起作用,但是我過去遇到過這個問題,並決定將處理程序添加到li元素本身而不是容器中。 – 2014-09-08 18:34:22

+0

@ChrisHinshaw感謝您的評論,這對我來說很合理。 順便說一句我做了你現在正在做的事情,並使用處理程序來自我元素和傳播我停止它,當點擊錨點:) – Sedz 2014-09-08 22:08:42

回答

1

而不是使用com.google.gwt.user.client.Element使用com.google.gwt.dom.client.Element。我不知道你到底在哪裏添加你的ulPanel。但以下代碼工作:

import com.google.gwt.dom.client.AnchorElement; 
import com.google.gwt.dom.client.DivElement; 
import com.google.gwt.dom.client.Document; 
import com.google.gwt.dom.client.Element; 
import com.google.gwt.dom.client.EventTarget; 
import com.google.gwt.dom.client.LIElement; 
import com.google.gwt.user.client.Event; 
import com.google.gwt.user.client.EventListener; 
import com.google.gwt.user.client.Window; 
import com.google.gwt.user.client.ui.VerticalPanel; 

public class CustomWidget extends VerticalPanel{ 

    public CustomWidget() { 
     DivElement ulPanel = Document.get().createDivElement(); 
     LIElement li = Document.get().createLIElement(); 
     AnchorElement createContactLI = Document.get().createAnchorElement(); 
     createContactLI.addClassName("myclass"); 
     createContactLI.setInnerText("Add new contact"); 
     createContactLI.setId("myID"); 
     li.appendChild(createContactLI); 
     ulPanel.appendChild(li); 

     Event.sinkEvents(ulPanel, Event.ONCLICK | Event.ONMOUSEOVER | Event.ONMOUSEOUT); 
     Event.setEventListener(ulPanel, this.eventListener); 

     this.getElement().appendChild(ulPanel); 
    } 

    EventListener eventListener = new EventListener() { 
     @Override 
     public void onBrowserEvent(Event e) { 
      //This means we want to use the option selection 
      switch (e.getTypeInt()) { 
       case Event.ONCLICK: 
        EventTarget eventTarget = e.getEventTarget(); 
        Element elem = Element.as(eventTarget); 
        if (AnchorElement.is(elem) && "myclass".equals(elem.getAttribute("class"))) { 
         Window.alert("clicked anchor element"); 
        } else { 
         LIElement li = (LIElement) elem.getParentElement(); 
         Window.alert("clicked li element"); 
        } 

        break; 
       case Event.ONMOUSEOVER: 
        //do something 

        break; 
       case Event.ONMOUSEOUT: 
        //do something 
        break; 
      } 

     }//End of onBrowserEvent 
    };//End of event listener 

} 
+0

但是,爲什麼,你的解釋是什麼? 順便說一下,我沒有測試這個呢 – Sedz 2014-09-06 19:34:28

0

嘗試在onLoad()小部件生命週期方法中初始化您的代碼。

@Override 
     protected void onLoad() { 
    radioButton = DOM.getElementById("radio_green_id_1").cast(); 
    radioButton.setId(DOM.createUniqueId()); 

Event.sinkEvents(ulPanel, Event.ONCLICK | Event.ONMOUSEOVER | Event.ONMOUSEOUT); 
Event.setEventListener(ulPanel, this.eventListener); 

     }