Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

HTML+CSS+JavaScript

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: как описать код в одну функцию. Использую плагин jQuery.form
 
 автор: web777   (18.03.2010 в 06:48)   письмо автору
 
 

Написал такую форму на jQuery.form с помощью которой отправляю как данные так и файл, с последующей проверкой на сервере. Всё это работает нормально, проверял на всех последних версиях браузеров, на старых версиях проверить возможности не было. Но хотелось бы весь Js код обвернуть в одну функцию, чтобы можно было ей передавай id формы. Поскольку форм будет много, решил не копировать код по несколько раз для каждой формы, а написать всего одну функцию и передавать id соответствующей формы. Но как это сделать пока не разобраться.

Ниже привожу весь код скрипта

<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 = jQuery.parseJSON(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'] == && $_FILES['file_name']['size'] > && $_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']) > ){

   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'].'"}';

?>

  Ответить  
 
 автор: web777   (20.03.2010 в 07:51)   письмо автору
 
   для: web777   (18.03.2010 в 06:48)
 

по пытался сделать таким образом, весь 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 версии работает, но вроде как с перезагрузкой страницы.

Подскажите плиз. что не так делаю?

  Ответить  
 
 автор: sim5   (20.03.2010 в 10:40)   письмо автору
 
   для: web777   (20.03.2010 в 07:51)
 

<script>
$(document).ready(function() {
  $('form').submit(function() {
    alert(this.id);
    return false;
  });
});
</script>

<form action="" name="as1" id="as1">
<input type="text" name="txt1" value="val1">
<input type="submit" value="GO">
</form>
<form action="" name="as2" id="as2">
<input type="text" name="txt2" value="val2">
<input type="submit" value="GO">
</form>

  Ответить  
 
 автор: web777   (22.03.2010 в 16:49)   письмо автору
50.8 Кб
 
   для: sim5   (20.03.2010 в 10:40)
 

пришлось немного изменить код, теперь скрипт работает как нужно, но вот столкнулся с такой проблемой невозможно передать некоторые HTML теги, какие-то проходят а какие нет, вот сам код

JS

<script type="text/javascript">
$(document).ready(function() {

   $("#frm").ajaxForm({
      dataType: "json",
      beforeSubmit: function(dataFrm) {

         $("#result").html("Загрузка...");
         $("#go").enable(false); // Деактивируем кнопку
      },
      success: function(d) { // При отсутствии ошибки

            $("#go").enable(true); // Делаем кнопку активной

            var obj = eval(d);

            if(obj.status == "ok"){

               $("#result").html(obj.msg);

            }else{

               $("#result").html(obj.msg);

            }

      },
      error: function() {
         $("#result").html("Произошла ошибка");
         $("#go").enable(true); // Делаем кнопку активной
      },
      resetForm: true // Устанавливаем значения по умолчанию
   });
});
</script>


HTML

<form id="frm" action="ajax.php" 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="300000000">
<input type="file" name="file_name" id="file_name"><br><br>
<input type="submit" name="go" id="go" value="Загрузить файл">
</form>

<b>Ответ сервера:</b><br>
<div id="result"></div>



PHP
<?php
error_reporting
(0);

// Запрет кеширования
header("Expires: Sun, 27 May 2007 01:00:00 GMT");
header("Last-Modified: " gmdate("D, d M Y H:i:s") . " GMT");
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Pragma: no-cache");

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

 
$res = array();

 if (
$_FILES['file_name']['name'] != ''){

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

      if (!@
move_uploaded_file($tmp$path)) {
        
$res['msg'][] = 'Файл не удалось загрузить'.$_FILES['file_name']['name'];
      }

 }

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

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

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

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

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

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

 }else{

    
$res2['msg'] = '<b>Даные</b> <i>были сохранены успешно</i>';
    
$res2['err'] = 'ok';

 }

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


так вот, если в строчке PHP кода укажу ссылку например так

$res2['msg'] = '<b>Даные</b> <i>были сохранены успешно</i><a href="http://www.site.ru">Перейти на главную страницу</a>';


то за место этого выводится сообщение Произошла ошибка из функции error

error: function() {
         $("#result").html("Произошла ошибка");
         $("#go").enable(true); // Делаем кнопку активной
      },


но если эту ссылку передать не через сервер а напрямую прописать в JS вот так

$("#result").html('<a href="http://www.site.ru">Перейти на главную страницу</a>'+obj.msg);


то всё срабатывает нормально. Но это не дело, т.к. ссылку нужно передавать через сервер, поскольку от разных задач адрес ссылки может быть разный. Также от сервера не доступны такие теги <table>, а например эти <b> или <i> проходят нормально.

Вот подумываю может принимаю данные с сервера не верно

var obj = eval(d);

может както обрабатывать нужно, или не в этом совсем дело. Помогите пожалуйста разобраться

я также приложил архив этого скрипта

  Ответить  
 
 автор: sim5   (22.03.2010 в 17:06)   письмо автору
 
   для: web777   (22.03.2010 в 16:49)
 

Я вообще не понимаю зачем с сервера передавать HTML-код, который будет всегда один и тот же. Разве не досточно передавать только адрес, вставляя его параметром для создаваемого на клиенте объекта - элемента А?

  Ответить  
 
 автор: web777   (22.03.2010 в 18:01)   письмо автору
 
   для: sim5   (22.03.2010 в 17:06)
 

