Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 08.06.2016, 22:18
Аспирант
Отправить личное сообщение для Salvat Посмотреть профиль Найти все сообщения от Salvat
 
Регистрация: 22.02.2016
Сообщений: 98

undefined в POST запросе
Здравствуйте. Имеется форма на php
<form id='submit_wall' name='funforma'  >
					   
                                                <p><div  class='textarea_stena'  id='".$row['id']."' name='comment' tabindex='0' contenteditable='true' ondragend='return true' ></div>
                                                <p> <input type='hidden' name='messageid' id='".$row['id']."' value='".$row['id']."'></p>   
						<div id='smiles'>
        <img src='smile/1.gif'>
        <img src='smile/2.gif'>
        <img src='smile/3.gif'>
    </div>
    ";
                     
                        $stena_group .= '<p><a href="javascript:void(0);" onclick="comment( document.getElementById('.$row['id'].').value, '.$row['id'].' );">
                                                 Отправить</a> </p>
                                               </form>

Код который отображает смайлики в textarea и отправляет POST запрос скрипту PHP
function comment(text, message_id){
    $.ajax({
        type: "POST",
        url: "profile.php",
data:"comment=" + text+"&messageid="+message_id, 
        success: function(){
            $("ul#wall").prepend("<li style=\"display: none;\">"+ text +"</li>");
            $("ul#wall li:first-child").fadeIn();
            }
        });
    return false;
};


        var arr = document.getElementById('smiles').getElementsByTagName('img');
        for(var i in arr) {
            if(arr.hasOwnProperty(i)) {
                arr[i].onclick = function(event) {
                    if('img' === this.tagName.toLowerCase()) {
                        var img = ' <img class="emoji" src="'+this.src+'">&nbsp;';
                        document.execCommand('insertHTML', false, img);
                    }
                };
            }
        }


Стиль textarea
.textarea_stena{background:#FFFFFF;color:black;border:1px solid #C0CAD5;width:328px;min-height:
	40px;padding:3px 25px 3px 3px;padding-bottom:5px;margin-bottom:3px;
	outline:0;-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;line-height:150%;word-wrap:break-word;cursor:text;}
        .emoji{margin:0px;border:none;vertical-align:top;
        }

Сообщения из базы данных выводятся через цикл, где в коде PHP row['id'] - это уникальный ид сообщения.
Смайлики отображаются как необходимо в textarea, только работает код только с самым первым textarea который выводит сообщение из базы данных, с другими почему-то не работает. Так же при попытке отправить POST запрос в базу записывается undefined. Если Вас не затруднит, не могли бы пожалуйста объяснить где моя ошибка с отправкой POST(ошибка undefined) и так же с передачей фокуса разным textarea с уникальными id.
Прикладываю скрин-шот

77,78,79 - это id'ы сообщений, смайлик могут отобразить только в первом 77 textarea. В другие при клике по смайлику их не отображает, но если перетащить мышкой, тогда отобразятся.

Последний раз редактировалось Salvat, 08.06.2016 в 22:24.
Ответить с цитированием
  #2 (permalink)  
Старый 08.06.2016, 23:31
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,989

Идентификаторы должны быть уникальны.
Ответить с цитированием
  #3 (permalink)  
Старый 09.06.2016, 00:51
Аспирант
Отправить личное сообщение для Salvat Посмотреть профиль Найти все сообщения от Salvat
 
Регистрация: 22.02.2016
Сообщений: 98

