У меня есть iframe, который содержит следующее:
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div id="my_container"></div>
<script>
$.ajax({
type: 'post',
dataType: 'json',
contentType: 'application/json',
url: 'some_url',
success: function(data, status, xhr) {
console.log(data.html); // <div><link href='https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.6-rc.0/css/select2.min.css' rel='stylesheet'><script src='https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.6-rc.0/js/select2.min.js'></script><script> $('.input-select2').select2();</script><select class='input-select2'></select></div>
$('#my_container').html(data.html);
},
});
</script>
Как вы видите, скрипт внутри iframe извлекает строку HTML / js из внешнего ресурса и добавляет ее к #my_container
. Вытащенный HTML / JS:
<div>
<link href='https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.6-rc.0/css/select2.min.css' rel='stylesheet'>
<script src='https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.6-rc.0/js/select2.min.js'></script>
<script>
$('.input-select2').select2();
</script>
<select class='input-select2'></select>
</div>
Но когда запускаются добавленные сценарии, я получаю следующую ошибку:
Uncaught TypeError: $(...).select2 is not a function
Так что, очевидно, функция select2
выполняется до загрузки библиотеки. Если я переместу библиотеку select2.min.js
на один уровень выше библиотеки jquery.min.js
, все будет работать отлично. Или, если я оберну свою select2
функцию в setTimeout(function(){ ... }, 20);
, она тоже будет работать.
Так что я могу сделать?