问题描述
我有一些控件附有 javascript 控件。
如果窗口小工具出现在窗口小工具管理页面加载时,控件正常工作。
当我添加一个新的小工具时,它们无法正常工作,我得到了标记,但没有 javascript 事件生效。
如果我保存新的小工具,当表单重新加载时,控件将被正确创建,现在可以正常工作。
刷新页面也会解决问题,但仅适用于现有的小工具。新的小工具还有这个问题。
具体来说,我在这些点上选择输入选择:
-
文件准备好了
-
Ajaxcomplete
我已经验证了我的代码是按照需要在每个事件上运行的,但结果并不如预期。
这是一个测试插件,演示了这个问题:
https://gist.github.com/Tarendai/8466299
你会看到我有一个计数器增加与每个选择元素,它发现它可以转换。
笔记:
-
当小工具页面加载时,我可以按预期在 JS 控制台中看到计数器增加
-
当我添加一个新的小工具时,代码是运行的,但是,找不到可以运行的任何 select 元素,如 found.length 为 0 所示。不应该是这样,因为每一个新的 widget 都应该有一个选择元素
-
选择元素有一个类来标识它们,一旦应用选择库来防止重复,并且现有的小工具上的 re-processing 就会被删除。
-
在使用 selectize 之前,我使用了 Select2,它有同样的问题
-
注释 AJAX 代码,我希望新的小工具具有标准的选择输入。他们不。我不知道为什么会这样
那么如何使选择控制工作没有告诉用户在进行更改之前刷新/单击保存?
最佳解决方案
好消息,
我已经修复了
抱歉,在我的初始评论中错过你的想法,并给出你已经实施的答案。在火车上,我会教我在手机上回答
你使用 ajaxstop 是正确的。大多数情况下,JS 的地狱工作正常,您可以看到正在初始化的 css 样式和 DOM 中的更改。
问题在于你的选择器。
这是因为小工具内容没有通过 ajax 加载,实际上它从隐藏的左侧列中克隆,然后触发 ajax 调用以将小工具的位置保存在右侧列中。这就解释了为什么 ajaxstop 工作,即使想到的内容被克隆。但是,由于左侧栏中有一个隐藏版本的小工具,您的 JS 正在实例化。因此,当您将其拖动到右侧列时,您将收到隐藏的小工具的破碎的克隆。
因此,您需要在左侧选择一个。以下是更正的代码:
<script>
jQuery( document ).ready( function( $ ) {
function runSelect() {
var found = $( '#widgets-right select.testselectize' );
found.each( function( index, value ) {
$( value ).selectize();
.removeClass( 'testselectize' )
.addClass( 'run-' + window.counter );
console.log( $val );
window.counter++;
} );
}
window.counter = 1;
runSelect();
$( document ).ajaxStop( function() {
runSelect();
} );
} );
</script>
次佳解决方案
作为 @ aaron-holbrook 评论说,一个更清洁的方法将是:
<script>
$(document).on('widget-updated widget-added', function(){
// your code to run
});
</script>
只是粘贴在这里作为参考,答案更容易找到这些评论
参考文献
注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。