jquery - 多个id的Ajax函数,减少冗余
问题描述
我有点困惑为什么这些功能不一样。简而言之,我有 6 个选项卡(每个都有唯一的 id),每个选项卡都执行基本相同的 ajax 调用(将数据显示到选项卡中的 div 中)。我目前将它们写成 6 个不同的 ajax 函数。
作为单独的功能,它们按预期工作。但是,如果我尝试创建一个通用函数并将其附加到 6 个 id 上,它就不起作用。
以下是按预期工作的六个功能。
$("#hwTab1").click(function () {
$("#hwTab1Tab, #hwTab2Tab, #hwTab3Tab, #hwTab4Tab, #hwTab5Tab, #hwTab6Tab").hide();
$('#hwTab1Tab').show();
$.when(
$.get('/api/sitecore/HwTabsWrapper/HwTabsWrapperCtrl?Tab=HwTab1&pv=/Views/Components/_HwTabsWrapperCtrl.cshtml', function (data3) {
$('#hwTab1Content').html(data3);
})
);
});
$("#hwTab2").click(function () {
$("#hwTab1Tab, #hwTab2Tab, #hwTab3Tab, #hwTab4Tab, #hwTab5Tab, #hwTab6Tab").hide();
$('#hwTab2Tab').show();
$.when(
$.get('/api/sitecore/HwTabsWrapper/HwTabsWrapperCtrl?Tab=HwTab2&pv=/Views/Components/_HwTabsWrapperCtrl.cshtml', function (data) {
$('#hwTab2Content').html(data);
})
);
});
$("#hwTab3").click(function () {
$("#hwTab1Tab, #hwTab2Tab, #hwTab3Tab, #hwTab4Tab, #hwTab5Tab, #hwTab6Tab").hide();
$('#hwTab3Tab').show();
$.when(
$.get('/api/sitecore/HwTabsWrapper/HwTabsWrapperCtrl?Tab=HwTab3&pv=/Views/Components/_HwTabsWrapperCtrl.cshtml', function (data3) {
$('#hwTab3Content').html(data3);
})
);
});
$("#hwTab4").click(function () {
$("#hwTab1Tab, #hwTab2Tab, #hwTab3Tab, #hwTab4Tab, #hwTab5Tab, #hwTab6Tab").hide();
$('#hwTab4Tab').show();
$.when(
$.get('/api/sitecore/HwTabsWrapper/HwTabsWrapperCtrl?Tab=HwTab4&pv=/Views/Components/_HwTabsWrapperCtrl.cshtml', function (data3) {
$('#hwTab4Content').html(data3);
})
);
});
$("#hwTab5").click(function () {
$("#hwTab1Tab, #hwTab2Tab, #hwTab3Tab, #hwTab4Tab, #hwTab5Tab, #hwTab6Tab").hide();
$('#hwTab5Tab').show();
$.when(
$.get('/api/sitecore/HwTabsWrapper/HwTabsWrapperCtrl?Tab=HwTab5&pv=/Views/Components/_HwTabsWrapperCtrl.cshtml', function (data3) {
$('#hwTab5Content').html(data3);
})
);
});
$("#hwTab6").click(function () {
$("#hwTab1Tab, #hwTab2Tab, #hwTab3Tab, #hwTab4Tab, #hwTab5Tab, #hwTab6Tab").hide();
$('#hwTab6Tab').show();
$.when(
$.get('/api/sitecore/HwTabsWrapper/HwTabsWrapperCtrl?Tab=HwTab6&pv=/Views/Components/_HwTabsWrapperCtrl.cshtml', function (data3) {
$('#hwTab6Content').html(data3);
})
);
});
如您所见,代码中有很多冗余。所以这是我尝试做一个可重用的功能。
$(document).on("click", "#hwTab1, #hwTab2, #hwTab3, #hwTab4, #hwTab5, #hwTab6", function () {
$("#hwTab1Tab, #hwTab2Tab, #hwTab3Tab, #hwTab4Tab, #hwTab5Tab, #hwTab6Tab").hide();
var linkIDtmp = $(this).attr('id');
var linkTmp = "#" + linkIDtmp + "Tab";
$(linkTmp).show();
var divTmp = '#' + linkIDtmp + 'content';
$.when(
$.get('/api/sitecore/HwTabsWrapper/HwTabsWrapperCtrl?Tab=HwTab2&pv=/Views/Components/_HwTabsWrapperCtrl.cshtml', function (data) {
$(divTmp).html(data);
})
);
});
让我感到困惑的是,前 6 个功能有效,而底部功能无效(数据未显示在页面上的 div 中),我已经倾注了它,似乎它“应该”有效,所以有一定是我在这里缺少的一些基本的ajax进程。
感谢您对此的任何建议。
谢谢!
解决方案
在您的第二个示例中,您使用事件委托:
$(document).on("click", "#hwTab1,
您在元素上注册事件侦听器,document
并告诉 jQuery 它应该只在单击发生时才调用事件处理程序"#hwTab1, ...
。this
总是引用事件处理程序在其上注册的元素,这就是元素document
,因为你总是id
对document
.
您需要改用事件目标:
$(document).on("click", "#hwTab1, #hwTab2, #hwTab3, #hwTab4, #hwTab5, #hwTab6",
function (evt) { // add the event parameter here
$("#hwTab1Tab, #hwTab2Tab, #hwTab3Tab, #hwTab4Tab, #hwTab5Tab, #hwTab6Tab").hide();
var linkIDtmp = $(evt.target).attr('id'); // use evt.target instead of this
var linkTmp = "#" + linkIDtmp + "Tab";
$(linkTmp).show();
var divTmp = '#' + linkIDtmp + 'Content';
var tabName = linkIDtmp[0].charAt(0).toUpperCase() + linkIDtmp[0].substr(1,mode.length)
$.get('/api/sitecore/HwTabsWrapper/HwTabsWrapperCtrl?Tab=' + tabName +
'&pv=/Views/Components/_HwTabsWrapperCtrl.cshtml',
function (data) {
$(divTmp).html(data);
})
});
推荐阅读
- python - 目录 Python 中的多个 XML 文件
- php - 会话不能在 Mac 上使用 docker 但在 Windows 上可以使用?
- mysql - 在 'char' 列上使用 != 运算符时未获取具有 NULL 值的元组
- javascript - 如何使用 vanilla JS 将新项目添加到特定位置的对象
- keras - “val_loss”并没有从 inf 得到改善,但损失很好地减少了
- google-chrome - 我可以在 Google Chrome 中将一个域的应用程序缓存复制到另一个域吗
- html - 在视频背景上添加颜色叠加
- bash - Azure 管道 sed 文件
- javascript - MeteorJS - 如何提供静态文件?
- json - 有什么方法可以在内核模块上解析 JSON?