Защиту от дабл-постов можно условно разделить на две категории:
1. Защита, запрещающая писать одному пользователю два сообщения подряд
2. Защита, запрещающая писать одному пользователю два одинаковых сообщения подряд
Поскольку защиту мы будем реализовывать средствами JavaScript, ее легко обойти мало-мальски грамотному пользователю, однако от школоты и прочих напастей эта защита может помочь.
Более того, чтобы понять, кто и что отправлял в последнем сообщении темы и нужно ли новое сообщение считать за дабл, надо знать, что это за пост и кто его отправил. Логично?
Следовательно, все эти защиты работать она будут только в тех формах ответа, рядом с которыми есть перечень последних постов.
То есть защита не сработает, если:
- сообщение отправляется не с последней страницы темы через форму быстрого ответа (оттуда не видно последних постов)
- сообщение отправляется через расширенную форму ответа, а в настройках форума отключен показ последних постов темы
Начнем с первой версии защиты
function check_doubles(form_target) { a = document.getElementsByTagName('div') if(location.href.indexOf('post.php?tid=') > -1) { lp_tag = 'toppost'; } else { lp_tag = 'endpost'; } for(i=0; i<a.length; i++) { if(a.className.indexOf(lp_tag) > -1) { if(lp_tag == 'toppost') { if(a.getElementsByTagName('div')[0].getElementsByTagName('p')[0].innerHTML.indexOf(UserLogin) == -1) { return process_form(form_target) } } else { if(a.getElementsByTagName('ul')[0].getElementsByTagName('a')[0].innerHTML == UserLogin) { alert('Повтор сообщений запрещен') return false } } break } } return process_form(form_target) } document.getElementById('post').onsubmit = function onsubmit(event) { this.submit.disabled=true;if(check_doubles(this)){return true;}else{this.submit.disabled=false;return false;} }
Код вставляем в HTML под формой ответа.
Вторая версия защиты (проверка содержимого)
Не могу не заметить, что проверка содержимого очень глючит.
Защита не сработает на два одинаковых, но интерактивных сообщения, например, на сообщения с картинками, видео, цитатами, любым bb-кодом вообще. Отстой конечно, но иначе бы пришлось реализовывать сложную real-time интерпретацию bb-кода, на что лично у меня уйдет до двух недель.
Итак, скрипт:
function check_doubles(form_target) { a = document.getElementsByTagName('div') if(location.href.indexOf('post.php?tid=') > -1) { lp_tag = 'toppost'; } else { lp_tag = 'endpost'; } for(i=0; i<a.length; i++) { if(a.className.indexOf(lp_tag) > -1) { if(lp_tag == 'toppost') { if(a.getElementsByTagName('div')[0].getElementsByTagName('p')[0].innerHTML.indexOf(UserLogin) == -1) { return process_form(form_target) } if(a.getElementsByTagName('div')[0].getElementsByTagName('div')[1].getElementsByTagName('div')[0].getElementsByTagName('div')[0].innerHTML == form_target.getElementById('main-reply').innerHTML) { alert('Повтор сообщений запрещен') return false } } else { if((a.getElementsByTagName('ul')[0].getElementsByTagName('a')[0].innerHTML == UserLogin) && (form_target.getElementById('main-reply').innerHTML == document.getElementById(a.id + '-content').getElementsByTagName('p')[0].innerHTML)) { alert('Повтор сообщений запрещен') return false } } } break } return process_form(form_target) } document.getElementById('post').onsubmit = function onsubmit(event) { this.submit.disabled=true;if(check_doubles(this)){return true;}else{this.submit.disabled=false;return false;} }
Тоже вставлять в html под формой ответа.
Не могу не сказать, что оба скрипта тест не проходили. И если первый скрипт в силу своей простоты, вероятно, заработает, то шанс, что второй скрипт окажется рабочим, я оцениваю примерно в 15-20%.