【问题标题】:Select2 not working on generated elements by JS [duplicate]Select2不适用于JS生成的元素[重复]
【发布时间】:2016-11-14 14:32:10
【问题描述】:

我在我的项目中使用Select2。我的问题是select2:selectevent 不适用于 JS 生成的元素。

我已经创建了这个 sn-p,所以你可以测试我说的话。

var i = 0,
		data = [
    	{ 
      	id: 0, 
        text: 'Bob' 
      },
      { 
      	id: 1, 
        text: 'Martin' 
      },
      { 
      	id: 2, 
        text: 'John' 
      }
		];
    $('#in-9').select2({
    	data: data
    });
    
    // Button click event
$('#append').on('click', function () {
	var html = '<p><label for="in-' + i + '">Select2 #' + i + ':</label><br><input id="in-' + i + '" class="in"><br></p>';
  
  // Append HTML to Body
	$('body').append(html);
  
  // Assign data to input
  $('#in-' + i).select2({
  	data: data
  });
  
  // Increase counter
  i++;
	
});

// Trigger "select" on select2 only works in first element.
$('.in').on('select2:select', function() {
	alert('wii');
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<link href="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.3/css/select2.css" rel="stylesheet"/>
<script src="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.3/js/select2.full.js"></script>
<button id="append">Append to Body</button>

<!-- First element -->
<p>
  <label for="in-9'">Select2 #9:</label><br>
  <input id="in-9" class="in"><br>
</p>

您可以在小提琴中看到带有id="in-9" 的HTML 元素是在HTML 中创建的,但是当单击Append to Body 时会调用一个Javascript 函数,并且生成的元素无法像第一个那样触发select2:select 事件.

所以我的问题是,如何在动态生成的元素上调用select2:select 事件?

【问题讨论】:

  • @ZakariaAcharki 和 @DavidR,实际上这不是重复的,因为在那篇文章中他要求初始化动态生成的元素,我要求在它们上触发 select2:select 事件。

标签: javascript jquery html select2


【解决方案1】:

你可以使用jQuery的on()方法!

.on() 方法将事件处理程序附加到当前选定的集合 jQuery 对象中的元素或动态生成的元素

你可以试试这个:

$('body').on('select2:select', '.in', function() {
    alert('wii');
});

看看下面的sn-p:

var i = 0,
		data = [
    	{ 
      	id: 0, 
        text: 'Bob' 
      },
      { 
      	id: 1, 
        text: 'Martin' 
      },
      { 
      	id: 2, 
        text: 'John' 
      }
		];
    $('#in-9').select2({
    	data: data
    });
    
    // Button click event
$('#append').on('click', function () {
	var html = '<p><label for="in-' + i + '">Select2 #' + i + ':</label><br><input id="in-' + i + '" class="in"><br></p>';
  
  // Append HTML to Body
	$('body').append(html);
  
  // Assign data to input
  $('#in-' + i).select2({
  	data: data
  });
  
  // Increase counter
  i++;
	
});

// Trigger "select" on select2 only works in first element.
$('body').on('select2:select', '.in', function() {
	alert('wii');
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<link href="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.3/css/select2.css" rel="stylesheet"/>
<script src="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.3/js/select2.full.js"></script>
<button id="append">Append to Body</button>

<!-- First element -->
<p>
  <label for="in-9'">Select2 #9:</label><br>
  <input id="in-9" class="in"><br>
</p>

希望对你有帮助!

【讨论】:

  • 他应该在回调函数中放什么?也许像$('#in-' + i).select2();这样的东西?
  • 成功了,谢谢。我以为我已经尝试过类似的方法,但似乎没有。
  • 拜托,很高兴它对你有用!
  • 帮我搞定了!
猜你喜欢
  • 1970-01-01
  • 2021-10-19
  • 2017-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多