да такое возможно, но я бы хотел чтобы все данные передавались уже готовые, такое возможно?
почему тег A или например TABLE не проходят, что мешает этому? и как сделать чтобы они были доступны?

на самом деле запрос я передаю контроллеру, контроллер обрабатывает данные и передаёт сообщение через шаблон .tpl
Я не стал упрощать в примере, привёл простой PHP код, но сути не меняет.

Сообщение будет не одним и тем же, всё зависит от статуса, если ответ был успешным, то нужно будет вывести разные ссылки к примеру если пользователь добавил объявление, то ему нужно будет предоставить несколько ссылок на редактирование, удаление можно ещё предложить некоторые услуги, к примеру через смс поднять объявление и т.п. А всё это передавать JS и через него формировать сообщение, не совсем удобно. Удобнее было через шаблон сформировать и передать готовое клиенту.

  Ответить  
 
 автор: sim5   (23.03.2010 в 08:07)   письмо автору
 
   для: web777   (22.03.2010 в 18:01)
 

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

  Ответить  
 
 автор: sim5   (23.03.2010 в 08:01)   письмо автору
 
   для: web777   (22.03.2010 в 16:49)
 

Вы отдаете клиенту данные в JSON-формате, значит ошибку искать надо здесь. Я не знаю вышеуказанного плагина для jQuery (хотя метод $.getJSON в jQuery проблем не вызывает), посему ничего сказать не могу, но eval(d) не верно, если вы хотите получить JSON-объект сами, это делается так:
var obj = eval('('+d+');');

>но если эту ссылку передать не через сервер а напрямую прописать в JS вот так
>$("#result").html('<a href="http://www.site.ru">Перейти на...
>то всё срабатывает нормально.

Но а с чего бы ей не работать, это просто вставка HTML-кода в объект, но это совсем иное.

  Ответить  
 
 автор: web777   (23.03.2010 в 16:26)   письмо автору
 
   для: sim5   (23.03.2010 в 08:01)
 

вот в чём проблема, выяснил:)


error - Invalid JSON: { "msg":"<b>Даные</b> <i>были сохранены успе"шн"о</i><a href="t">IE</a><table><tbody><tr>
    <td>text</td></tr></tbody></table>", "status":"ok" }


данные формируются не верно для JSON тоесть не валидно, строка не должна содержать переносов строк, также некоторые символы, пришлось экранировать

я решил снова перечитать статью что тут http://wwwadmin.ru/forum/sutra3629.html

и там было написано что нужно отправлять ответ сервера через textarea

<textarea> 
Код скрипта или JSON-объект
</textarea>


в PHP скрипте изменил на это


<?php
 $res2
['msg'] = str_replace("\r\n",""$res2['msg']);
 
$res2['msg'] = str_replace(array("\n","\r","\t"),"",$res2['msg']);

 
$res2['msg'] = addslashes($res2['msg']);

 echo 
"<textarea>\n";
 echo 
'{ "msg":"'.$res2['msg'].'", "status":"'.$res2['err'].'" }';
 echo 
"</textarea>\n";
?>


пришлось обработать переменную от строк переноса, а также экранировал символы, иначе через JSON не пройдёт и будет выдавать ошибку. После этого всё стало прекрасно работать:)

конечно формируемый HTML код получается обработанный, в одну строку, специальные символы экранированы, также код не должен содержать поле textarea. В прочем это не столько важно, тут всего будет небольшой ответ от сервера ввиде HTML кода, которого не так много будет, этого в пол не достаточно для обычного сообщения.


И остался последний вопрос, поскольку будет не одна форма, и не обязательно на одной странице несколько, то не хотелось под каждую форму писать/копировать этот код, решил сделать виде отдельной функцией, потом только передавать id формы через параметр id.

Вот пример того как сделал


<script type="text/javascript">

function myAjaxForm(id) {

   $("#"+id).ajaxForm({

      dataType: "json",
      beforeSubmit: function(dataFrm) {

         $("#result").html("Загрузка...");
         $("#go").enable(false); // Деактивируем кнопку
      },
      success: function(d) { // При отсутствии ошибки

            $("#go").enable(true); // Делаем кнопку активной

            if(d.status == "ok"){

               $("#result").html(d.msg);
               $("#frm").hide('normal');

            }else{

               $("#result").html(d.msg);

            }

      },
      error: function(xhr, status, errMsg) {
         //alert(status+' - '+errMsg)
         $("#result").html("Произошла ошибка");
         $("#go").enable(true); // Делаем кнопку активной
      },
      resetForm: true
   });
}
</script>


<form id="frm" action="ajax.php" 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="300000000">
<input type="file" name="file_name" id="file_name"><br><br>
<input type="submit" name="go" id="go" onclick="myAjaxForm('frm');" value="Загрузить файл">
</form>

<b>Ответ сервера:</b><br>
<div id="result"></div>


по примеру видно что я весь JS код поместил в функцию myAjaxForm(id) а внутри формы для кнопки прописал её onclick="myAjaxForm('frm');" теперь после нажатии на кнопку, функция отправит данные полей формы id="frm"
Проверил во всех браузерах работает нормально, единственное в IE8 при повторном нажатии кнопки, появляется в отладчике такая ошибка

'null' -  есть null или не является объектом  jquery-1.4.2.js, строка 1919 символ 45


где строка 1919
var events = jQuery.data(this, "events"), handlers = events[ event.type ];


и символ 45 указывает на первую букву слова handlers

что может быть и как от этого избавится?

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования