动态创建的 jQueryUI 微调器不工作

dynamically created jQueryUI spinner not working

Fiddle Example

我在页面上有多个微调器。它们的最小值、最大值和步骤取决于它们自己的微调器的数据属性。我一直在使用这段代码来调用微调器:

function spin(){
$( ".spinner" ).each(function(){
   var self = $(this),
       min = self.data('min'),
       max = self.data('max'),
       step = self.data('step');
   $(this).spinner({
    min: min, 
    max: max,
    step: step,
    icons: {up:"tuparrow",down:"tdownarrow"}
  })
});
}
$(document).ready(function(){    
  spin();
})

但我发现当点击动态创建微调器时,spin() 函数在 after 之后被调用后无法正常工作。谁能知道是什么问题?

 $('button').click(function(){
   var area = $('.area').last(),
   newone = area.clone();
   area.after(newone);
   spin();
 })  

HTML:

<button>Click</button>
<div class="area">
  <input data-max="50" data-step="0.01" data-min="0" class="spinner" type="text" name="width[]">
  <input data-max="20" data-step="0.50" data-min="0" class="spinner" type="text" name="diameter[]">
</div>

根据jQuery的版本,可能是.live()的问题,API的描述见this,总之,听众们只添加一次,任何应用的新元素都没有监听器。

可以使用 .on() 解决此问题(here 是关于它的文档)。

希望对您有所帮助。

此致

是的,克隆有一些问题:

 $('button').click(function(){

   $('.main').append('<div class="area">'+
    '<input data-max="50" data-step="0.01" data-min="0" class="spinner" type="text" name="width[]"/>'+
    '<input data-max="20" data-step="0.50" data-min="0" class="spinner" type="text" name="diameter[]"/>'+
    '</div>');
   spin();
 })    

工作示例:JSFIDDLE

您的代码的问题是您在代码中附加了已经启动的微调器 html 块,并且您正在尝试为该块重新初始化微调器。

所以,你的 var area = $('.area').last() 会导致,

<div class="area">
<span class="ui-spinner ui-widget ui-widget-content ui-corner-all"><input data-max="50" data-step="0.01" data-min="0" class="spinner ui-spinner-input" type="text" name="width[]" aria-valuemin="0" aria-valuemax="50" autocomplete="off" role="spinbutton"><a class="ui-spinner-button ui-spinner-up ui-corner-tr ui-button ui-widget ui-state-default ui-button-text-only" tabindex="-1" role="button" aria-disabled="false"><span class="ui-button-text"><span class="ui-icon tuparrow">▲</span></span>
    </a><a class="ui-spinner-button ui-spinner-down ui-corner-br ui-button ui-widget ui-state-default ui-button-text-only" tabindex="-1" role="button" aria-disabled="false"><span class="ui-button-text"><span class="ui-icon tdownarrow">▼</span></span></a>
    </span>
<span class="ui-spinner ui-widget ui-widget-content ui-corner-all"><input data-max="20" data-step="0.50" data-min="0" class="spinner ui-spinner-input" type="text" name="diameter[]" aria-valuemin="0" aria-valuemax="20" autocomplete="off" role="spinbutton"><a class="ui-spinner-button ui-spinner-up ui-corner-tr ui-button ui-widget ui-state-default ui-button-text-only" tabindex="-1" role="button" aria-disabled="false"><span class="ui-button-text"><span class="ui-icon tuparrow">▲</span></span>
    </a><a class="ui-spinner-button ui-spinner-down ui-corner-br ui-button ui-widget ui-state-default ui-button-text-only" tabindex="-1" role="button" aria-disabled="false"><span class="ui-button-text"><span class="ui-icon tdownarrow">▼</span></span></a>
    </span>
</div>

它已经通过 Spinner 初始化,因此再次重新初始化它不会有任何效果,因为效果已经存在于您的代码部分,从而导致问题。

因此,要防止这种情况发生,只需在克隆元素之前调用微调器的 destroy 事件即可。

$( ".spinner" ).spinner( "destroy" );
var area = $('.area').last()

这是Working Fiddle

P.S

使用它会造成额外的过载,因为您将销毁所有微调器并重新初始化所有微调器。因此,您可以只销毁最后一个微调器,也可以使用 @Ramesh Kotha 在他的回答中发布的建议。