我在运行时生成了一些HTML,我想知道如何使插件能够在新创建的HTML上运行。我有一些看起来像这样的东西:
<input type="text" class="SomeClass">
<div id="Test"></div>
<script>
function Start() {
setTimeout(function () {
$('#Test').html('<input type="text" class="SomeClass">');
}, 1000);
}
$(".SomeClass").SomePlugin();
$(Start);
</script>
输入元素具有插件的所有功能,但是当我在Test div中添加HTML时,其中的输入元素不能按预期工作。如何在动态生成的HTML上使用插件?
感谢。
答案 0 :(得分:1)
要使插件使用新创建的元素,您需要在这些元素上初始化插件才能使其正常工作。有几种方法可以做到这一点,例如在添加新元素时再次调用它。
如果您只是想避免更改代码并添加它,您可以覆盖jquery html以检查是否要使用SomeClass添加元素并自动调用它的插件:
(function($)
{
var oldhtml = $.fn.html; //store old function
$.fn.html = function() //override html function
{
var ret = oldhtml.apply(this, arguments); // apply jquery html
if(arguments.length){
if(ret.find(".SomeClass").length){
ret.find(".SomeClass").SomePlugin(); // call plugin if the html included an element with .SomeClass
}
}
return ret;
};
})(jQuery);
$.fn.SomePlugin = function() {
$("body").append("plugin activated <br/>");
}
function Start() {
setTimeout(function() {
$('#Test').html('<input type="text" class="SomeClass">');
$('#Test').html()
}, 1000);
}
$(".SomeClass").SomePlugin();
$(Start);
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input type="text" class="SomeClass">
<div id="Test"></div>
&#13;
答案 1 :(得分:0)
我选择了一个使用jQuery承诺的解决方案。这是Fiddle
HTML(你的基本副本):
<input type="text" class="SomeClass">
<div id="Test"></div>
Javascript:
$.fn.SomePlugin = function(){
$(this).val("plugin activated");
}
function Start() {
alert('hi from start');
$('#Test').html('<input type="text" class="SomeClass">');
return $.when();
}
$(document).ready(function(){
Start().then(function () {
alert('hi from done');
$(".SomeClass").SomePlugin();
});
});
我遇到了一些问题(开始)所以我选择了document.ready方法。唯一真正的区别是Start返回$ .when (SO Post Here)并在调用start之后链接'then'。这允许页面设置,然后您可以运行所需的任何插件,并确保在插件尝试操作它们之前所需的元素在DOM中。