【问题标题】:Chained method calls doesn't work on original nor cloned element, why?链式方法调用不适用于原始元素或克隆元素,为什么?
【发布时间】:2016-11-14 15:12:42
【问题描述】:

我有以下 HTML:

<input type="text" id="condition_value_1" style="display: none" />    
<button id="showme">Make Select2</button>
<button id="clickme">Make Input</button>

然后看看下面的jQuery:

$(function() {
  var cond1 = $('#condition_value_1');
  var cloned_cond1 = cond1.clone();
  var cond1_select = '<select name="condition_value_1" id="condition_value_1" multiple="multiple"><option></option><option value="1">Opt1</option><option value="2">Opt2</option></select>';

  $('#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');
  });
});

你可以试试上面的代码HERE

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

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

这个想法是在元素之间切换并按需打开/关闭属性。

也许我在这里遗漏了一些东西,但我不确定是什么。有什么可以帮助我的吗?

【问题讨论】:

  • 删除属性不会更新属性.....而是使用show()方法,
  • cond1.replaceWith(cloned_cond1); cond1.removeAttr('style'); 倒退了,不是吗? cloned_cond1.removeAttr('style'); cond1.replaceWith(cloned_cond1);
  • @PranavCBalan 也不起作用
  • @MisterPositive 正在向您显示克隆的元素?因为不适合我
  • 你到底想做什么?这看起来很复杂,我猜可能会更容易。

标签: javascript jquery html dom


【解决方案1】:

Updated fiddle.

我建议使用一个容器,然后将你想要的元素附加到它上面,查看下面的示例。

希望这会有所帮助。

$(function() {
  var cond1 = $('#condition_value_1');
  var cloned_cond1 = cond1.clone();
  var cond1_select = '<select name="condition_value_1" id="condition_value_1" multiple="multiple"><option></option><option value="1">Opt1</option><option value="2">Opt2</option></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();
  });
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<link href="http://cdnjs.cloudflare.com/ajax/libs/select2/3.2/select2.css" rel="stylesheet"/>
<script src="http://cdnjs.cloudflare.com/ajax/libs/select2/3.2/select2.min.js"></script>

<div id="my-container">
  <input type="text" id="condition_value_1" name="condition_1" style="display: none" />
</div>

<button id="showme">Make Select2</button>
<button id="clickme">Make Input</button>

【讨论】:

  • 这不是我想要的,你能把这个答案删掉再看一遍OP吗?
  • 对不起,误会了,也许你可以从这篇文章中删除你的答案(因为我已经标记给管理员要删除,希望他们会删除它)并添加this one
【解决方案2】:

问题在于replaceWith 返回的是 removed 元素,而不是新元素。我建议一条不同的路径:

$(function() {
  var cond1 = $('#condition_value_1');
  var cloned_cond1 = cond1.clone().removeAttr('style');
  var cond1_select = '<select name="condition_value_1" id="condition_value_1" multiple="multiple"><option></option><option value="1">Opt1</option><option value="2">Opt2</option></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 的点击处理程序中,我们替换了HTML,然后得到一个新的$("#condition_value_1") 挂钩。那是因为cond1 不再在 DOM 中,因为您已将其替换为第一行中的 HTML。

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

【讨论】:

  • 对不起,误会了,也许你可以从这篇文章中删除你的答案(因为我已经标记给管理员要删除,希望他们会删除它)并添加this one
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-12-29
  • 2021-12-12
  • 1970-01-01
  • 1970-01-01
  • 2020-09-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多