Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > JavaScript: Общие вопросы > проблема с пробелом


Автор: bazzjr 11.5.2010, 12:10
Всем привет.

Имею следующую проблему:

есть текстовое поле <textarea name="textA" id="textA" rows="3" cols="45"></textarea>
Пишу в это поле текст "1пробел1" - т.е. пробел при отсылке конвертируется в %20.

после нажатия на кнопку submit, данные с "textA" пытаюсь отправить через ajax следующим образом:

Код

function ajax(url){
    var somevar= document.getElementById('textA').value;
    createRequest();   
    request.open("POST",url + '/123456/' + somevar,true);
    request.onreadystatechange = updatePage;
    request.send(null);
}
function updatePage() {
     if (request.readyState == 4) {
       if (request.status == 200) {
          response = request.responseText;
          eval(response);
       } else
         alert("status is " + request.status);
     }
   }




После чего выдает ошибку в консоли ошибок:

Ошибка: XML tag name mismatch (expected hr)
Источник: http://site/
Строка 222, символ 2
Исходный код:
</body>


На локальном компе все нормально работает, а выкладываю на сервер, выдает такую ошибку.

В чем может быть проблема?

Автор: bars80080 11.5.2010, 14:30
по какому адресу находится страница? по какому идёт аякс-запрос?
точно ли доменные имена соблюдены? он будет косячить даже если страница по адресу www. , а запрос нет

Автор: bazzjr 11.5.2010, 14:43
Забыл сказать...

Если посылать данные в форме вида "111222333", т.е. без пробела, то все хорошо, все работает.

Стоит указать пробел (%20) и вылазит эта ошибка. Насчет других символов не знаю, не тестировал пока...

Что за хз не понимаю...

Автор: bars80080 11.5.2010, 15:00
кодируйте входящие переменные:

Код

    var somevar= document.getElementById('textA').value;
    somevar = encodeURIComponent(somevar);



правда, вы как-то странно делаете, у вас в somevar - кусок пути ( path1/path2/path3 ) или строка поиска ( ?param=value&param2=value2 ) ?


Автор: bazzjr 11.5.2010, 15:09
Все правильно, кусок строки с переменными, только эта строка потом обрабатывается modRewrite.

bars80080 а как на твой взгляд лучше сделать? 

