我有一个jQuery星级评级,与jQuery 1.7.2完美配合,但在使用jQuery 1.8.0时返回语法错误。这是脚本:
/* ====== STAR RATING ========= */
jQuery(".stars.active a.star").hover(
function(){
var elemID = jQuery(this).parent('.stars').attr('id');
elemID = elemID.replace('id-', '');
if (od_readCookie('voted-'+elemID) == 'TRUE') {
jQuery(this).siblings('.ty').html('You already voted.');
} else {
var theClass = jQuery(this).attr('class');
theClass = theClass.match(/^s[0-9]/);
var starNum = theClass[0].replace('s', '');
var allClasses = '';
for(i=1;i<=starNum;i++) {
allClasses += ' .s'+i+', ';
}
jQuery(this).parent('.stars').children('.star').addClass('nogold');
jQuery(this).parent('.stars').children(allClasses).addClass('hover');
}
},
function(){
var elemID = jQuery(this).parent('.stars').attr('id');
elemID = elemID.replace('id-', '');
if (od_readCookie('voted-'+elemID) == 'TRUE') {
jQuery(this).siblings('.ty').html('');
} else {
jQuery(this).parent('.stars').children('.star').removeClass('nogold');
jQuery(this).parent('.stars').children('.star').removeClass('hover');
}
}
);
// actually add the rating
jQuery(".stars.active a.star").click(function(){
var elemID = jQuery(this).parent('.stars').attr('id');
elemID = elemID.replace('id-', '');
if (od_readCookie('voted-'+elemID) != 'TRUE') {
var theClass = jQuery(this).attr('class');
theClass = theClass.match(/^s[0-9]/);
var starNum = theClass[0].replace('s', '');
// keep the marking while rating updating
var allClasses = '';
for(i=1;i<=starNum;i++) {
allClasses += ' .s'+i+', ';
}
jQuery(this).parent('.stars').children('.star').addClass('nogold_voted');
jQuery(this).parent('.stars').children(allClasses).addClass('hover_voted');
jQuery(this).siblings('.ty').load('/od/wp-admin/admin-ajax.php?action=od_add_vote&id='+elemID+'&rating='+starNum);
}
});
我对jQuery并不富裕,所以任何人都可以解决一些问题吗?
答案 0 :(得分:0)
好的,我想我找到了。此代码导致问题:
var allClasses = '';
for(i=1;i<=starNum;i++) {
allClasses += ' .s'+i+', ';
}
jQuery(this).parent('.stars').children('.star').addClass('nogold');
jQuery(this).parent('.stars').children(allClasses).addClass('hover');
这个
var allClasses = '';
for(i=1;i<=starNum;i++) {
allClasses += ' .s'+i+', ';
}
jQuery(this).parent('.stars').children('.star').addClass('nogold_voted');
jQuery(this).parent('.stars').children(allClasses).addClass('hover_voted');
在这两种情况下,allClasses
变量以结尾处的逗号结尾,因此最终选择器类似于.s0.s1,.s2,s3,s4,
jQuery 1.7中可接受的内容,但在1.8 +中不起作用。
所以解决方案是在每次循环后从变量中删除最后一个逗号:allClasses = allClasses.slice(0, -1)
。
所以你最终会得到这样的东西:
var allClasses = '';
for(i=1;i<=starNum;i++) {
allClasses += ' .s'+i+', ';
}
allClasses = allClasses.slice(0, -1);
jQuery(this).parent('.stars').children('.star').addClass('nogold');
jQuery(this).parent('.stars').children(allClasses).addClass('hover');
和
var allClasses = '';
for(i=1;i<=starNum;i++) {
allClasses += ' .s'+i+', ';
}
allClasses = allClasses.slice(0, -1);
jQuery(this).parent('.stars').children('.star').addClass('nogold_voted');
jQuery(this).parent('.stars').children(allClasses).addClass('hover_voted');
答案 1 :(得分:0)
您可以通过向所有明星元素添加 s 类来简化代码并避免选择器问题。
然后很容易选择所有:
// keep the marking while rating updating
jQuery(this).parent('.stars').children('.star').addClass('nogold_voted');
jQuery(this).parent('.stars').children('.s').addClass('hover_voted');