Javascript.RU

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

Как передать и получить ответ от сервера?
здравствуйте, пытаюсь сделать отправку данных в месте с файлом, всё отправляются нормально, но решил сделать сообщение с сервера клиенту, об ошибке или об успешной передаче, собственно вот код

<script src="jquery-1.4.2.min.js" type="text/javascript"></script>
<script src="jquery.form.js" type="text/javascript"></script>


<script type="text/javascript">
<!--
$(document).ready(function() {
   $("#frm").ajaxForm({
      // dataType: "json",
      beforeSubmit: function(dataFrm, obj, option) {
         $("#result_load").show();
         $("#result_load").html("Загрузка...");
         $("#go").enable(false); // Деактивируем кнопку
      },
      success: function(data){

      var res = JSON.parse(data);

                        if (res['err']=='1'){
                               $("#result_load").hide();
                               $("#result").html(res['msg']);
                               $("#go").enable(true); // Делаем кнопку активной
                        }else{
                               $("#result_load").hide();
                               $("#result").html(res['msg']);
                               $("#go").enable(true); // Делаем кнопку активной
                        }
      },
      clearForm: true // Устанавливаем значения по умолчанию
   });
});

//-->
</script>



<div id="result_load"></div>

<form action="upload.php" id="frm" method="POST" enctype="multipart/form-data">

<input type="text" name="txt1"><br>
<input type="text" name="txt2" value="Текст"><br>

<input type="hidden" name="MAX_FILE_SIZE" value="30000000">
<input type="file" name="file_name">

<input type="submit" name="go" id="go" value="Загрузить файл">

</form>

<b>Ответ сервера:</b><br>

<div id="result"></div>



<?php

 header('Content-Type: text/html; charset=utf-8');

 $res = array();


 if($_POST['txt1'] == ''){
    $res['msg'][] = 'Поле txt1 не заполнено!';
 }

 if($_POST['txt2'] == ''){
    $res['msg'][] = 'Поле txt2 не заполнено!';
 }


 if (!isset($_FILES['file_name']))
 {
      $res['msg'][] = 'Файл не выбран';

 }elseif($_FILES['file_name']['error'] == 0 && $_FILES['file_name']['size'] > 0 && $_FILES['file_name']['size'] < 30000000) {

      $path = "C:/wamp/www/jquery/form/";
      $path .= basename($_FILES['file_name']['name']);
      $tmp = $_FILES['file_name']['tmp_name'];

      if (!@move_uploaded_file($tmp, $path))
      {
          $res['msg'][] = 'Ошибка при копировании файла';
      }

 }else{

      $res['msg'][] = 'Ошибка при загрузке. Код: ' . $_FILES['file_name']['error'];
 }


 $output = '';
 $res2 = array();


 if( @sizeof($res['msg']) > 0 ){

   foreach(@$res['msg'] as $index => $val)
   {
      $output .= $val.'<br>';
   }

    $res2['msg'] = $output;
    $res2['err'] = '1';

 }else{

    $res2['msg'] = 'Даные были сохранены успешно';
    $res2['err'] = '0';

 }

  echo '{"msg":"'.$res2['msg'].'","err":"'.$res2['err'].'"}';

?>



проверил в FireFox 3.6 и Chrome всё работает нормально, а в IE8 выдаёт такую ошибку

Код:
Сообщение: 'JSON' - определение отсутствует
Строка: 23
Символ: 7
Код: 0
URI-код: http://localhost/jquery/form/index.php
23 строка это: var res = JSON.parse(data);

в опере 10 выдаёт

Код:
{"msg":"Поле txt1 не заполнено!<br>Поле txt2 не заполнено!<br>","err":"1"}
подскажите что делаю не так?
каким образом определить JSON то что просит IE сделать?

ещё, если убераю коментарии в коде JS в этой строчке
// dataType: "json",

то но водном браузере не работает

Последний раз редактировалось Simon, 17.03.2010 в 22:43.
Ответить с цитированием
  #2 (permalink)  
Старый 18.03.2010, 06:35
Аспирант
Отправить личное сообщение для Simon Посмотреть профиль Найти все сообщения от Simon
 
Регистрация: 25.11.2008
Сообщений: 31

отвечаю сам на свой же вопрос)
нужно заменить эту строчку

var res = JSON.parse(data);

на эту

var res = eval('(' + data + ')');

или на эту

var res = jQuery.parseJSON(data);

сделал последний вариант, вроде как parseJSON хвалят больше ежели eval

Теперь хотелось всё это обвернуть в одну функцию как то так

function myAjaxForm(id) {

.. выше упомянутый код ..

}

где в качестве аргумента id в функции указываем id формы, тоесть то что указывается тут

<form action="upload.php" id="frm" method="POST" enctype="multipart/form-data">
эта часть
id="frm"

т.к. функцию планирую использовать для много форм, и чтобы каждый раз не копировать по несколько раз для каждой формы, хотелось одну функцию для всех, просто передавая id формы
Ответить с цитированием
  #3 (permalink)  
