plone/jquery - 当表单作为弹出式覆盖打开时,是什么导致 javascript 不起作用?

plone/jquery - When a form is opened as a popup overlay, what is causing javascript to not work?

我有一个敏捷内容类型,其中包括行为 plone.app.event.dx.behaviors.IEventBasic。

在浏览器视图页面中,我有一个在单击 link 时打开的表单,使用资源文件夹中 javascript 文件中的 jquery:

jquery(function($){

   ....
   $(".openCT").prepOverlay(
         {
             subtype: 'ajax',
             filter: '#content>*',
             formselector: '#content-core > form',
             noform: 'reload',
             closeselector: '[name="form.buttons.cancel"]',
         }
     );
    ....     
});

表单打开,但 jquery/javascript 相关的任何内容都不起作用。 特别是 whole_day 不起作用,因为当 whole_day 设置为 True 时,显示小时和分钟的 "time components" 不会隐藏。是否需要包含一些内容,以便 jquery/javascript 可以在弹出窗口覆盖中工作?

编辑: 我的表格是 dexterity.AddForm:

class Add(dexterity.AddForm):
    grok.name('my.product.tevent')

    def updateWidgets(self):
        super(Add,self).updateWidgets()
        if 'a_param' in self.request.form.keys():

            #set default value of start date, which is a tuple built from data obtained from a_param
            self.widgets['IEventBasic.start'].value = (a_year,a_month,a_day,an_hour,a_min,a_timezone)
            #start-> hour,min are 0,0 / end -> hour, min are 23,59

任何正在看这个的人,请注意这个答案是针对 Plone 4 的。3.x。弹出窗口在 Plone 5+ 中的处理方式不同。

单击 link 或按钮时,

Ajax 叠加层将插入到 DOM 中。因此,新元素没有任何 jQuery 事件附加到它们(除非 jQuery 事件添加了 'live' 机制,每次 DOM 更改时重新附加事件)。

因此,您需要重新运行 任何 JS 初始化代码以将事件附加到新的 DOM 元素。您可以通过向覆盖配置添加一个 onLoad 事件来做到这一点:

$(".openCT").prepOverlay({
    subtype: 'ajax',
    ...
    config: {
        onLoad: function () {
            // js code to attach events to new DOM elements
    }}
...
});

加载并显示叠加层后将触发此事件。因此,新元素在 DOM 中可用。 "config" 中可能包含的项目记录在 jQueryTools docs.