0

我在 html 页面中有一个带有 id="a" 的选择元素(例如)。我有一个名为 f() 的函数。当我写

$("#a").on("change",f);

它有效,这意味着每次我更改下拉列表中的选定值时,都会调用函数 f()。

我想将此选择克隆到页面的另一个位置。我有这个代码:

var oldSelect=$("#a")
var newSelect=oldSelect[0].cloneNode(true);
newSelect.id="b";
$("#b").on("change",f);

当我更改新下拉列表中的选定值时,不会调用函数 f() 。

我尝试使用 chrome 的 devTools 对其进行调试,发现 $("#a") 是一种数组长度 1 ,它首先具有选择本身。但是 $("#b") 没有包含选择本身的“0”属性。

有谁知道为什么会这样?如何克隆一个包含所有选项和回调的选择元素?

4

1 回答 1

2

尽管您克隆了现有的#a,但您尚未在显示的代码中将其插入到文档中,因此$("#b")不会给您任何元素作为回报。在使用 选择它之前插入它$,例如:

$(container).append(newSelect);
$("#b").on("change",f);

container要将新元素附加到的元素在哪里<select>

或者直接将监听器添加到元素中,而不是再次选择它:

var newSelect=oldSelect.clone(true);
newSelect
  .prop('id', 'b')
  .on("change",f)
  .appendTo(container);

(请注意,在上面,newSelect是一个 jQuery 集合,而不是一个 HTMLSelectElement。)

const f = () => console.log('change');

var oldSelect = $("#a");
oldSelect.on("change",f);

var newSelect = oldSelect.clone(true);
newSelect
  .prop('id', 'b')
  .on("change", f)
  .appendTo('#container');
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div id="container">
  <select id="a">
    <option>Option A</option>
    <option>Option B</option>
  </select>
</div>

于 2020-03-10T08:10:21.643 回答