为什么我不能在JQuery中选择一个加载了$.get的元素
Why can I not select an element loaded with $.get in JQuery
我有一系列从JSON加载的按钮,这些按钮在单击时会消失并附加其他按钮。
像这样(第一级按钮已经在页面上,并对悬停等其他事件做出正确反应):
...
$(document).on('click', "#subcategoryButtons button", function () {
getTemplate('imgMenu.html');
var entryIndex = this.id[0];
var subentryIndex;
if (this.id[1] === '0')
{
subentryIndex = this.id.slice(-1);
}
else
{
subentryIndex = this.id.slice(-2);
}
var imgs = data.category[entryIndex].subcategory[subentryIndex].imgs;
$.each(imgs, function (imgIndex)
{
var imgName = data.category[entryIndex].subcategory[subentryIndex].imgs[imgIndex].imgName;
var imgId = data.category[entryIndex].subcategory[subentryIndex].imgs[imgIndex].imgId;
$('#imgButtons span').append('<button id="' + imgId + '">' + imgName + '</button>');
});
});
}
;
...
这是正在加载的模板的内容:
<div id="imgSpace">
<aside id="overlayRight">
Right Overlay space
</aside>
<div id="overlayBottom">
Bottom Overlay
</div>
</div>
<nav id="imgButtons" class="resizable">
<span></span>
</nav>
这是getTemplate代码:
function getTemplate(templateUrl)
{
$.get('templates/' + templateUrl, function (content)
{
if (templateUrl === 'leftMenu.html')
{
$('#leftMenu').html(content);
}
else
{
$('#main').html(content);
}
});
}
尽管它应该将按钮附加到#imgButtons跨度,但它似乎无法选择刚刚加载的模板中的任何元素。如果我试图将按钮附加到页面的另一部分(比如最近没有加载的左菜单),或者我只是在主菜单中清除HTML,而不是获得模板,那么附件就可以工作了。因此,问题似乎在于如何选择已加载的元素。如有任何帮助,我们将不胜感激。
感谢所有为我指明正确方向的人。最后我没有使用Ajax,而是推迟了
$(document).on('click', "#subcategoryButtons button", function () {
var entryIndex = this.id[0];
var subentryIndex;
if (this.id[1] === '0') {
subentryIndex = this.id.slice(-1);
} else {
subentryIndex = this.id.slice(-2);
}
var imgs = data.category[entryIndex].subcategory[subentryIndex].imgs;
$('main').html('');
$.get("templates/imgMenu.html", function (content)
{
$('#main').html(content);
}).done(function () {
$.each(imgs, function (imgIndex) {
var imgName = data.category[entryIndex].subcategory[subentryIndex].imgs[imgIndex].imgName;
var imgId = data.category[entryIndex].subcategory[subentryIndex].imgs[imgIndex].imgId;
console.log(entryIndex);
$('#imgButtons span').append('<button id="' + imgId + '">' + imgName + '</button>');
});
});
});
}
;
您使用了错误的选择器#imgButtons button
应该是#imgButtons span
来选择#imgButtons
中的跨度
此外,你的模板是异步加载的,所以你必须等待它被加载(通过回调函数)才能操作它
$(document).on('click', "#subcategoryButtons button", function () {
getTemplate('imgMenu.html', callback);
function callback(){
var entryIndex = this.id[0];
var subentryIndex;
if (this.id[1] === '0')
{
subentryIndex = this.id.slice(-1);
}
else
{
subentryIndex = this.id.slice(-2);
}
var imgs = data.category[entryIndex].subcategory[subentryIndex].imgs;
$.each(imgs, function (imgIndex)
{
var imgName = data.category[entryIndex].subcategory[subentryIndex].imgs[imgIndex].imgName;
var imgId = data.category[entryIndex].subcategory[subentryIndex].imgs[imgIndex].imgId;
$('#imgButtons span').append('<button id="' + imgId + '">' + imgName + '</button>');
});
}
});
...
function getTemplate(templateUrl, callback)
{
$.get('templates/' + templateUrl, function (content)
{
if (templateUrl === 'leftMenu.html')
{
$('#leftMenu').html(content);
}
else
{
$('#main').html(content);
}
callback();
});
}
让我们对您的代码进行一些修改,使用promises
-ajax方法返回的jqxhr对象实现了promise接口,因此您可以使用它。
function getTemplate(templateUrl)
{
return $.get('templates/' + templateUrl, function (content)
{
if (templateUrl === 'leftMenu.html')
{
$('#leftMenu').html(content);
}
else
{
$('#main').html(content);
}
});
}
以这种方式使用
$(document).on('click', "#subcategoryButtons button", function (e) {
getTemplate('imgMenu.html').then(function () {
var entryIndex = this.id[0];
var subentryIndex;
if (this.id[1] === '0') {
subentryIndex = this.id.slice(-1);
} else {
subentryIndex = this.id.slice(-2);
}
var imgs = data.category[entryIndex].subcategory[subentryIndex].imgs;
$.each(imgs, function (imgIndex) {
var imgName = data.category[entryIndex].subcategory[subentryIndex].imgs[imgIndex].imgName;
var imgId = data.category[entryIndex].subcategory[subentryIndex].imgs[imgIndex].imgId;
$('#imgButtons span').append('<button id="' + imgId + '">' + imgName + '</button>');
});
});
});
相关文章:
- 有没有办法在tinymceiframe中加载一个外部javascript文件
- 在npm中加载一个包的多个版本
- 你能加载一个带有JS超时的PHP包吗
- laravel中的ajax会重新加载一个空白页面
- 如何加载一个html页面并在其中只需单击一次即可运行函数
- 选中复选框时仅重新加载一个DIV
- 加载一个html或JavaScript文件作为iframe源
- 有没有一种方法可以重新加载一个函数而不是整个页面
- 使用requirejs加载一个包含多个类的文件(grunt-concat)
- 加载一个js图像
- 如何加载一个文件夹中可用的脚本文件,而不是加载HTML文件
- 如何生成一个唯一的链接,该链接将加载一个会话,其中包含客户端可用的某些文档
- 加载一个大型 JavaScript 文件与多个整体大小较小的较小文件的性能
- 是否可以从本地主机加载一个特定文件
- 加载一个附加的 JavaScript 的新 URL,然后将更多 JS 附加到该新 URL
- Jquery UI Tabs 在 javascript 中重新加载一个选项卡
- 如何在 Angular 中的 url 更改时仅重新加载一个控制器
- 在当前页面中加载一个新的谷歌地图,加载AJAX
- YouTube API 视频结束加载一个函数
- 我的网站正在加载一个我不知道的外部 JS.我能做什么