jQuery 1.8.0-min语法错误,无法识别的表达式

时间:2012-08-31 08:04:48

标签: jquery jquery-selectors

我有一个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并不富裕,所以任何人都可以解决一些问题吗?

2 个答案:

答案 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');