laimas, раньше форма имела вид
<form id='submit_wall' name='funforma' >
                                                <p><textarea type='text' name='comment' id='".$row['id']."' value='' style='height:100p' /></textarea>
                                                <p> <input type='hidden' name='messageid' id='".$row['id']."' value='".$row['id']."'></p>	 <div class='smile'>
     

	<a href='javascript:x()' onclick=\"InsertSmile(':-*')\"><img src='smile/1.gif'/></a>
	<a href='javascript:x()' onclick=\"InsertSmile(':)')\"><img src='smile/2.gif'/></a>
	<a href='javascript:x()' onclick=\"InsertSmile(':(')\"><img src='smile/3.gif'/></a>
	<a href='javascript:x()' onclick=\"InsertSmile(';)')\"><img src='smile/4.gif'/></a>
	<a href='javascript:x()' onclick=\"InsertSmile(':P')\"><img src='smile/5.gif'/></a>
	<a href='javascript:x()' onclick=\"InsertSmile('8)')\"><img src='smile/6.gif'/></a>
	<a href='javascript:x()' onclick=\"InsertSmile(':D')\"><img src='smile/7.gif'/></a>
	<a href='javascript:x()' onclick=\"InsertSmile('=O')\"><img src='smile/9.gif'/></a>
	<a href='javascript:x()' onclick=\"InsertSmile(':-x')\"><img src='smile/10.gif'/></a>
	<a href='javascript:x()' onclick=\"InsertSmile('(T_T)')\"><img src='smile/11.gif'/></a>

 ";
						
						 $stena_group .= '<p><a href="javascript:void(0);" onclick="comment( document.getElementById('.$row['id'].').value, '.$row['id'].' );">
                                                  Отправить</a> </p>
                                                </form>

JavaScript без проблем отправлял POST запрос с одинаковыми id.
Ответить с цитированием
  #4 (permalink)  
Старый 09.06.2016, 05:52
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,989

Серверу эти ID как собаке пятая лапа, он получает в качестве ключей имена, а вот для JS нет. Во-первых значение id не должно начинаться цифры, иначе невалидно. Но самая проблема, это обращения к объекту по его ID - JS найдет первый из них в дереве DOM, а остальные с таким же значением для него существовать не будут.

Если форма имеет множество полей и имена полей одинаковы, то имя поля должно быть ключом массива:

name="comment['.$row['id'].']"

и надобность в скрытом поле отпадает.

РНР строковые значения заключенные в двойные кавычки подвергает разбору. Вам этого не требуется, а вы напрасно заставляете это его делать.

Наведите сперва порядок с ID, а уж затем остальное.

Последний раз редактировалось laimas, 09.06.2016 в 05:55.
Ответить с цитированием
  #5 (permalink)  
Старый 09.06.2016, 12:13
Аспирант
Отправить личное сообщение для Salvat Посмотреть профиль Найти все сообщения от Salvat
 
Регистрация: 22.02.2016
Сообщений: 98

Цитата:
Если форма имеет множество полей и имена полей одинаковы, то имя поля должно быть ключом массива:

name="comment['.$row['id'].']"

и надобность в скрытом поле отпадает.
Благодарю за этот совет, только скрытое поле мне необходимо чтобы заносить id сообщения в базу данных вместе с комментарием. Для того, чтобы построить диалог, знать к какому сообщению относится комментарий.

Это старая форма и вот сам JS
var ie=document.all?1:0;
var ns=document.getElementById&&!document.all?1:0;

function InsertSmile(SmileId)
{
if(ie)
{
document.all.comment.focus();
document.all.comment.value+=" "+SmileId+" ";
}

else if(ns)
{
document.forms['funforma'].elements['comment'].focus();
document.forms['funforma'].elements['comment'].value+=" "+SmileId+" ";
}

else
alert("ошибка браузера");
}


Меня этот код не устраивает тем, что смайлики первоначально отображаются ввиде символов. Так же только к первому textarea можно добавлять смайлики. Да, я понимаю, в коде что привожу выше, все заносится в массив. Но мне необходимо все реализовать совсем другим методом. ID сообщений в базу данных пишутся как положенно, что в первом, что во втором коде. Только код который в первом посте пишет в БД undefined.
Ответить с цитированием
  #6 (permalink)  
Старый 09.06.2016, 12:20
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,989

Сообщение от Salvat
только скрытое поле мне необходимо чтобы заносить id сообщения в базу данных вместе с комментарием.
Для этой цели оно как раз и не нужно - каждое поле формы может содержать этот ключ.

