我正在开始一个使用GWT的项目,设计师团队使用HTML和JQuery制作了一个原型。我正在使用UIBinder“重建”UI。我的问题是应用程序有一个使用JQuery的下拉菜单......而且它无法正常工作
到目前为止,我尝试使用UIBinder XML中的HTMLPanel并插入菜单,我保留了.js文件,并在HTML文件中引用它们,希望这些操作能够被选中......但是没有运气。< / p>
这是menu.ui.xml,显示菜单但没有鼠标悬停
<!DOCTYPE ui:UiBinder SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent">
<ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder" xmlns:g="urn:import:com.google.gwt.user.client.ui">
<g:HTMLPanel>
<!-- menu -->
<ul id="menu">
<li class="home"><a href="#"><span>Accueil</span></a></li>
<li class="configuration">
<g:Anchor ui:field="configurationButton" href="#">
<span>Configuration</span></g:Anchor>
<div class="submenu">
<div class="group">
<ul>
<li>
<a href="#">Fiches de configuration</a>
<ul>
<li><a href="#">Organisme</a></li>
<li><a href="#">Groupe opérationnel</a></li>
<li><a href="#">Unité opérationnelle</a></li>
<li><a href="#">Immeuble</a></li>
</ul>
</li>
</ul>
</div>
</div>
</li>
<li class="audit"><a href="#"><span>Audit</span></a></li>
<li class="result"><a href="#"><span>Résultats</span></a></li>
<li class="scenario"><a href="#"><span>Scénarios</span></a></li>
<li class="document"><a href="#"><span>Documents</span></a></li>
</ul>
<!-- menu.end -->
</g:HTMLPanel>
JQuery代码,它位于一个单独的文件common.js
中$('#menu').find('submenu').each(function(){
alert("inside");
var totalWidth = 0;
$(this).children().each(function(){
totalWidth += $(this).outerWidth();
}).end().css({
'display' : 'none',
'width' : totalWidth
});
}).end().css({
'overflow' : 'visible'
});
的EntryPoint
public class M3T implements EntryPoint {
public void onModuleLoad() {
Menu menu = new Menu();
RootPanel.get("menuwrapper").add(menu);
}
}
在HTML中,我有一个插入菜单的div
<script src="js/jquery-1.6.1.min.js" type="text/javascript"></script>
<script src="js/jquery.lib.min.js" type="text/javascript"></script>
<script src="js/common.js" type="text/javascript"></script> ...
<div id="menuwrapper"> </div>
有没有办法让它在不使用GQuery或JSNI的情况下工作
谢谢
答案 0 :(得分:8)
我试过elvispt的解决方案,它有效。在JSNI代码中,我不得不用$
替换$wnd.jQuery
,否则它不会编译。
我还尝试了另一个我决定实现的解决方案:我没有在Menu周围使用包装器,而是在菜单类中覆盖onAttach()并调用bind
import com.google.gwt.core.client.GWT;
public class Menu extends Composite {
private static MenuUiBinder uiBinder = GWT.create(MenuUiBinder.class);
interface MenuUiBinder extends UiBinder<Widget, Menu> {}
public Menu() {
initWidget(uiBinder.createAndBindUi(this));
}
@Override
public void onAttach() {
super.onAttach();
bind();
}
private static native void bind() /*-{
$wnd.jQuery('#menu').find('.submenu').each(function(){
alert("inside");
var totalWidth = 0;
$wnd.jQuery(this).children().each(function(){
totalWidth += $wnd.jQuery(this).outerWidth();
}).end().css({
'display' : 'none',
'width' : totalWidth
});
}).end().css({
'overflow' : 'visible'
});
}-*/;
}
再次感谢
答案 1 :(得分:3)
在SimplePanel中包装uiBinder生成的类,然后覆盖onAttach()
方法
由于生成的类是menu
:
创建另一个类,例如:menuCaller
public class menuCaller extends SimplePanel {
menu menuWrap = new menu();
public menuCaller() {
add(menuWrapp);
}
@Override
public void onAttach()
{
super.onAttach();
bind();
}
private static native void bind() /*-{
$('#menu').find('submenu').each(function(){
alert("inside");
var totalWidth = 0;
$(this).children().each(function(){
totalWidth += $(this).outerWidth();
}).end().css({
'display' : 'none',
'width' : totalWidth
});
}).end().css({
'overflow' : 'visible'
});
}-*/;
}