Старый 20.03.2010, 07:59
Аспирант
Отправить личное сообщение для Simon Посмотреть профиль Найти все сообщения от Simon
 
Регистрация: 25.11.2008
Сообщений: 31

по пытался сделать таким образом, весь js код поместил в функцию

function myAjaxForm(id) {

...

}


также в js коде изменил это
$("#frm").ajaxForm({

на это
$("#"+id).ajaxForm({

всё остальное оставил без изменений


а в HTML форме изменил так

<form action="upload.php" id="frm" method="POST" enctype="multipart/form-data">

<input type="submit" name="go" id="go" onclick="myAjaxForm('frm');" value="Загрузить файл">


таким образом хотелось бы при нажатии на кнопку, сработала функция myAjaxForm которой был передан id формы что прописано в теге <form id="frm">

проверил в FireFox работает нормально также в Chrome, а вот в IE8 неработает, выдаёт такую ошибку

Код:
Строка: 28
Символ: 162
Код: 0
URI-код: http://localhost/jquery/form/jquery-1.4.2.min.js
кстати в Опере 10 версии работает, но вроде как с перезагрузкой страницы.

Подскажите плиз. что не так делаю?
Ответить с цитированием
  #4 (permalink)  
Старый 11.04.2011, 16:35
Новичок на форуме
Отправить личное сообщение для vladkras Посмотреть профиль Найти все сообщения от vladkras
 
Регистрация: 07.04.2010
Сообщений: 9

Сообщение от Simon
отвечаю сам на свой же вопрос)
нужно заменить эту строчку

var res = JSON.parse(data);

на эту

var res = eval('(' + data + ')');

или на эту

var res = jQuery.parseJSON(data);
eval крайне небезопасен, использовать его строго не рекомендуется, поскольку он может исполнить чужеродный код

jQuery - тоже не решение, не все хотят и могут с ним работать

проблема решается добавлением правильного !DOCTYPE в документ
Ответить с цитированием
  #5 (permalink)  
Старый 16.04.2011, 08:55
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

Сообщение от vladkras
eval крайне небезопасен, использовать его строго не рекомендуется, поскольку он может исполнить чужеродный код
Шо за бред? Я и так могу исполнить любой код в контексте вашей страницы.
Ответить с цитированием
  #6 (permalink)  
Старый 19.04.2011, 18:30
Интересующийся
Отправить личное сообщение для ART-DELI Посмотреть профиль Найти все сообщения от ART-DELI
 
Регистрация: 12.04.2011
Сообщений: 23

vladkras - JavaScript клиентский язык и работает на стороне клиента!)) Улыбнуло!)
Ответить с цитированием
  #7 (permalink)  
Старый 01.06.2011, 16:37
Новичок на форуме
Отправить личное сообщение для vladkras Посмотреть профиль Найти все сообщения от vladkras
 
Регистрация: 07.04.2010
Сообщений: 9

Сообщение от ART-DELI Посмотреть сообщение
vladkras - JavaScript клиентский язык и работает на стороне клиента!)) Улыбнуло!)
рад, что у Вас хорошее настроение и Вы улыбаетесь, однако:
JSON::Вопросы безопасности никто не отменял, речь идет об обработке данных с сервера, вредоносный код помещается именно в них, чтобы выполнить на клиенте, учите матчасть

Сообщение от Kolyaj Посмотреть сообщение
Шо за бред? Я и так могу исполнить любой код в контексте вашей страницы.
в контексте МОЕЙ страницы Вы не можете исполнить ничего, набирая "javascript:..." у СЕБЯ браузере, другой вопрос, что Вы подвергаете пользователя опасности используя eval()

и вообще http://api.jquery.com/jQuery.parseJSON/
Ответить с цитированием
  #8 (permalink)  
Старый 01.06.2011, 16:57
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

vladkras,
давайте вы приведёте примерный сценарий атаки на сайт, который использует eval.
Ответить с цитированием
  #9 (permalink)  
Старый 01.06.2011, 21:32
Новичок на форуме
Отправить личное сообщение для vladkras Посмотреть профиль Найти все сообщения от vladkras
 
Регистрация: 07.04.2010
Сообщений: 9

Сообщение от Kolyaj Посмотреть сообщение
vladkras,
давайте вы приведёте примерный сценарий атаки на сайт, который использует eval.
наслаждайтесь: XSS
Ответить с цитированием
  #10 (permalink)  
Старый 01.06.2011, 22:04
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

И причём здесь eval?

Последний раз редактировалось Kolyaj, 01.06.2011 в 22:07.
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
30(1|2) редирект от сервера. Или как лучше сделать редирект при верной отсылке форма. pizzZ AJAX и COMET 2 18.02.2010 09:06
Как в ajax запросе передать файл методом POST mcpro jQuery 1 16.12.2009 11:41
Ответ сервера в плугине ajaxForm отдается неправильно. IgorOk jQuery 11 13.12.2009 04:35
Как получить высоту DIV, установленную автоматически YOricH Internet Explorer 4 22.07.2009 17:15
Как получить файл с сервера AJlekceu AJAX и COMET 1 02.11.2008 13:41