我有以下菜单,可以包含最多约50个项目和两个链接,用户可以使用这些链接导航到上一个或下一个城市。在这个例子中,我只显示了四个地址链接。
<ul id="menu">
<li><a href="/City/0101004H">1</a></li>
<li><a href="/City/0101004I">2</a></li>
<li><a href="/City/0101004J">3</a></li>
<li><a href="/City/0101004K">4</a></li>
</ul>
<a id="prev" href="#"><img width="16" height="16" src="/images/prev.png">Prev</a>
<a id="next" href="#"><img width="16" height="16" src="/images/next.png">Next</a>
我在堆栈溢出方面有一些帮助,并提出了以下代码:
$("#menu").on('click', 'a[href^="/City"]', function(event) {
event.preventDefault();
var prev = $(this).parent().prev().find('a');
var next = $(this).parent().next().find('a');
$('#prev').prop('href', jQuery(prev).prop('href')).prop('title', 'City ' + jQuery(prev).text());
$('#next').prop('href', jQuery(next).prop('href')).prop('title', 'City ' + jQuery(next).text())
});
当我点击其中一个菜单项时,这会将上一个和下一个的href设置为适当的值。它可以工作但不适用于列表中的第一个和最后一个项目。我需要的是:
a)当点击第一个项目时,我希望#prev更改为:
<a id="prev" href="#"><img src="/images/noentry.png"></a>
b)当点击最后一项时,我希望#next改为:
<a id="next" href="#"><img src="/images/noentry.png"></a>
我是否有一种简单的方法可以做到这一点,而无需添加太多额外的代码?
答案 0 :(得分:10)
您可以测试该元素是第一个子元素,还是使用以下内容的最后一个子元素:
$(this).parent().is(":first-child");
$(this).parent().is(":last-child");
如果this
引用了被点击的a
,我们会测试它是第一个链接,还是列表中的最后一个链接,通过测试其父级是否是第一个孩子,或者最后一个孩子,或两者都没有。
此外,您可以将属性对象构造基于这些值:
$("#menu").on('click', 'a', function(event) {
// Prevent link from taking us anywhere
event.preventDefault();
// We'll be referencing the parent numerous times
var parent = $(this).parent();
// Determine the new properties of the PREV link
var prev = parent.is(":first-child")
? { html: '<img src="/images/noentry.png" />',
title: null }
: { html: '<img src="/images/prev.png" /> Prev',
title: 'City ' + parent.prev().text() } ;
// Determine the new properties of the NEXT link
var next = parent.is(":last-child")
? { html: '<img src="/images/noentry.png" />',
title: null }
: { html: '<img src="/images/next.png" /> Next',
title: 'City ' + parent.next().text() } ;
// Set new attribtes of both PREV and NEXT
$("#prev").attr( prev );
$("#next").attr( next );
});
您可以根据需要进一步构建#prev
和#next
元素的属性。
答案 1 :(得分:1)
如果元素elt
是其中的第一个兄弟姐妹,则$(elt).prev().length
将为0
。
如果元素elt
是其最后一个兄弟,$(elt).next().length
将是0
。
答案 2 :(得分:1)
您可以将jQuery对象长度检查为零并相应地执行操作:
$("#menu").on('click', 'a[href^="/City"]', function(event) {
event.preventDefault();
var pHref, nHref, pTitle, nTitle;
var prev = $(this).parent().prev().find('a');
var next = $(this).parent().next().find('a');
if (prev.length == 0) {
pHref = "#";
pTitle = "";
} else {
pHref = prev.prop('href');
pTitle = prev.prop('City' prev.text());
}
if (next.length == 0) {
nHref = "#";
nTitle = "";
} else {
nHref = next.prop('href');
nTitle = next.prop('City' prev.text());
}
$('#prev').prop('href', pHref).prop('title', pTitle);
$('#next').prop('href', nHref).prop('title', nTitle)
});
或者带有本地功能的小清洁工来完成这项工作:
("#menu").on('click', 'a[href^="/City"]', function(event) {
function setProps(targetSelector, srcObject) {
var href, title;
if (srcObject.length) {
href = srcObject.prop('href');
title = srcObject.prop('title');
} else {
href = "#";
title = "";
}
$(targetSelector).prop('href', href).prop('title', title);
}
event.preventDefault();
var p = $(this).parent();
setProps('#prev', p.prev().find('a'));
setProps('#next', p.next().find('a'));
});
答案 3 :(得分:1)
另一种方法是使用索引或属性:
var index = 0;
var nElements = $('#menu a').length;
$('#menu a').click(function(e) {
e.preventDefault();
index = $(this).parents('ul').find('a').index(this);
if (index==0) {
$('#prev img').attr('src', '/images/noentry.png');
}
if (index==nElements-1) {
$('#next img').attr('src', '/images/noentry.png');
}
alert(index);
});
$('#prev').click(function() {
index = (index - 1) % nElements;
$('#menu a').eq(index).click();
});
$('#next').click(function() {
index = (index + 1)% nElements;
$('#menu a').eq(index).click();
});