我看过很多类似的问题,但它们通常都针对特定选择器。如果我错过了重复的地方,请告诉我。
假设你想为WordPress、Drupal或基本上任何使用第三方功能的网站构建一个jQuery插件。由于事先不知道需要定位哪些特定事件和选择器,你该如何向动态创建的元素添加jQuery/JavaScript功能呢?此外,你也不知道元素是如何创建的(使用ajax/php等回调)。
例如:
最近我尝试将select2或selectize添加到我的整个站点。但是,由于我不能事先确定其他插件/模块中何时会添加select元素,因此无法确保新创建的selects能正常使用jQuery。
Select2
这是正常的方法,但无法用于动态创建或克隆的selects:
<script type='text/javascript'>
jQuery(document).ready(function($) {
$("select").select2();
});
</script>
如果我知道所有添加这些选择器的事件,我只需要执行以下操作:
$( ".some_button_that_creates_new_selects" ).on( "click", function() {
jQuery("select").select2();
});
});
然而,由于我事先不知道所有动态选择器(因为许多是由第三方插件添加的),因此select2无法在新的选择器上工作。所以上述方法只适用于每种情况。
我需要找到一种遍历dom树并识别新选择器创建的方法。
我尝试使用.on针对几个事件进行定位,但效果很差。
我了解到javascript中的document.getElementsByTagName可以识别dom中的更改,并反映在集合中。我还研究了querySelectorAll,但不确定它的确切工作方式。
我还尝试过使用MutationObserver并检查选择标记的addednodes.length是否发生变化,但没有取得实质性进展。
更新:
经过一些测试,我意识到问题可能在于select2插件本身。Select2加载动态选择器但无法获取其位置。Chrome最终会抛出类型错误:无法读取null的属性“find”,无法读取null的属性“hasclass”。
例如将select2插件添加到wordpress中。单击快速编辑会添加新字段。
新选择器无法正确加载,并且单击它们时没有下拉列表。
单击选择器后再单击其下方将错误地加载select2覆盖层。
style="display: block; left: 0px; width: 0px; top: 0px; bottom: auto;
,而通常它应该看起来像这样style="display: block; left: 453.2528381347656px; width: 149px; top: 150.23011016845703px; bottom: auto;
。但是,如果您单击“应该”出现下拉菜单的位置,它会尝试找到其定位,但会出错并将其加载到右侧。 - Bryan Willis