我有附加了javascript控件的小部件。
如果在窗口小部件管理页面加载时窗口小部件存在,则控件可以正常工作。
当我添加新的小部件时,它们无法正常工作,我得到了标记,但是没有任何JavaScript事件生效。
如果我保存了新的小部件,则在重新加载表单时,控件将正确创建并且可以正常工作。
刷新页面也可以解决此问题,但仅适用于现有窗口小部件。新的小部件仍然存在此问题。
具体来说,我在这些时候对选择输入运行selectize:
- 准备好文件
- Ajaxcomplete
我已经验证我的代码可以按需在每个事件上运行,但是结果却不符合预期。
这是一个演示该问题的测试插件:
https://gist.github.com/Tarendai/8466299
您会看到我有一个计数器,它发现它可以转换的每个select元素都会增加。
笔记:
- 加载小部件页面后,我可以看到JS控制台中的计数器正在按预期方式增加
- 当我添加一个新的小部件时,代码将运行,但是,它找不到能在其上运行的所有选择元素,如found.length为0所示。情况并非如此,因为该类型的每个新小部件都应有一个选择元素
- select元素具有一个用于标识它们的类,一旦应用了selectize库,便会删除该类,以防止对现有小部件进行重复和重新处理。
- 在使用selectize之前,我使用了Select2,它具有相同的问题
- 注释掉AJAX代码,我希望新的小部件具有标准的select输入。他们不。我不知道为什么会这样
那么,如何在不告诉用户在进行更改之前刷新/单击保存的情况下使selectize控件起作用?
jQuery( document ).ajaxStop( function() {
部件的原因,以便可以在新加载的小部件中初始化控件。但是,如果我删除了这一行,我希望新的小部件具有标准的HTML选择输入,但它们不会= s
widget-updated
and widget-added
事件,它的方法是最干净的方法。我还要强调在@michaeljames代码中,元素id的使用#widgets-right
。确保使用它来定位JS代码中的活动窗口小部件元素,否则您可能会得到重复的元素,因为您的代码还可能选择屏幕左侧的隐藏的非活动窗口小部件元素(添加窗口小部件时会被克隆)。
.on()
方法。这需要您将事件绑定到文档。但是,我现在不确定什么事件合适。最终,这是因为您的原始绑定代表了页面加载时DOM的初始版本,并且大多数情况下看不到通过ajax添加的新元素(小部件内容)。希望这会为您指明正确的方向,如果没有,我在工作时可以回答得更好。