Проверил... не катит "encodeURIComponent" :( все таже самая ошибка...

Более того, если написать в текстовом поле 1%201 (1пробел1), то все нормально, строка обрабатывается, т.е. на выходе мы получаем "1%25201"

Автор: bars80080 11.5.2010, 19:16
да я вообще без понятия, как можно было создавать пути с пробелами. традиционно все стараются их избегать от греха подальше


Цитата(bazzjr @  11.5.2010,  15:09 Найти цитируемый пост)
Более того, если написать в текстовом поле 1%201 (1пробел1), то все нормально, строка обрабатывается, т.е. на выходе мы получаем "1%25201"

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

Автор: bazzjr 11.5.2010, 23:01
Вообщем пока проблему так и не решил.

Если пропускаешь 2-3 раза через encodeURIComponent, то вроде записываются данные в базу, но все равно не те, записываются мнемоники.

Вот подскажите как сделать лучше: У меня есть база данных MySql текстовое поле(textarea) и modrewrite. Мне нужно через axaj(тот что писал выше) закинуть в базу текст с текстового поля, при это все данные обрабатываются modrewrite и правилом - 
- RewriteRule ^somepath/([0-9]+)/([0-9a-z]{30,35})/(.*)$ somefile.php?id_post=$1&check=$2&message=$3 [L]
$message и есть самое слабое место сейчас... Т.е. мессагу я передаю прямо в заголовке($message=textarea).

может нужно подавать данные через <form>(я подавал напрямую через document.getElementById('textA').value) или еще какие варианты есть???

подскажите как у вас реализованы отправки сообщений через ajax.

Автор: ksnk 12.5.2010, 11:49
bazzjr, Post'ом передаешь данные, а собственно сообщение укладываешь в get? Ай маладец... А у нас все через... get...  smile 

передавай данные этим самым постом, он для этого и придуман. 
Код

    request.open("POST",url + '/123456/' ,true);
    request.onreadystatechange = updatePage;
    request.send('textA='+ encodeURIComponent(document.getElementById('textA').value));


Автор: bazzjr 13.5.2010, 08:54
Побившись головой Ап стену( smile ) вчера и сегодня ночью... я пришел к интересной конструкции:

Код

function ajax(url){
    var somevar = encodeURIComponent(document.getElementById('somevar').value);
    createRequest();   
    request.open("POST",url + '/123456/' + encodeURIComponent(somevar),true);
    request.onreadystatechange = updatePage;
    request.send(null);
}



Она работает! Но появились некоторые другие проблемы, в частности если в текстовое поле вводишь текст с пробелами более 250 символов, то 0(нулевая) ошибка ajaxa, а если 500 символов, то вообще ошибка 400 bad request.

Если ввести в поле например 500 любых символов без пробела, то все нормально.

Может кто сталкивался и знает решение проблемы? 

Автор: bars80080 13.5.2010, 14:16
у тебя каждый пробел превращается в 5 символов, 500*5 = 2500, а два килобайта с гаком - это максимум что ждут от url запроса. в некоторых системах существуют ограничения по этому поводу

имхо

Автор: bazzjr 13.5.2010, 15:15
П П Ц!  а как же быть??? ну ведь как то другие отправляют такие вот ajax textarea... 

Ну самый приходящий на ум пример - google переводчик... там же можно вводить много символов!

Автор: bars80080 13.5.2010, 19:29
дык они отправляют данные через пост. там сколько угодно можно передать


Цитата(bazzjr @  13.5.2010,  15:15 Найти цитируемый пост)
Ну самый приходящий на ум пример - google переводчик... там же можно вводить много символов!

сейчас да. раньше в варианте http://www.google.ru/language_tools?hl=ru отправка шла обычной формой методом get. там длина текста была ограничена. теперь сделали, как и в аякс-варианте post, тут уже неограничено

Автор: bazzjr 13.5.2010, 22:04
подожди, а моя конструкция что, не отправляет через POST?

Код

function ajax(url){
    var somevar = encodeURIComponent(document.getElementById('somevar').value);
    createRequest();   
    request.open("POST",url + '/123456/' + encodeURIComponent(somevar),true);
    request.onreadystatechange = updatePage;
    request.send(null);
}


Все таки я пока не знаю решение проблемы.

Единственное что я могу сделать на данный момент, это ограничить символы в textarea до GET формата.

Автор: bars80080 13.5.2010, 22:35
твоя конструкция отправляет post. но никаких данных в теле пост запроса нет.
ksnk, показывал, как они добавляются: request.send('данные');

а в твоём случае данные добавляются к урлу, что по сути и есть get-запрос.

обычно пользуются чем-то одним, хотя и так без экстрима бы работало. в данном случае, экстрим - очень длинная строка, а также не латинские символы в урле. которые теоретически можно наладить, чтоб работало, но практически никто этим не занимается.

философия тут такая: 
  • есть урл - он неизменяем, то есть аякс-запросы при выборе пользователя какого параметра шлются всегда на один какой-то адрес server.ru/folder/script.php
  • если надо прицепить немного данных, то их добавляют в виде search-строки, так называемый get-запрос: 
    server.ru/folder/script.php?param1=value1&param2=value2
    причём тут интересный момент: зачем тебе вообще mod_rewrite для аякс-запроса? ведь ЧПУ (красивые урлы) нужны для людей. а машине пофигу, ей чем проще - тем лучше
  • если начинается экстрим, то урл обычный
    server.ru/folder/script.php
    и добавляются данные в post-запрос: 
    Код

    var data = 'param1=value1&param2=value2';
    request.send(data);

Автор: bazzjr 15.5.2010, 09:30
bars80080, ksnk, большое спасибо!

Вы были правы, насчет post данных и насчет бесполезности modrewrite.

Я все сделал как сказал bars80080, теперь все работает, только все равно не хочет передовать более 1100 символов(методом post-наверно ограничения сервера).


Тем не менее в свою копилку я положу еще +1 очко опыта  smile 

Автор: IgorIV 15.5.2010, 10:16
bazzjr, тем не менее, не мешало бы еще кое-кому положить + в копилку.

Автор: bars80080 15.5.2010, 13:19
нет, на пост обычно ограничения исчисляются в мегабайтах. тут надо бы посмотреть в функции обработчики, и собственно сам передаваемый текст. в каких случаях его обрезает

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)