服务器端回调函数解决JS-CF执行顺序依赖?

时间:2010-08-10 19:07:50

标签: javascript ajax coldfusion

我想将表单称为弹出窗口(带有一些输入字段和提交按钮的表单),然后从会话中读取用户选择的结果。问题是JS代码(弹出窗口)与CF(服务器端)代码的混合(如预期的那样)会导致进程在进程更新之前输出会话变量。为了更好地理解,下面是场景以及一些相关的代码片段:

情景:

       1. User calls ShowForm(..)
       2. ShowForm(..) displays a pop-up window and waits for the user
to submit his selection
       3. The result gets stored in the session
       4. The function returns the user-submitted result

form.cfc

    <cffunction name="ShowForm" access="public" output="true" returntype="string">

        <script>
         window.showModalDialog('formpage.cfm',null,"dialogHeight=400px,dialogLeft=150px"); 
    </script>

        <cfreturn session.form_result> <!--- @toFix: The return of form_result is happening before the actual form_result is set. ---> 
   </cffunction>

formpage.cfm

    <cfajaxproxy cfc="components.sess_mgr" jsclassname="JSMaskProxy">


    <script>
    function submitSelection(formObj)
    {

     for (i=0; i<intSelValue.length; i++)
      result.push(intSelValue[i]);

       var instCfProxy = new JSMaskProxy();                 
      instCfProxy.setToSession(result);     // updates session.form_result
      //window.returnValue=result;  
      window.close();
    }
    </script>

     <form name="frmDtls">
        <td align="center"><input type="button" id="selectButton" name="selectButton" onClick="submitSelection(details);">
     </form>

你对此有何看法?如何解决这个问题呢?

ColdFusion.navigate(..)函数可以有一个回调函数和一个错误处理程序,但问题是回调函数只能是客户端函数。如果该函数可能是CF函数或可能是服务器端页面,我认为这将解决这种依赖性问题。

有些东西,理想情况下我希望从window.showModalDialog读取值而不是从会话中读取它,但这只是一个草图,这里的要点是如何克服这个JS-CF混合问题。

2 个答案:

答案 0 :(得分:1)

而不是使用window.showModalDialog使用cfwindow,jQuery对话框或extjs窗口。所有这些都有某种形式的回调或事件监听器。 cfwindow有一个onHide函数,jQuery对话框有一个close选项,可以为其分配一个函数,ext.window有onHide,以及事件监听器。

所有这些都允许您打开一个新的“窗口”并在隐藏或关闭窗口时运行某些功能。这些函数应该都可以从窗口访问任何东西,并且能够访问主窗口。

Ray Camden有一个cfwindow示例:http://www.coldfusionjedi.com/index.cfm/2008/9/26/Ask-a-Jedi-Another-CFWINDOW-Example

jQuery对话框中有一个例子:http://jqueryui.com/demos/dialog/#modal-form

Sencha的Ext.Window示例显示关闭对话框时将值传递到主窗口:http://dev.sencha.com/deploy/dev/examples/message-box/msg-box.html

那里有很多选择。我希望他们有所帮助。

答案 1 :(得分:0)

问题解决了!

采用的解决方案基于Stephen Moretti的想法,即用cfwindow调用替换window.showModalDialog。仅这一点并不能解决问题。但是,我在用cfscript替换脚本标签时工作,然后在cfscript中我只是使用cfwindow标签对服务器端进行重定向。