У меня есть звездная рейтинговая система в стиле Netflix/Amazon. Таким образом, звезды временно загораются при наведении мыши, и предполагается, что щелчок вызовет вызов PHP и постоянное изменение цвета звезды.

Все работает, хотя событие onClick не срабатывает до второго клика. Похоже, это связано с тем, что событие onMouseOver все еще активируется до тех пор, пока не встретит завершающее действие (onMouseOut или щелчок).

Я видел подобные вопросы, но нет ответов по существу.

Благодарность!

function rate(img_name,action,headlineid,userid,rating) {
        var baseurl='http://www.mysite.com/images/';
    var imgoff='atcstar3.gif';
        var imghover='atcstar.gif';
        var imgon='atcstar.gif';
    imgname=img_name;
        hid=headlineid;
var current=document.getElementById(img_name).src;
        var star=img_name.replace(hid+'-star','');


       switch (action) {
                case 'hover':
                                for (i=1;i<=star;i++) {
                                        document.getElementById(hid+'-star'+i).src=baseurl+imghover;
                               }
                        break;

                case 'click':
                        if (current!=baseurl+imgon) {
                                for (i=1;i<=star;i++) {
                                        document.getElementById(hid+'-star'+i).src=baseurl+imgon;
                                }

                                current=baseurl+imgon;

                                xmlHttp=GetXmlHttpObject()
                                if (xmlHttp==null)
                                 {
                                 alert ("Browser does not support HTTP Request")
                                 return
                                 }

                                if (getCookie("votes")=="") {
                                  setCookie("votes",hid+'-'+star,3);
                                } else {
                                        votes=getCookie("votes")
                                        votes=votes+","+hid+'-'+star
                                        setCookie("votes",votes,3);
                                }


                                var url="rate.php?";
                                url=url+"headlineid="+hid;
                                url=url+"&userid="+userid;
                                url=url+"&rating="+star;
                                url=url+"&sid="+Math.random();
                        xmlHttp.onreadystatechange=stateChangedRateStory;
                                xmlHttp.open("GET",url,true);
                                xmlHttp.send(null);
                        newrank=star;




                        } else {
                            document.getElementById(img_name).src=baseurl+imgoff;
                                current=baseurl+imgoff;
                        }
                        break;
                case 'out':

                        if (current!=baseurl+imgon || (newrank!=star && rating<star)) {
                              for (i=5;i>=rating+1;i--) {
                                        //document[hid+'-star'+i].src=baseurl+imgoff;
                                        document.getElementById(hid+'-star'+i).src=baseurl+imgoff;
                                }
                        }

                        break;
        }
}
1
Scott Lay 24 Авг 2009 в 07:17
1
Как насчет того, чтобы показать нам свой код?
 – 
Cleiton
24 Авг 2009 в 07:30
Пробовал добавить return true. Возможно, мне просто нужно разделить функции (одна функция обрабатывает три события, а переключатель их сортирует).
 – 
Scott Lay
24 Авг 2009 в 07:39

2 ответа

Всякий раз, когда мне нужно, чтобы отображение менялось при наведении курсора мыши, я обычно предпочитаю вместо этого использовать CSS element:hover.

1
RichN 24 Авг 2009 в 07:32
Как и я, но я заставляю его контролировать внешний вид других объектов (звезды ниже, чем тот, над которым парят), и изменение внешнего вида является условным (независимо от того, был ли ранее подан голос). Я не думаю, что смогу сделать это с помощью CSS.
 – 
Scott Lay
24 Авг 2009 в 07:41

Попробуйте вернуть событие onMouseOver true.

0
helloandre 24 Авг 2009 в 07:21