Java 以编程方式调整zk模态的大小
我有一个名为loginModal的模态应用程序,它包含一个iframeJava 以编程方式调整zk模态的大小,java,javascript,iframe,zk,Java,Javascript,Iframe,Zk,我有一个名为loginModal的模态应用程序,它包含一个iframe <window id="loginModal" title="Login" border="normal" position="center,top" closable="true" width="500px" height="350px" > <iframe src="/usermenu.zul" id="iframeLogin" scrolling="false" width="100%" h
<window id="loginModal" title="Login" border="normal" position="center,top" closable="true" width="500px" height="350px" >
<iframe src="/usermenu.zul" id="iframeLogin" scrolling="false" width="100%" height="100%"/>
</window>
iframe调用页面用户菜单。在某些情况下,用户菜单可能重定向到内容大于模式的验证页面。我想找到一种方法,当做重定向时,我可以调整模态的大小,使其自动变大
请注意,getParent返回null,不向我返回模态对象
我试图在到达验证页面时向LoginModel发送消息。消息已收到,但我无法通过javascript调整模式大小
在验证页面中
<script type="text/javascript">
window.parent.postMessage('verification','*');
</script>
window.parent.postMessage('verification','*');
在loginModal中
<script type="text/javascript">
window.addEventListener('message', receiveMessage, false);
function receiveMessage(evt) {
if (evt.data == 'verification') {
loginModal.height = 500;
}
}
</script>
loginModal.setWidth("100px");
window.addEventListener('message',receiveMessage,false);
功能接收消息(evt){
如果(evt.data==‘验证’){
loginModal.height=500;
}
}
我试过几种不同的方法来设置高度,但都不起作用。我知道消息正在到达LoginModel,因为我可以发送警报。
任何帮助都将不胜感激。谢谢你ZK所做的是在一个桌面上加载你的
loginModal
页面,在另一个桌面上加载你的iframeLogin
页面。桌面的概念得到了进一步的澄清
因此,loginModal
不是iframeLogin
的父浏览器窗口。这就是为什么在iframe上调用时返回null
如中所述,用户可能无法访问连接到其他桌面的组件。换句话说,禁用了loginModal
和iframeLogin
之间的信息交换
您似乎有两种选择之一:
loginModal
和iframeLogin
都可见,并使用它在您拥有的两台台式机之间交换信息xmlns:w=”http://www.zkoss.org/2005/zk/client“
进入您的窗口
标签defer=“true”
插入script
标记,在创建所有小部件后,将对JS代码进行评估这个
引用了脚本
小部件本身。您的窗口
和脚本
在同一个窗口中共存。换句话说,您的窗口
和脚本
是伙伴
因此,要从脚本中引用窗口
,请使用以下任何一项:
this.f('loginModal').setHeight(“500px”);
这个.f().loginModal.setHeight(“500px”);
zk.Widget.$(jq(“$loginModal”)[0]).setHeight(“500px”);
而不是:
loginModal.height=500;
编辑2
为了进一步举例说明,下面的JSscript
将使loginModal
的初始高度加倍:
此.f('loginModal').setHeight(“700px”);
您不需要您在Sari awnser的评论中提到的iframe
。
只需在模式窗口中添加一个Composer
<window id="loginModal" ... apply="mypkg.MyComposer">
我的经验告诉我,在zk中避免真正的重定向更好。
这并不奇怪,因为zk是ajax:)
如果您想删除验证页面并在验证调用后添加usermenu
Events.sendEvent("onVerify", loginModal, mydata);
成功后在验证页面的编写器中
,并添加到上面的编写器中
@Listen("onVerify = #loginModal")
public void handelVerification(Event e) {
loginModal.removeChild(loginModal.query("#idOfTopComponentFromVerificationPage"));
Executions.createComponents("/usermenu.zul", loginModal, null);
}
当然,您可以设置loginModal的高度和宽度
<script type="text/javascript">
window.addEventListener('message', receiveMessage, false);
function receiveMessage(evt) {
if (evt.data == 'verification') {
loginModal.height = 500;
}
}
</script>
loginModal.setWidth("100px");
只有一个问题,为什么Iframe叫zul?@chillworld如果我理解你的问题-为什么我用Iframe叫zul?-这是因为在模式中,我想根据情况(用户登录、用户需要验证、登录失败等)重定向到其他zul页面,我希望所有这些都在模式中处理,而不是每次关闭和打开一个新模式。明白了,我将搜索一个没有Iframe的示例。这应该是正常的没有问题(已经有一些想法)好吧,我做了一些测试,就像你说的,我在最后失去了我的原始页面。我会在zk论坛上询问模态窗口的重定向。现在,对于java脚本,在500之后添加px。有时候Zk需要px,有时候也可以不用它。好了,我找到了你的解决方案。(我在这里给出一个答案作为示例)我需要iframe重定向到其他ZUL,而这不适用于include。是否可以使用javascript从zul页面本身调整LoginModel的大小?我已经添加了对我在上面尝试的内容的描述。我尝试了您建议的内容,但收到了错误方法setDefer not found for class org.zkoss.zul.Window。当我删除defer=“true”并运行它时,我得到一个javascript错误,$f不是一个函数。我也尝试了$w,但也出现了同样的错误。我想这是因为我调用的是javascript标记内部的函数,而不是zscript。window.addEventListener和receiveMessage函数在zscip中不起作用。谢谢@Sari HH我做了更改,但我仍然收到错误“this.$f不是函数”并且没有调整大小:(编辑:我仍然需要使用此方法定义事件队列吗?请查看我的第二个编辑.widget.$f(字符串)是一个JS方法,它在ZK Java API中有一个对应的方法。如果发布/接收消息对您有效,您不需要EventQueue。在您最初的帖子中,您说消息正在到达LoginModel,所以只需替换您的条件语句体。我的错误是,我误读了,并将所有3个都放进去了(我认为这是跨浏览器的事情)。它现在可以工作了,非常感谢!事实上,这是另一个解决方案,当你可以知道重定向或不知道重定向时。我尝试过。我的问题是。用户菜单是用户登录后的登录访问权限。调用此页面时,如果