Сообщение от Salvat
Меня этот код не устраивает тем, что смайлики первоначально отображаются ввиде символов.
А сказать где у вашего решения дыра или сами догадаетесь?
Ответить с цитированием
  #7 (permalink)  
Старый 09.06.2016, 12:24
Аспирант
Отправить личное сообщение для Salvat Посмотреть профиль Найти все сообщения от Salvat
 
Регистрация: 22.02.2016
Сообщений: 98

Скажите, если не сложно, а то уже как сами видите не первый вариант пытаюсь наладить для нужного мне результата.
Ответить с цитированием
  #8 (permalink)  
Старый 09.06.2016, 13:10
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,989

Вы разрешаете клиентам помещать в сообщения html-код - изображения. А для того чтобы смайлы работали они в сообщениях должны быть как есть. Это означает, что нельзя пропустить сообщение через htmlspecialchars перед выводом клиенту, что делается обязательно, чтобы не допустить на странице XSS атак. А значит любой ушлый может поместить в него куда белее вредное, нежели картинку.

Вам придется разбирать посредством рег. выражений каждый пост, отсеивая разрешенное и запрещенное. То есть ваш подход, это не лучшее, что можно сделать. Визуальные редакторы тоже используют подобное решение, но только серверу отправляется textarea, которая на время работы редактора "в тени", а данные которые в нее пишет визуальный редактор обрабатываются.

В простейшем случае таким же образом можно писать в textarea (в фоновом режиме) не html-теги, а ВВ-теги. Можно вообще без тегов обойтись, а писать , :0), ... А в div (панели сообщения) естественно будет смайл. В этом случае форма отправляет текст, который без проблемы можно обработать htmlspecialchars, и заменить ВВ-теги или мнемоники на смайлы.

При этом при отключенном JS форма будет работать обычным способом, ваша же не сможет отправить сообщения.

Последний раз редактировалось laimas, 09.06.2016 в 13:12.
Ответить с цитированием
  #9 (permalink)  
Старый 09.06.2016, 13:37
Аспирант
Отправить личное сообщение для Salvat Посмотреть профиль Найти все сообщения от Salvat
 
Регистрация: 22.02.2016
Сообщений: 98

Спасибо за совет, только пока у меня проблема не с защитой, а с отправкой самого сообщения. Фильтрацию я напишу чтобы не было XSS уязвимостей. С этим я знаком.
Цитата:
В простейшем случае таким же образом можно писать в textarea (в фоновом режиме) не html-теги, а ВВ-теги. Можно вообще без тегов обойтись, а писать , :0), ... А в div (панели сообщения) естественно будет смайл. В этом случае форма отправляет текст, который без проблемы можно обработать htmlspecialchars, и заменить ВВ-теги или мнемоники на смайлы.

При этом при отключенном JS форма будет работать обычным способом, ваша же не сможет отправить сообщения.
Можете, пожалуйста, пояснить по побродней, не совсем понял принцип реализации данного метода.
Ответить с цитированием
  #10 (permalink)  
Старый 09.06.2016, 13:57
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,989

Texarea скрывается, а все изменения в DIV записываются в нее. Это можно делать как по событию, так и по таймеру. При этом если в DIV помещен смайл, то в texarea записывается или ВВ-код [IMG] или, что вполне достаточно для смайлов, просто его мнемоника. Серверу отправляется форма, ее поля, а не то что в DIV.

Серверу достаточно обработать вывод и заменить ВВ или мнемоники на смайлы. Это все подробности.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
обработка строки при ajax (post) запросе virus-07 AJAX и COMET 2 17.07.2013 13:55
Google Chrome: GET http://url/url undefined (undefined) Kirumbik Opera, Safari и др. 0 07.05.2011 23:26
Чем отличается undefined от null hrundel Общие вопросы Javascript 21 01.01.2011 22:06
Как в ajax запросе передать файл методом POST mcpro jQuery 1 16.12.2009 11:41
Как правильно послать XML в POST запросе LowCoder AJAX и COMET 10 15.07.2009 23:20