链式方法调用对原始元素或克隆元素不起作用,为什么?

我有以下HTML:

   

然后看看下面的jQuery:

 $(function() { var cond1 = $('#condition_value_1'); var cloned_cond1 = cond1.clone(); var cond1_select = 'Opt1Opt2'; $('#showme').click(function() { cond1.removeAttr('style').replaceWith(cond1_select).select2({ placeholder: 'Select choice' }); }); $('#clickme').click(function() { if ($('#condition_value_1').hasClass('select2-hidden-accessible')) { $("#condition_value_1").select2('destroy'); } $('#condition_value_1').replaceWith(cloned_cond1).removeAttr('style'); }); }); 

您可以尝试上面的代码。

现在,一旦你单击#showme你应该删除attr样式,用给定的元素替换原始元素并将其转换为Select2,最后一部分不起作用。

另一方面,如果单击#clickme ,则应该销毁先前的Select2,将#condition_value_1替换为克隆元素并删除attr样式,因为克隆具有该属性,但这也不起作用。

我们的想法是在元素之间切换,并根据需要打开/关闭属性。

也许我在这里遗漏了一些东西,但我不确定是什么。 能帮到我吗?

问题是replaceWith返回被删除的元素,而不是新元素。 我建议一条不同的道路:

 $(function() { var cond1 = $('#condition_value_1'); var cloned_cond1 = cond1.clone().removeAttr('style'); var cond1_select = ''; $('#showme').click(function() { cond1.replaceWith(cond1_select); $("#condition_value_1").select2({ placeholder: 'Select choice' }); cond1 = $("#condition_value_1"); }); $('#clickme').click(function() { if ($('#condition_value_1').hasClass('select2-hidden-accessible')) { $("#condition_value_1").select2('destroy'); } $('#condition_value_1').replaceWith(cloned_cond1); cond1 = $('#condition_value_1'); }); }); 

请注意,我在更换任何内容之前已从克隆中删除了该属性; 这样,你不必担心它。

showme请注意,在showme单击处理程序中,我们替换HTML,然后获取$("#condition_value_1")的新挂钩。 那是因为cond1不再在DOM中,因为你已经用第一行的HTML替换了它。

同样,在clickme单击处理程序中,您需要重置cond1的值以匹配新的HTML。

更新小提琴

我建议使用容器然后附加你想要的元素,请查看下面的示例。

希望这可以帮助。

 $(function() { var cond1 = $('#condition_value_1'); var cloned_cond1 = cond1.clone(); var cond1_select = ''; $('#showme').click(function() { $("#my-container").html(cond1_select); $("#condition_value_1").select2({placeholder: 'Select choice',width:'100%'}); }); $('#clickme').click(function() { if ($('#condition_value_1').hasClass('select2-hidden-accessible')) { $("#condition_value_1").select2('destroy'); } $("#my-container").html(cloned_cond1); $("#condition_value_1").show(); }); });