ну не знаю, мне кажется что человеку который реально хорошо знает JS и тд, будет очень легко такой скрипт вставить куда угодно, исполнен отличным мастером который как профессор раскрывал инсайд тему скрипта. прекрасно осознавая что кто-то потом еще будет его читать и возможно многое оттуда узнает. Однако у скрипта не хватает нескольких компонентов, а именно обработки и бд =)
вот такой еще скриптик нашел http://helper.ucoz.ru/load/dir/rejting_ ... s/7-1-0-47 но он заточен чисто под чьето двигло и совершенно не ясно как его привязывать
Да я уже попытался свою написать, видать не давно. я хочу попробывать лепровский освоить =) Для того чтобы чтобы свой писать надо мутить нормальные книжки по яве и джакве а потом еще их изучать, это слишком долго, темболее что пока мне в этих вопросах так много надо. лучше давайте попробуем вместе раскрыть тему голосовалки лепры
Появился первый вопрос, WTF? <script type="text/javascript"> mythingsHandler.wtf = '25818f734a3eb6d259cc4ed92675ffc4'; </script>
вроде обкарнал лепровский код, осталось <script src="http://vtrigazety.ru/golosovanie/common.js?rev=127" type="text/javascript" charset="UTF-8"></script> <script src="http://vtrigazety.ru/golosovanie/voting.js?rev=121" type="text/javascript" charset="UTF-8"></script> не могу понять что за запрос такой посылает код с скрипту что ответом идет "нет такого действия" PHP: <?php define('INCLUDE_CHECK',true); require 'connect.php'; if ($_GET['value']=='-1'){ $safe_topic=mysql_escape_string($_POST['moto_cutnum']); $sSQL="UPDATE blogposts SET ball= ball -1 WHERE id=".$_GET['id']; mysql_query($sSQL) or die(mysql_error()); } elseif ($_GET['value']=='1'){ $safe_topic=mysql_escape_string($_POST['moto_cutnum']); $sSQL="UPDATE blogposts SET ball= ball +1 WHERE id=".$_GET['id']; mysql_query($sSQL) or die(mysql_error()); } else { echo "нет такого действия"; } ?> из подгруженный скриптов common [js]/***************************** ** Misc functions ******************************/ function $(id){ return document.getElementById(id); } function addStyleProperties(cssStr){ var head = document.getElementsByTagName('head')[0]; var styleSheets = head.getElementsByTagName('style'); var styleSheet = null; if (styleSheets.length){ styleSheet = styleSheets[styleSheets.length-1]; } else { styleSheet = document.createElement("style"); styleSheet.setAttribute("type", "text/css"); head.appendChild(styleSheet); } if(styleSheet.styleSheet){ // IE styleSheet.styleSheet.cssText += cssStr; } else { // w3c styleSheet.appendChild(document.createTextNode(cssStr)); } } /***************************** ** Event listeners ******************************/ function checkEvent(oEvt){ oEvt=(oEvt) ? oEvt : ( (window.event) ? window.event : null ); if(oEvt && oEvt.srcElement && !window.opera) oEvt.target=oEvt.srcElement; return oEvt; } function addEvent(objElement, strEventType, ptrEventFunc) { if (objElement.addEventListener) objElement.addEventListener(strEventType, ptrEventFunc, false); else if (objElement.attachEvent) objElement.attachEvent('on' + strEventType, ptrEventFunc); } function removeEvent(objElement, strEventType, ptrEventFunc) { if (objElement.removeEventListener) objElement.removeEventListener(strEventType, ptrEventFunc, false); else if (objElement.detachEvent) objElement.detachEvent('on' + strEventType, ptrEventFunc); } /***************************** ** Common class methods ******************************/ function switchClass( objNode, strCurrClass, strNewClass ) { if ( matchClass( objNode, strNewClass ) ) replaceClass( objNode, strCurrClass, strNewClass ); else replaceClass( objNode, strNewClass, strCurrClass ); } function removeClass( objNode, strCurrClass ) { replaceClass( objNode, '', strCurrClass ); } function addClass( objNode, strNewClass ) { replaceClass( objNode, strNewClass, '' ); } function replaceClass( objNode, strNewClass, strCurrClass ) { var strOldClass = strNewClass; if ( strCurrClass && strCurrClass.length ){ strCurrClass = strCurrClass.replace( /\s+(\S)/g, '|$1' ); if ( strOldClass.length ) strOldClass += '|'; strOldClass += strCurrClass; } objNode.className = objNode.className.replace( new RegExp('(^|\\s+)(' + strOldClass + ')($|\\s+)', 'g'), '$1' ); objNode.className += ( (objNode.className.length)? ' ' : '' ) + strNewClass; } function matchClass( objNode, strCurrClass ) { return ( objNode && objNode.className.length && objNode.className.match( new RegExp('(^|\\s+)(' + strCurrClass + ')($|\\s+)') ) ); } function getAncestorByClassName( oCurrentElement, sClassName, sTagName ) { var oCurrent = oCurrentElement.parentNode; while ( oCurrent.parentNode ) { if ( matchClass( oCurrent, sClassName ) && ( !sTagName || oCurrent.tagName.toLowerCase() == sTagName.toLowerCase() ) ) return oCurrent; oCurrent = oCurrent.parentNode; } } function getElementsByClassName(objParentNode, strNodeName, strClassName){ var nodes = objParentNode.getElementsByTagName(strNodeName); if(!strClassName){ return nodes; } var nodesWithClassName = []; for(var i=0; i<nodes.length; i++){ if(matchClass( nodes, strClassName )){ //nodesWithClassName.push(nodes); nodesWithClassName[nodesWithClassName.length] = nodes; } } return nodesWithClassName; } function getElementsByClassNameFirstLevel(objParentNode, strNodeName, strClassName){ var nodes = objParentNode.getElementsByTagName(strNodeName); if(!strClassName){ nodesFirstLevel = []; for(var i=0; i<nodes.length; i++){ if(nodes.parentNode.parentNode == objParentNode){ nodesFirstLevel.push(nodes); } } return nodesFirstLevel; } var nodesWithClassNameFirstLevel = []; for(var i=0; i<nodes.length; i++){ if(matchClass(nodes, strClassName) && nodes.parentNode.parentNode == objParentNode){ nodesWithClassNameFirstLevel.push(nodes); } } return nodesWithClassNameFirstLevel; } /***************************** ** Some other methods ******************************/ function getPageY( oElement ) { var iPosY = oElement.offsetTop; while ( oElement.offsetParent != null ) { oElement = oElement.offsetParent; iPosY += oElement.offsetTop; if (oElement.tagName == 'BODY') break; } return iPosY; } function getPageX( oElement ) { var iPosX = oElement.offsetLeft; while ( oElement.offsetParent != null ) { oElement = oElement.offsetParent; iPosX += oElement.offsetLeft; if (oElement.tagName == 'BODY') break; } return iPosX; } function getMousePosition(e) { if (e.pageX || e.pageY){ var posX = e.pageX; var posY = e.pageY; }else if (e.clientX || e.clientY) { var posX = e.clientX + document.body.scrollLeft + document.documentElement.scrollLeft; var posY = e.clientY + document.body.scrollTop + document.documentElement.scrollTop; } return {xosX, yosY} } /***************************** ** AJAX ******************************/ /* url - откуда загружаем ajaxCallBackFunction - что вызываем по завершении загрузки callObject - методом какого объекта является ajaxCallBackFunction (если это метод, а не глобальная фунция) params - параметры в виде объекта или массива ajaxCallBackErrorFunction - необязательная функция, обрабатывающая ошибки соединения */ function ajaxLoad(url, ajaxCallBackFunction, callObject, params, ajaxCallBackErrorFunction) { // branch for native XMLHttpRequest object if (window.XMLHttpRequest) { var ajaxObject = new XMLHttpRequest(); ajaxObject.onreadystatechange = function(){ ajaxLoadHandler(ajaxObject, ajaxCallBackFunction, callObject, params, ajaxCallBackErrorFunction); } ajaxObject.open("GET", url, true); ajaxObject.send(null); // branch for IE/Windows ActiveX version } else if (window.ActiveXObject) { var ajaxObject = new ActiveXObject("Microsoft.XMLHTTP"); if (ajaxObject) { ajaxObject.onreadystatechange = function(){ ajaxLoadHandler(ajaxObject, ajaxCallBackFunction, callObject, params, ajaxCallBackErrorFunction); } ajaxObject.open("GET", url, true); ajaxObject.send(); } } } function ajaxLoadHandler(ajaxObject, ajaxCallBackFunction, callObject, params, ajaxCallBackErrorFunction){ // only if req shows "complete" if (ajaxObject.readyState == 4) { // only if "OK" if (ajaxObject.status == 200) { // ...processing statements go here... ajaxCallBackFunction.call(callObject, ajaxObject, params); } else { $A(document.getElements('.js-loading')).each(function (loading_el) { $(loading_el).removeClass('js-loading'); }); if ($('reply_form')) { if ($('comments-form') && $('comments-form').elements['i']) { $('comments-form').elements['i'].value = '0'; } if ($('comment_textarea')) { $('comment_textarea').set({'readonly':''}); } if ($('reply_form').getElement('.comments_form_loading')) { $('reply_form').getElement('.comments_form_loading').addClass('hidden'); } } if(ajaxCallBackErrorFunction){ ajaxCallBackErrorFunction.call(callObject, ajaxObject, params); } else { try { alert("There was a problem retrieving the data:\n" + ajaxObject.statusText); } catch(err) { alert("There was a problem retrieving the data."); } } } } } function ajaxLoadPost(url, data, ajaxCallBackFunction, callObject, params, ajaxCallBackErrorFunction) { var ajaxObject = null; if (window.XMLHttpRequest) { // branch for native XMLHttpRequest object ajaxObject = new XMLHttpRequest(); } else if (window.ActiveXObject) { // branch for IE/Windows ActiveX version var ajaxObject = new ActiveXObject("Microsoft.XMLHTTP"); } if(ajaxObject){ ajaxObject.onreadystatechange = function(){ ajaxLoadHandler(ajaxObject, ajaxCallBackFunction, callObject, params, ajaxCallBackErrorFunction); } ajaxObject.open("POST", url, true); ajaxObject.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); ajaxObject.setRequestHeader("Content-length", data.length); ajaxObject.setRequestHeader("Connection", "close"); ajaxObject.send(data); } } /* Class inheritance */ Function.prototype.inheritFrom = function(BaseClass) { // thanks to Kevin Lindsey for this idea var Inheritance = function() {}; Inheritance.prototype = BaseClass.prototype; this.prototype = new Inheritance(); this.prototype.constructor = this; this.baseConstructor = BaseClass; this.superClass = BaseClass.prototype; } if(!Function.prototype.call) { // emulating 'call' function for browsers not supporting it (IE5) Function.prototype.call = function() { var oObject = arguments[0]; var aArguments = []; var oResult; oObject.fFunction = this; for (var i = 1; i < arguments.length; i++) { aArguments[aArguments.length] = 'arguments[' + i + ']'; } eval('oResult = oObject.fFunction(' + aArguments.join(',') + ')'); oObject.fFunction = null; return oResult; } };[/js] и voting.js [js]function initVoting(type, parentElementId){ var voteBlocks = getElementsByClassName($(parentElementId), 'div', 'vote'); if(voteBlocks.length == 0) return; switch (type){ case "posts": VoteBlock.type = VoteBlock.typePost; VoteBlock.theChoiceElement = $('vote_choice'); VoteBlock.initChoiceElements(); for (var i=0; i<voteBlocks.length; i++){ new VoteBlock(voteBlocks); } break; case "comments": VoteBlock.type = VoteBlock.typeComment; for (var i=0; i<voteBlocks.length; i++){ new VoteBlockComments(voteBlocks); //initShrink(voteBlocks.parentNode); } break; case "lepraposts": VoteBlock.type = VoteBlock.typePost; for (var i=0; i<voteBlocks.length; i++){ new VoteBlockComments(voteBlocks); } break; default: break; } } function initShrink(parent){ if(getElementsByClassName(parent, 'a', 'show_link').length == 0) return; var showLink = getElementsByClassName(parent, 'a', 'show_link')[0]; showLink.onclick = function (){ removeClass(this.parentNode.parentNode.parentNode, 'shrinked'); return false; } } /* Класс VoteBlock (для голосования с плюсом и лопатой) ***************************************************************/ function VoteBlock(htmlObj){ this.htmlObj = htmlObj; // контейнер, содержащий все элементы голосования if (getElementsByClassName(this.htmlObj, 'a', 'plus').length == 0){ return; } this.htmlObjChildren = this.htmlObj.getElementsByTagName('*'); this.htmlGlobalParent = htmlObj.parentNode.parentNode; // родительский контейнер всего поста //this.htmlGlobalParent = htmlObj.parentNode; // родительский контейнер this.plusBtn = getElementsByClassName(this.htmlObj, 'a', 'plus')[0]; // контейнер с кнопкой + this.minusBtn = getElementsByClassName(this.htmlObj, 'a', 'minus')[0]; // контейнер с кнопкой - this.rating = getElementsByClassName(this.htmlObj, 'span', 'rating')[0].firstChild; // контейнер с рейтингом this.htmlObj.obj = this; this.plusBtn.obj = this; this.minusBtn.obj = this; this.rating.obj = this; this.voteType = VoteBlock.type; this.initChoiceEvents(); } // Статическое свойство VoteBlock.theChoiceElement VoteBlock.theChoiceElement = {}; // html контейнер с элементами выбора, перемещаемый по дереву документа (всегда имеет родителем this.htmlGlobalParent) VoteBlock.theChoiceElement.elements = []; // массив всех элементов списка VoteBlock.theChoiceElement VoteBlock.theChoiceElement.currentObj = {}; // ссылка на объект класса VoteBlock, внутри которого сейчас находится VoteBlock.theChoiceElement VoteBlock.urlVoting = "http://vtrigazety.ru/post.php"; // url при голосовании + - VoteBlock.type = ""; VoteBlock.typeComment = 0; // для указания, что голосуем по комментам VoteBlock.typePost = 1; // для указания, что голосуем по постам VoteBlock.wtf = ""; // // Статический метод, инициализирующий объект VoteBlock.theChoiceElement и все его элементы VoteBlock.initChoiceElements = function(){ VoteBlock.theChoiceElement.elements = VoteBlock.theChoiceElement.getElementsByTagName('a'); for (var i=0; i<VoteBlock.theChoiceElement.elements.length; i++){ VoteBlock.theChoiceElement.elements.onclick = function(){ if(matchClass(this, 'voted')){ return false; } else { var currentObj = VoteBlock.theChoiceElement.currentObj; var postId = currentObj.htmlGlobalParent.getAttribute('id').substring(1); var choiceValue = this.getAttribute('choiceValue'); var url = VoteBlock.urlVoting + "&type=" + this.obj.voteType + "&id=" + postId + "&value=" + choiceValue; currentObj.setChoiceVoted(choiceValue); // отрисовываем выбранный элемент addClass(currentObj.htmlGlobalParent, 'loading'); // ставим прелоадер ajaxLoad(url, currentObj.onLoad, currentObj); // отправляем/получаем данные return false; } } } } VoteBlock.prototype.initChoiceEvents = function (){ this.htmlObj.onmouseout = function(e){ if(!e) e = window.event; this.obj.hideChoice(e); } // Кнопка + this.plusBtn.onmouseover = function(e){ if(!e) e = window.event; this.obj.hideChoice(e, this); } this.plusBtn.onclick = function(){ this.blur(); if(matchClass(this, 'voted')){ return false; } else { var postId = this.obj.htmlGlobalParent.getAttribute('id').substring(1); var choiceValue = 1; var url = VoteBlock.urlVoting + "&type=" + this.obj.voteType + "&id=" + postId + "&value=" + choiceValue; this.obj.setChoiceVoted(null); addClass(this, 'voted'); // отмечаем сделанный выбор addClass(this.obj.htmlGlobalParent, 'loading'); // ставим прелоадер ajaxLoad(url, this.obj.onLoad, this.obj); // отправляем/получаем данные return false; } } // Кнопка - this.minusBtn.onmouseover = function(){ this.obj.showChoice(); // отвратительный хак против IE6- (заставляет не скакать правую колонку) if(typeof document.body.style.maxWidth == 'undefined' && $('content_right_inner')){ $('content_right_inner').style.display = "none"; $('content_right_inner').style.display = "block"; } } this.minusBtn.onclick = function(){ this.blur(); return false; } } // Отрисовка блока VoteBlock.theChoiceElement VoteBlock.prototype.showChoice = function(){ if (typeof VoteBlock.theChoiceElement == 'undefined') return; VoteBlock.theChoiceElement.currentObj = this; // создаем ссылку на новый родительский объект у VoteBlock.theChoiceElement addClass(VoteBlock.theChoiceElement.currentObj.htmlGlobalParent, 'inuse'); // располагаем htmlGlobalParent поверх отсальных this.showChoiceVoted(); // отрисовываем текущий голосованный элемент this.htmlObj.appendChild(VoteBlock.theChoiceElement); VoteBlock.theChoiceElement.style.display = 'block'; } VoteBlock.prototype.hideChoice = function(e, obj){ if (typeof VoteBlock.theChoiceElement == 'undefined') return; // если mouseover на кнопке "плюс", скрываем чойс бокс if(obj && matchClass(obj, "plus")){ addClass(this.htmlGlobalParent, 'inuse'); // располагаем htmlGlobalParent поверх отсальных VoteBlock.theChoiceElement.style.display = 'none'; return; } // если элемент, на который передвигаем мышь, лежит внутри чойс блока, выходим if (e.relatedTarget) { var where = e.relatedTarget; if (where == this.htmlObj) return; if (where.nodeType == 3) where = where.parentNode; for(var i=0; i<this.htmlObjChildren.length; i++){ if (where == this.htmlObjChildren) { return; } } } else if (e.toElement && this.htmlObj.contains(e.toElement)) { return; } removeClass(this.htmlGlobalParent, 'inuse'); // снимаем свойство с htmlGlobalParent лежать поверх отсальных VoteBlock.theChoiceElement.style.display = 'none'; } // Отрисовка пункта, за который проголосовали, в списке элементов VoteBlock.theChoiceElement VoteBlock.prototype.showChoiceVoted = function (){ var currentChoiceValue = this.minusBtn.getAttribute('choiceValue'); for (var i=0; i<VoteBlock.theChoiceElement.elements.length; i++){ var currentElement = VoteBlock.theChoiceElement.elements; if (currentElement.getAttribute('choiceValue') == currentChoiceValue){ addClass(currentElement, 'voted'); } else { removeClass(currentElement, 'voted'); } } } // Установка нового выбранного значения в списке элементов VoteBlock.theChoiceElement VoteBlock.prototype.setChoiceVoted = function(choiceMinusValue){ this.minusBtn.setAttribute('choiceValue', choiceMinusValue); if(matchClass(this.plusBtn, 'voted')) { removeClass(this.plusBtn, 'voted'); } this.showChoiceVoted(); } VoteBlock.prototype.onLoad = function (ajaxObj){ var newRating = ajaxObj.responseText; this.rating.innerHTML = newRating; removeClass(this.htmlGlobalParent, 'loading'); // убираем прелоадер } /* Подкласс VoteBlockComments (для голосования с плюсом и минусом) *************************************************************************/ function VoteBlockComments (htmlObj){ VoteBlockComments.baseConstructor.call(this, htmlObj); } VoteBlockComments.inheritFrom(VoteBlock); VoteBlockComments.prototype.initChoiceEvents = function (){ this.htmlObj.onmouseout = function(e){ if(!e) e = window.event; this.obj.hideChoice(e); } // Кнопка + this.plusBtn.onmouseover = function(e){ return false; } this.plusBtn.onclick = function(){ this.blur(); if(matchClass(this, 'voted')){ return false; } else { var postId = this.obj.htmlGlobalParent.getAttribute('id'); var choiceValue = 1; var url = VoteBlock.urlVoting + "&type=" + this.obj.voteType + "&id=" + postId + "&value=" + choiceValue; addClass(this, 'voted'); // отмечаем сделанный выбор removeClass(this.obj.minusBtn, 'voted') // снимаем отметку о противоположном голосовании addClass(this.obj.htmlGlobalParent, 'loading'); // ставим прелоадер ajaxLoad(url, this.obj.onLoad, this.obj); // отправляем/получаем данные return false; } } // Кнопка - this.minusBtn.onmouseover = function(){ return false; } this.minusBtn.onclick = function(){ this.blur(); if(matchClass(this, 'voted')){ return false; } else { var postId = this.obj.htmlGlobalParent.getAttribute('id'); var choiceValue = -1; var url = VoteBlock.urlVoting + "wtf=" + VoteBlock.wtf + "&type=" + this.obj.voteType + "&id=" + postId + "&value=" + choiceValue; addClass(this, 'voted'); // отмечаем сделанный выбор removeClass(this.obj.plusBtn, 'voted') // снимаем отметку о противоположном голосовании addClass(this.obj.htmlGlobalParent, 'loading'); // ставим прелоадер addClass(this.obj.htmlGlobalParent, 'shrinked'); ajaxLoad(url, this.obj.onLoad, this.obj); // отправляем/получаем данные return false; } return false; } this.rating.onmouseover = function(){ this.obj.showChoice(); } } VoteBlockComments.prototype.showChoice = function(){ addClass(this.htmlGlobalParent, 'inuse'); } VoteBlockComments.prototype.hideChoice = function(e, obj){ // если элемент, на который передвигаем мышь, лежит внутри чойс блока, выходим if (e.relatedTarget) { var where = e.relatedTarget; if (where == this.htmlObj) return; if (where.nodeType == 3) where = where.parentNode; for(var i=0; i<this.htmlObjChildren.length; i++){ if (where == this.htmlObjChildren) { return; } } //e.relatedTarget.style.border = "none"; // странно, но это побороло баг в Opere :/ } else if (e.toElement && this.htmlObj.contains(e.toElement)) { return; } removeClass(this.htmlGlobalParent, 'inuse'); } /* Класс VoteBlockUser (для голосования с 2 плюсами и 2 минусами по юзеру) *************************************************************************/ function initVotingUser (parentObjId){ var parentObj = $(parentObjId); var voteBlocks = parentObj.getElementsByTagName('strong'); if(voteBlocks.length == 0) return; var ratingBlock = getElementsByClassName(parentObj, 'span', 'rating')[0].firstChild; // контейнер с рейтингом for (var i=0; i<voteBlocks.length; i++){ new VoteBlockUser(voteBlocks, ratingBlock); } } function VoteBlockUser(htmlObj, ratingBlock){ this.htmlObj = htmlObj; this.htmlGlobalParent = htmlObj.parentNode.parentNode; // родительский контейнер всего поста this.plusBtn = getElementsByClassName(this.htmlObj, 'a', 'plus')[0]; // контейнер с кнопкой + this.minusBtn = getElementsByClassName(this.htmlObj, 'a', 'minus')[0]; // контейнер с кнопкой - this.rating = ratingBlock; this.htmlObj.obj = this; this.plusBtn.obj = this; this.minusBtn.obj = this; this.rating.obj = this; this.initChoiceEvents(); } VoteBlockUser.urlVoting = "/karma/"; // url при голосовании + - VoteBlockUser.wtf = ""; // VoteBlockUser.prototype.initChoiceEvents = function (){ this.plusBtn.onclick = function(){ this.blur(); if(matchClass(this, 'voted')){ return false; } else { var userId = this.obj.htmlGlobalParent.getAttribute('uid'); var choiceValue = this.getAttribute('choiceValue'); var url = VoteBlockUser.urlVoting; var data = "wtf=" + VoteBlockUser.wtf + "&u_id=" + userId + "&value=" + choiceValue; addClass(this, 'voted'); // отмечаем сделанный выбор removeClass(this.obj.minusBtn, 'voted') // снимаем отметку о противоположном голосовании addClass(this.obj.htmlGlobalParent, 'loading'); // ставим прелоадер ajaxLoadPost(url, data, this.obj.onLoad, this.obj); // отправляем/получаем данные return false; } } this.minusBtn.onclick = function(){ this.blur(); if(matchClass(this, 'voted')){ return false; } else { var userId = this.obj.htmlGlobalParent.getAttribute('uid'); var choiceValue = this.getAttribute('choiceValue'); var url = VoteBlockUser.urlVoting; var data = "wtf=" + VoteBlockUser.wtf + "&u_id=" + userId + "&value=" + choiceValue; addClass(this, 'voted'); // отмечаем сделанный выбор removeClass(this.obj.plusBtn, 'voted') // снимаем отметку о противоположном голосовании addClass(this.obj.htmlGlobalParent, 'loading'); // ставим прелоадер ajaxLoadPost(url, data, this.obj.onLoad, this.obj); // отправляем/получаем данные return false; } return false; } } VoteBlockUser.prototype.onLoad = function (ajaxObj){ var newRating = ajaxObj.responseText; this.rating.innerHTML = newRating; removeClass(this.htmlGlobalParent, 'loading'); // убираем прелоадер } /* Альтернативные функции */ var wtf_vote = null; function vote (linkBtn, post_id){ linkBtn.blur(); if(matchClass(linkBtn, 'voted')) return false; var linkGlobalParent = linkBtn.parentNode.parentNode.parentNode.parentNode; var id = linkGlobalParent.id; var linkParent = linkBtn.parentNode; var rating = getElementsByClassName(linkParent, 'span', 'rating')[0].firstChild; // контейнер с рейтингом var value; var oppositeBtn; var showLink = getElementsByClassName(linkGlobalParent, 'a', 'show_link')[0]; if (matchClass(linkBtn, 'plus')){ value = 1; oppositeBtn = getElementsByClassName(linkParent, 'a', 'minus')[0]; } else { value = -1; oppositeBtn = getElementsByClassName(linkParent, 'a', 'plus')[0]; if(typeof noShrink != 'undefined'){ noShrink(showLink); } //addClass(linkGlobalParent, 'shrinked'); } addClass(linkBtn, 'voted'); // отмечаем сделанный выбор removeClass(oppositeBtn, 'voted') // снимаем отметку о противоположном голосовании addClass(linkGlobalParent, 'loading'); // ставим прелоадер var url = "http://vtrigazety.ru/post.php"; var data = "type=0&wtf=" + wtf_vote + "&id=" + id + "&value=" + value + "&post_id=" + post_id; var params = {r:rating, gp:linkGlobalParent}; ajaxLoadPost(url, data, voteOnLoad, window, params, votePostOnError); // отправляем/получаем данные return false; } function voteOnLoad(ajaxObj, params){ var rating = params.r; var linkGlobalParent = params.gp; var newRating = ajaxObj.responseText; rating.innerHTML = newRating; removeClass(linkGlobalParent, 'loading'); // убираем прелоадер } function showChoice(link){ var linkGlobalParent = link.parentNode.parentNode.parentNode.parentNode; addClass(linkGlobalParent, 'inuse'); } function hideChoice(e, obj){ var objChildren = obj.getElementsByTagName('*'); var objGlobalParent = obj.parentNode.parentNode; // если элемент, на который передвигаем мышь, лежит внутри чойс блока, выходим if (e.relatedTarget) { var where = e.relatedTarget; if (where == obj) return; if (where.nodeType == 3) where = where.parentNode; for(var i=0; i<objChildren.length; i++){ if (where == objChildren) { return; } } //e.relatedTarget.style.border = "none"; // странно, но это побороло баг в Opere :/ } else if (e.toElement && obj.contains(e.toElement)) { return; } removeClass(objGlobalParent, 'inuse'); } function votePost(linkBtn){ linkBtn.blur(); if(matchClass(linkBtn, 'voted')) return false; var linkGlobalParent = linkBtn.parentNode.parentNode.parentNode.parentNode; var id = linkGlobalParent.id; var linkParent = linkBtn.parentNode; var rating = getElementsByClassName(linkParent, 'span', 'rating')[0].firstChild; // контейнер с рейтингом if (matchClass(linkBtn, 'plus')){ value = 1; oppositeBtn = getElementsByClassName(linkParent, 'a', 'minus')[0]; } else { value = -1; oppositeBtn = getElementsByClassName(linkParent, 'a', 'plus')[0]; } addClass(linkBtn, 'voted'); // отмечаем сделанный выбор removeClass(oppositeBtn, 'voted'); addClass(linkGlobalParent, 'loading'); // ставим прелоадер var url = "http://vtrigazety.ru/post.php"; var data = "type=1&wtf=" + wtf_vote + "&id=" + id + "&value=" + value; var params = {r:rating, gp:linkGlobalParent}; ajaxLoadPost(url, data, votePostOnLoad, window, params, votePostOnError); // отправляем/получаем данные return false; } function votePostOnLoad(ajaxObj, params) { var rating = params.r; var linkGlobalParent = params.gp; var newRating = ajaxObj.responseText; rating.innerHTML = newRating; removeClass(linkGlobalParent, 'loading'); // убираем прелоадер removeClass(rating.parentNode, 'js-loading_error'); } function votePostOnError(ajaxObj, params) { alert(ajaxObj.statusText); if (ajaxObj.statusText) { var errorText = (ajaxObj.statusText) ? ' ' + ajaxObj.statusText : ''; } else { var errorText = ''; } addClass(params.r.parentNode, 'js-loading_error'); params.r.title = 'Ошибка в получении данных.' + errorText; removeClass(params.gp, 'loading'); }[/js] дэмо http://vtrigazety.ru/?blog=jquery&novost=1&id=1
в этом коде чего только нету. даже позиция мышки засекается... Давай придумаем структуру БД и дело в шляпе. Останется только накодить. ты точно не хочешь, чтобы были баллы?
вобще конечно хочу чтобы они сразу обновлялись но не думаю что я сам скоро разберусь как это реализовать, я привык действовать поступательно, по порядку, сперва первое, потом второе и тд вот структура бд votings Код (Text): id - порядковый номер position - во что балл записан number - номер поста или коммента point - балл ouner - владелец балла autor - кто поставил балл post Код (Text): id - порядковый номер blog - имя блога поста autor - автор поста ball - сколько балов у поста description - описание поста data - дата публикации up - дата подёма поста title - заголовок поста content - содержимое поста keywords - ключевые слова comments - комментариев vews - просмотров moderation - модерация cat - категория ip - ип comments Код (Text): id - номерация postnumb - номер коммента autor - авторк оммента unswer - чилд(ответ на коммент) ball - балл data - дата ip - ип comment - сам коммент vew - вид коммента user Код (Text): id - номер юзера login - логин mail - почта password - пароль regip - ип при реге dt - дата рега name - ФИО/имя karma - карма posts - число постов comments - число комментов status - статус аккаунда
как обновляться? смотрим на jquery.com аякс в примерах. там есть suxess где ты можешь заменить содержимое голосовалки допустим количеством голосов вот примерно так 1) рисуем из пхп блок голосовалки относящийся к этому посту HTML: <div id='golosovalka_134141414' class='golosovalka'> <a onclick="vote(134141414,'+1');">[+]</a> <a onclick="vote(134141414,'-1');">[-]</a> </div> id для отрисовки действий именно в этом диве. класс для раскрашивания и задания стилей один на все - очень удобно. 2)Чел видит плюсик или минусик и клацает. (чтобы был пальчик над ссылками которые никуда не ведут, можно задать его из css принудительно. http://htmlbook.ru тебе в помощь. http://htmlbook.ru/css/cursor.html 3) при нажатии вызывается процедура vote в которую передаем номер поста ( мы ж когда из пхп его рисовали, знали какой номер? вот и дело в шляпе) и желаемое действие. подчеркну, кто-то может и +100500 пожелать. на данном этапе нас это волновать не должно. 4) в процедуре вызываем через метод jquery ajax (примеры на сайте есть) голосовательный скрипт пхп. для невъебенной крутости предварительно перед этим можно запустить гифчик с бегающими кружочками. взять можно где угодно в этих ваших интернетах. 5) в суксесе аякса мы радостно получаем ответ от вызванного скрипта пхп. Ответ удобно если будет готовым уже к вмонтированию в div golosovalka_134141414. Например такой HTML: <img src="images/палецвверх.png"><span class='green'>112</span> <img src="images/палецвниз.png"><span class='red'>73</span> В итоге волшебным образом получаем красивую картинку и количество голосов за и против - это круче чем общий балл. Короче как на ютубе. Единственное что осталось - накодить это. И накодить голосовательный скрипт. Предлагаю тебе сделать сначала его без всяких проверок на повторные голосования и вобще без заморочек. Когда будет работать так - будешь дальше его защищать уже от террористов.
по базе. в таблице вотингс: что такое позишн? нипанятна что такое овнер и автор? почему разные? зачем это. Давай проще. id, Date, voter - голосующий, vote - signed tinyint, id поста первые два в принципе нах не нужны, но в 2010 году можно не жадничать память в угоду комфорту. Хранить автора поста в голосовалке в принципе не нужно, но можно. Но не нужно. Но можно. Все, дальше не читал, что там хранить про пользователей и посты - дело твое. Все зависит от задачи, никто кроме тебя лучше не сообразит, так что делай как считаешь нужным и не парься. Собственно скрипт пхп голосования при получении запроса на изменение баллов такого-то поста на такое-то колличество баллов чешет репу, решает можно ли или нельзя этому юзеру - можно проверить по вотингс запросив такой-то пост, такого-то голосующего и если он есть - то уже не дать. По хорошему при отрисовке страницы этот же код лезет и если находит запись на такую пару - рисует сразу не голосовалку соотв. а результат. Десяток постов на страницу - это десяток запросов на проверку и десяток запросов на колличество баллов. Ну... Норм. Жить можно. В принципе их можно спихать в один запрос.
ну вот смотри какой камень преткновения <a onclick="vote(134141414,'pluspost');">[+]</a> <a onclick="vote(134141414,'minuspost');">[-]</a> это ничто иное как <a onclick="vote(порядковый номер самого поста или комментария,'реализуемое действие');">[+]</a> что надо написать в <script type="text/javascript"> </script> чтобы данные в script.php можно было получить в виде параметров $_GET['id'] $_GET['action'] где id - порядковый номер самого поста или комментария action - реализуемое действие ?
как что? я ж писал в самом начале топика пример из жукувери смотри блин примеры на сайте жукувери уже. там все элементарно =) чего ты боишься. пробуй больше. спрашивай, когда затык, а не когда нечего пробовать. http://api.jquery.com/jQuery.ajax/ http://api.jquery.com/category/ajax/
мне кажется это подойдет [js]bodyContent = $.ajax({ url: "script.php", global: false, type: "POST", data: ({id : this.getAttribute('id')}), dataType: "html", async:false, success: function(msg){ alert(msg); } } ).responseText;[/js]
вот тебе еще в помощь: PHP: <pre> <?php //начни с такого сприпта print_r($_GET); print_r($_POST); ?> </pre>
да пхп у меня все прекрасно кушает <?php if ($_GET['action']=='minuspost'){ $safe_topic=mysql_escape_string($_POST['moto_cutnum']); $sSQL="UPDATE blogposts SET ball= ball -1 WHERE id=".$_GET['id']; mysql_query($sSQL) or die(mysql_error()); } elseif ($_GET['action']=='pluspost'){ $safe_topic=mysql_escape_string($_POST['moto_cutnum']); $sSQL="UPDATE blogposts SET ball= ball +1 WHERE id=".$_GET['id']; mysql_query($sSQL) or die(mysql_error()); } else { echo "нет такого действия"; } ?> сейчас поставил <script src="http://code.jquery.com/jquery-latest.min.js"></script> вывожу кнопку PHP: <a onclick="vote(<?php echo $line[0];?>,'minuspost');">-</a> сюда что только не вписывал в ответ никакого результата, ребят ну не мучайте меня дайте цельный ответ на такой простой вопрос [js]<script> ????????????????????????????? </script>[/js] урл скрипта обработчика http://vtrigazety.ru/post.php?id=1&action=minuspost получаемые скриптом параметры $_GET['action'] $_GET['id']
test.php: PHP: <?php session_start(); if (isset ($_GET['id']) AND isset ($_GET['action'])) { $id = intval($_GET['id']); switch ($_GET['action']) { case 'pluspost': $action = 1; break; case 'minuspost': $action = -1; break; default: $action = intval($_GET['action']); } $_SESSION['votes'][$id] += $action; echo $_SESSION['votes'][$id]; } else { echo " <html> <head> <script language='javascript' type='text/javascript' src='http://code.jquery.com/jquery-latest.min.js'></script> </head> <body> <div id='vote_1' style='border: 1px solid blue;'> <a onclick=\"vote(1,'minuspost');\" href='#'>[-]</a> <a onclick=\"vote(1,'pluspost');\" href='#'>[+]</a> </div><br> <div id='vote_2' style='border: 1px solid red;'> <a onclick=\"vote(2,'minuspost');\" href='#'>[-]</a> <a onclick=\"vote(2,'pluspost');\" href='#'>[+]</a> <a onclick=\"vote(2,'-100');\" href='#'>[-100]</a> <a onclick=\"vote(2,'100');\" href='#'>[+100]</a> </div><br> <div id='vote_3' style='border: 1px solid green;'> <a onclick=\"vote(3,'minuspost');\" href='#'>[-]</a> <a onclick=\"vote(3,'pluspost');\" href='#'>[+]</a> </div><br> <script language='JavaScript' type='text/javascript'> function vote (id, action) { $('#vote_'+id).hide('slow', function () { var html = jQuery.ajax({ url: 'test.php', type: 'GET', data: ({id : id, action : action}), async: false }).responseText; $('#vote_'+id).html(html); $('#vote_'+id).show('slow'); } ); } </script> </body> </html> "; } ?>
Что-то начало получаться [js]<script src="http://code.jquery.com/jquery-latest.min.js"></script> <script type="text/javascript"> $(document).ready(function() { }); function votepost(id, action) { $.getJSON('http://vtrigazety.ru/post.php?id='+id+'&action='+action, {}, function(json) { $("#a_ball").html(json.ball); }); } </script>[/js] код кнопок PHP: <div class="blogpostsminus"><a href="#" onclick="votepost(<?php echo $line[0];?>,'minuspost'); return false;">-</a></div> <div class="blogpostsplus" ><a href="#" onclick="votepost(<?php echo $line[0];?>,'pluspost'); return false;">+</a></div> <div class="blogpostsball" ><a href="#" id="a_ball"><?php echo $line[3];?></a></div> скрипт post.php PHP: <?php if ($_GET['action']=='minuspost'){ $safe_topic=mysql_escape_string($_POST['cutnum']); $sSQL="UPDATE blogposts SET ball= ball -1 WHERE id=".$_GET['id']; mysql_query($sSQL) or die(mysql_error()); echo '{ "ball": "100000" }'; } elseif ($_GET['action']=='pluspost'){ $safe_topic=mysql_escape_string($_POST['cutnum']); $sSQL="UPDATE blogposts SET ball= ball +1 WHERE id=".$_GET['id']; mysql_query($sSQL) or die(mysql_error()); echo "ball"; } else { echo "нет такого действия"; } ?> не могу понять как выводить получившийся бал без обновления страницы?
ой, ну нахрена тут джисон. ладно. у вас есть два работающих варианта. вперед! =) Vantedur не могу понять как выводить получившийся бал без обновления страницы? В моем примере это есть. Удачи. =) 11 строк уж найдите силы разобрать. с 38 по 47
вот тут почему то отлично все работает http://vtrigazety.ru/?blog=jquery&novost=1 но стоит мне попробовать этим воспрозоваться на http://jquery.vtrigazety.ru/&novost=1 то перестает выводить обновление баллов, то есть балы засчитываются но не показывает, каким стал балл, в чем может быть трабл? сейчас js [js]<script type="text/javascript"> $(document).ready(function() { }); function votepost(id, action) { $.getJSON('http://vtrigazety.ru/post.php?id='+id+'&action='+action, {}, function(json) { $("#a_ball").html(json.ball); }); } </script>[/js] поддомен генерится через аксесс Код (Text): RewriteEngine On RewriteCond %{HTTP_HOST} ^(.{3,})\.vtrigazety\.ru$ RewriteRule (.*) http://vtrigazety.ru/index.php?blog=%1&uri=%{REQUEST_URI} [P,L]