Javascript 不触发动态加载的表单和脚本
Javascript not firing with dynamically loaded form and scripts
我正在通过 .ajax
将表单和随附的 JS 脚本加载到模式中,但 JS 没有按预期触发或初始化元素。 (没有任何反应)HTML 和脚本在其他地方按预期工作,除非通过 ajax 加载到模式中。
以下是我使用 Promise 加载内容的方式,以确保仅在 HTML 加载后才加载脚本。任何我可能出错的地方?
$(document).on('click', '#post-offer', function() {
$.when(
$('head').append('<link rel="stylesheet" href="' + baseURL + '/css/jquery-ui.css">'),
$('head').append('<link rel="stylesheet" href="' + baseURL + '/css/jquery.tagit.css">'),
$('head').append('<link rel="stylesheet" href="' + baseURL + '/slim/slim.min.css">'),
$.getScript( "//ajax.googleapis.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.js"),
openModal(baseURL + '/ajax.cgi?a=showoffer'), // << THIS IS THE HTML FORM
$.Deferred(function(deferred){
$(deferred.resolve);
})
).done(function(){
$.getScript( "//maps.googleapis.com/maps/api/js?v=3&key=xxxxxxxxxxxxxx"),
$.getScript( baseURL + "/js/tag-it.js" ),
$.getScript( baseURL + "/slim/slim.jquery.js" ),
$.getScript( baseURL + "/js/listing.js" );
});
});
为了完整起见,这里是 openModal 函数(按预期工作):
function openModal(arg) {
$('#loading').show();
if (arg.match(/^http/)) { //If query, then send it.
var $query = arg;
$.ajax({
url: $query,
success: function(result) {
$('#modalWrap').show();
$('#modalContent').html(result);
$('#loading').hide();
},
error: function(xhr) {
$("#loading").hide();
alert('Communication error! [Details: ' + xhr.status + ' - ' + xhr.statusText + ']');
}
});
} else { //Or just return the input argument
$('#modalWrap').show();
$('#modalContent').html(arg);
$('#loading').hide();
};
};
尝试将其替换为您的 openModal
函数:
function openModal(arg) {
return new Promise((resolve, reject) => {
$("#loading").show();
if (arg.match(/^http/)) {
//If query, then send it.
var $query = arg;
$.ajax({
url: $query,
success: function (result) {
$("#modalWrap").show();
$("#modalContent").html(result);
$("#loading").hide();
resolve();
},
error: function (xhr) {
$("#loading").hide();
alert(
"Communication error! [Details: " +
xhr.status +
" - " +
xhr.statusText +
"]"
);
reject()
},
});
} else {
//Or just return the input argument
$("#modalWrap").show();
$("#modalContent").html(arg);
$("#loading").hide();
resolve();
}
});
}
如果单独这样做没有帮助,请在添加上面的代码后将 done
替换为:
done(function () {
window.requestAnimationFrame(() => {
$.getScript("//maps.googleapis.com/maps/api/js?v=3&key=xxxxxxxxxxxxxx");
$.getScript(baseURL + "/js/tag-it.js");
$.getScript(baseURL + "/slim/slim.jquery.js");
$.getScript(baseURL + "/js/listing.js");
});
});
以下是我为遇到此问题的其他人解决此问题的方法。
这不是加载问题。所有脚本和 HTML 加载正常。问题是其中一个动态加载的脚本 listing.js
有一个 document.ready()
包装器,它没有触发,因为 DOM 已经加载,所以 dynamically-loaded 表单上的 JS 元素没有' 正在初始化。但是,当我删除 document.ready()
时,它仍然没有初始化 dynamically-loaded 元素。
为了解决这个问题,我将 document.ready()
更改为一个函数 initialize()
并从 dynamically-loaded HTML 调用最后一个函数。现在一切正常:
//DYNAMICALLY LOADED SCRIPT FIRST
function initialize(){
//INITIALIZE JS FORM ELEMENTS...
}
然后,在同一个 AJAX 调用中:
<form class="dynamically-loaded-HTML">
<!-- FORM ELEMENTS -->
</form>
<script>
initialize();
</script>
我正在通过 .ajax
将表单和随附的 JS 脚本加载到模式中,但 JS 没有按预期触发或初始化元素。 (没有任何反应)HTML 和脚本在其他地方按预期工作,除非通过 ajax 加载到模式中。
以下是我使用 Promise 加载内容的方式,以确保仅在 HTML 加载后才加载脚本。任何我可能出错的地方?
$(document).on('click', '#post-offer', function() {
$.when(
$('head').append('<link rel="stylesheet" href="' + baseURL + '/css/jquery-ui.css">'),
$('head').append('<link rel="stylesheet" href="' + baseURL + '/css/jquery.tagit.css">'),
$('head').append('<link rel="stylesheet" href="' + baseURL + '/slim/slim.min.css">'),
$.getScript( "//ajax.googleapis.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.js"),
openModal(baseURL + '/ajax.cgi?a=showoffer'), // << THIS IS THE HTML FORM
$.Deferred(function(deferred){
$(deferred.resolve);
})
).done(function(){
$.getScript( "//maps.googleapis.com/maps/api/js?v=3&key=xxxxxxxxxxxxxx"),
$.getScript( baseURL + "/js/tag-it.js" ),
$.getScript( baseURL + "/slim/slim.jquery.js" ),
$.getScript( baseURL + "/js/listing.js" );
});
});
为了完整起见,这里是 openModal 函数(按预期工作):
function openModal(arg) {
$('#loading').show();
if (arg.match(/^http/)) { //If query, then send it.
var $query = arg;
$.ajax({
url: $query,
success: function(result) {
$('#modalWrap').show();
$('#modalContent').html(result);
$('#loading').hide();
},
error: function(xhr) {
$("#loading").hide();
alert('Communication error! [Details: ' + xhr.status + ' - ' + xhr.statusText + ']');
}
});
} else { //Or just return the input argument
$('#modalWrap').show();
$('#modalContent').html(arg);
$('#loading').hide();
};
};
尝试将其替换为您的 openModal
函数:
function openModal(arg) {
return new Promise((resolve, reject) => {
$("#loading").show();
if (arg.match(/^http/)) {
//If query, then send it.
var $query = arg;
$.ajax({
url: $query,
success: function (result) {
$("#modalWrap").show();
$("#modalContent").html(result);
$("#loading").hide();
resolve();
},
error: function (xhr) {
$("#loading").hide();
alert(
"Communication error! [Details: " +
xhr.status +
" - " +
xhr.statusText +
"]"
);
reject()
},
});
} else {
//Or just return the input argument
$("#modalWrap").show();
$("#modalContent").html(arg);
$("#loading").hide();
resolve();
}
});
}
如果单独这样做没有帮助,请在添加上面的代码后将 done
替换为:
done(function () {
window.requestAnimationFrame(() => {
$.getScript("//maps.googleapis.com/maps/api/js?v=3&key=xxxxxxxxxxxxxx");
$.getScript(baseURL + "/js/tag-it.js");
$.getScript(baseURL + "/slim/slim.jquery.js");
$.getScript(baseURL + "/js/listing.js");
});
});
以下是我为遇到此问题的其他人解决此问题的方法。
这不是加载问题。所有脚本和 HTML 加载正常。问题是其中一个动态加载的脚本 listing.js
有一个 document.ready()
包装器,它没有触发,因为 DOM 已经加载,所以 dynamically-loaded 表单上的 JS 元素没有' 正在初始化。但是,当我删除 document.ready()
时,它仍然没有初始化 dynamically-loaded 元素。
为了解决这个问题,我将 document.ready()
更改为一个函数 initialize()
并从 dynamically-loaded HTML 调用最后一个函数。现在一切正常:
//DYNAMICALLY LOADED SCRIPT FIRST
function initialize(){
//INITIALIZE JS FORM ELEMENTS...
}
然后,在同一个 AJAX 调用中:
<form class="dynamically-loaded-HTML">
<!-- FORM ELEMENTS -->
</form>
<script>
initialize();
</script>