Java 以编程方式调整zk模态的大小

Java 以编程方式调整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

我有一个名为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%" 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
之间的信息交换

您似乎有两种选择之一:

  • 不要使用iframe,而是使用
  • 使用iframe,但在组范围下定义。使此事件队列对
    loginModal
    iframeLogin
    都可见,并使用它在您拥有的两台台式机之间交换信息
  • 编辑1

    请确保:

  • 客户端名称空间通过插入
    xmlns:w=”http://www.zkoss.org/2005/zk/client“
    进入您的
    窗口
    标签
  • 通过将
    defer=“true”
    插入
    script
    标记,在创建所有小部件后,将对JS代码进行评估
  • 在第二个JS代码段中,
    这个
    引用了
    脚本
    小部件本身。您的
    窗口
    脚本
    在同一个窗口中共存。换句话说,您的
    窗口
    脚本
    是伙伴

    因此,要从
    脚本中引用
    窗口
    ,请使用以下任何一项:

    this.f('loginModal').setHeight(“500px”);
    这个.f().loginModal.setHeight(“500px”);
    zk.Widget.$(jq(“$loginModal”)[0]).setHeight(“500px”);
    
    而不是:

    loginModal.height=500;
    
    编辑2

    为了进一步举例说明,下面的JS
    script
    将使
    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个都放进去了(我认为这是跨浏览器的事情)。它现在可以工作了,非常感谢!事实上,这是另一个解决方案,当你可以知道重定向或不知道重定向时。我尝试过。我的问题是。用户菜单是用户登录后的登录访问权限。调用此页面时,如果