Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   проблемы с jQuery.parseJSON (https://javascript.ru/forum/jquery/45341-problemy-s-jquery-parsejson.html)

xTODx 24.02.2014 17:21

проблемы с jQuery.parseJSON
 
Вложений: 1
Всем привет, было сделано скрипт, который подгружает на страницу материалы при скроле.

$(document).ready(function(){

/* Переменная-флаг для отслеживания того, происходит ли в данный момент ajax-запрос. В самом начале даем ей значение false, т.е. запрос не в процессе выполнения */    
var inProgress = false;
/* С какой статьи надо делать выборку из базы при ajax-запросе */ 
var startFrom = 10;

    /* Используйте вариант $('#more').click(function() для того, чтобы дать пользователю возможность управлять процессом, кликая по кнопке "Дальше" под блоком статей (см. файл index.php) */
    $('#more').click(function(){
		loads();
		});
	function loads(){
		 $.ajax({            
            /* адрес файла-обработчика запроса */
            url: 'obrabotchik.php',
            /* метод отправки данных */
            method: 'POST',
            /* данные, которые мы передаем в файл-обработчик */
            data: {"startFrom" : startFrom},
            /* что нужно сделать до отправки запрса */
            beforeSend: function() {
            /* меняем значение флага на true, т.е. запрос сейчас в процессе выполнения */
            inProgress = true;}
            /* что нужно сделать по факту выполнения запроса */            
            }).done(function(data){
            
            /* Преобразуем результат, пришедший от обработчика - преобразуем json-строку обратно в массив */ 
            data = jQuery.parseJSON(data);
            
            /* Если массив не пуст (т.е. статьи там есть) */
            if (data.length > 0) {
                
            /* Делаем проход по каждому результату, оказвашемуся в массиве,
            где в index попадает индекс текущего элемента массива, а в data - сама статья */                 
            $.each(data, function(index, data){
            
            /* Отбираем по идентификатору блок со статьями и дозаполняем его новыми данными */    
            $("#pages").append("<p id='newmat"+ data.id +"' class = 'data' style = 'height:0px; opacity:0;'><b>" + data.title + "</b><br />" + data.id + "</p>");
			$('#newmat'+ data.id).stop().animate({ opacity: "1", height: '50px'}, 1000);
            });
            
            /* По факту окончания запроса снова меняем значение флага на false */
            inProgress = false;
            // Увеличиваем на 10 порядковый номер статьи, с которой надо начинать выборку из базы
            startFrom += 10;
            }});   
		
		};
	$(window).scroll(function() {
        
        /* Если высота окна + высота прокрутки больше или равны высоте всего документа и ajax-запрос в настоящий момент не выполняется, то запускаем ajax-запрос */
        if($(window).scrollTop() + $(window).height() >= $(document).height() && !inProgress) {
       	loads();
        }
    });
});


это был тестовый вариант, и всё работало.
Вот сегодня начал переносить это чудо на основной проект.
Итог - не работает.
Хром пишет как на прикреплённой картинке.
Вот код который ставлю в проект
$(document).ready(function(){
/* Переменная-флаг для отслеживания того, происходит ли в данный момент ajax-запрос. В самом начале даем ей значение false, т.е. запрос не в процессе выполнения */    
var inProgress = false;
/* С какой статьи надо делать выборку из базы при ajax-запросе */ 
var startFrom = 0;
loads();
    /* Используйте вариант $('#more').click(function() для того, чтобы дать пользователю возможность управлять процессом, кликая по кнопке "Дальше" под блоком статей (см. файл index.php) */
    $('#more').click(function(){
		loads();
		});
	function loads(){
		 $.ajax({            
            /* адрес файла-обработчика запроса */
            url: '/controller/cpartfolio.php',
            /* метод отправки данных */
            method: 'POST',
            /* данные, которые мы передаем в файл-обработчик */
            data: {"startFrom" : startFrom},
            /* что нужно сделать до отправки запрса */
            beforeSend: function() {
            /* меняем значение флага на true, т.е. запрос сейчас в процессе выполнения */
            inProgress = true;}
            /* что нужно сделать по факту выполнения запроса */            
            }).done(function(data){
            /* Преобразуем результат, пришедший от обработчика - преобразуем json-строку обратно в массив */ 
            data = jQuery.parseJSON(data);
            
            /* Если массив не пуст (т.е. статьи там есть) */
            if (data.length > 0) {
                
            /* Делаем проход по каждому результату, оказвашемуся в массиве,
            где в index попадает индекс текущего элемента массива, а в data - сама статья */                 
            $.each(data, function(index, data){
            
            /* Отбираем по идентификатору блок со статьями и дозаполняем его новыми данными */    
            $("#pages").append("<p id='newmat"+ data.id +"' class = 'data' style = 'height:0px; opacity:0;'><b>" + data.name + "</b><br />" + data.id + "</p>");
			$('#newmat'+ data.id).stop().animate({ opacity: "1", height: '50px'}, 1000);
            });
            
            /* По факту окончания запроса снова меняем значение флага на false */
            inProgress = false;
            // Увеличиваем на 10 порядковый номер статьи, с которой надо начинать выборку из базы
            startFrom += 10;
            }});   
		
		};
	$(window).scroll(function() {
        
        /* Если высота окна + высота прокрутки больше или равны высоте всего документа и ajax-запрос в настоящий момент не выполняется, то запускаем ajax-запрос */
        if($(window).scrollTop() + $(window).height() >= $(document).height() && !inProgress) {
       	loads();
        }
    });
});// JavaScript Document

HELP! в чём проблема?

xTODx 24.02.2014 17:22


danik.js 24.02.2014 17:31

xTODx, а покажи ответ сервера (вкладка Network).

xTODx 24.02.2014 23:20


Держите

danik.js 24.02.2014 23:27

Блин, всему учить..
Кликни по запросу, и там выбери вкладку Response - это и есть ответ сервера.
И сразу вопрос - почему у тебя Type идет text/html, а не application/json?
Если ты передаешь json, разве не логично выставить правильный заголовок?

Цитата:

Сообщение от xTODx
data = jQuery.parseJSON(data);

Если в вызов $.ajax передать параметр dataType: 'json', то jquery сама распарсит ответ, и необходимость в этой строчке отпадет.

xTODx 24.02.2014 23:39

<!--error--><br />
<b>Warning</b>:  require_once(/models/mpartfolio.php) [<a href='function.require-once'>function.require-once</a>]: failed to open stream: No such file or directory in <b>Z:\home\mycms\www\controller\cpartfolio.php</b> on line <b>2</b><br />
<script language=JavaScript src='/denwer/errors/phperror_js.php'></script><!--error--><br />
<b>Fatal error</b>:  require_once() [<a href='function.require'>function.require</a>]: Failed opening required '/models/mpartfolio.php' (include_path='.;C:\php\pear') in <b>Z:\home\mycms\www\controller\cpartfolio.php</b> on line <b>2</b><br />
<script language=JavaScript src='/denwer/errors/phperror_js.php'></script>



понял что не хочет подключать файлы, но... как с этим бороться?? эти файлы есть по пути site/models/mpartfolio.php допустим...

xTODx 25.02.2014 00:06

он пути считает со своего места положения что ли? хотя указано всё с корневого каталога везде...

xTODx 25.02.2014 00:07

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

danik.js 25.02.2014 00:43

Цитата:

Сообщение от xTODx
можно ли сделать по другому??? подключить на прямую этот файл, а в обработчике вызывать просто функцию??

От тебя:
1) структура каталогов и файлов
2) зависимости между файлами
Иначе мы не вкурсе че там у тебя и как.

xTODx 25.02.2014 01:04

папки в корне сайта
/controller
/js
/models
/views
/config
скрипт лежит в js, он открывается в файле который лежит в папке views.
js тянет файл с папки /controllers
в этот файл подключается файл с папки /models, в котором отправляется запрос к базе.
А что если я сразу подключу файл с папки сontrollers, а через обработчик ajah буду вызывать функцию? реально ли так?

danik.js 25.02.2014 01:32

Цитата:

Сообщение от xTODx
require_once(/models/mpartfolio.php)

И ты думаешь что так указал путь от корня твоего сайта? Да нифига подобного. PHP и знать не знает где там у тебя корень сайта. Откуда ему знать? Он работает с файловой системой, а не вебсервером. А корень файловой системы - это корень диска.
Тебе нужно указывать относительный путь: ../models/bla.php (две точки - это выход в вышестоящий каталог)

xTODx 25.02.2014 15:54

<?php
class Config{
function __construct() { // конструктор загружает в $APP_PATH путь к проекту
			$this->APP_PATH = dirname(dirname(__FILE__)) ;
		}
}
$config = new Config() ;
?>

require_once "{$config->APP_PATH}/models/mcreateedit.php" ;

xTODx 25.02.2014 16:09

вот так делаю... но на сколько я понимаю, JS пофиг на данные с php:) так ведь?

danik.js 25.02.2014 16:23

Цитата:

Сообщение от xTODx
JS пофиг на данные с php так ведь?

Всем на все пофиг. Это же общеизвестно.

xTODx 25.02.2014 16:31

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

danik.js 25.02.2014 16:47

Цитата:

Сообщение от xTODx
ну тогда извиняюсь

За че? Ты че-то непонятное спросил - я че-то непонятное ответил, не более.
Цитата:

Сообщение от xTODx
он будет видеть эти функции

О каких функциях речь?

xTODx 25.02.2014 19:52

<?php 
<?php 
$_POST['startFrom'];
	require_once "../config/db.php" ;
	class Mpartjs extends Db {
		function list_partjs($startFrom) {
			$sql = "SELECT id,name,cost,img FROM partfolio ORDER BY time DESC LIMIT ".$startFrom.",10" ;
			$res = $this->sql($sql) ;
			while($part = mysql_fetch_array($res)) {
				$all_row[] = $part  ;
				
			}
			return $all_row ;
		}
				function list_categjs($_GET, $startFrom) {
			$sql = "SELECT id,name,cost,img FROM partfolio  WHERE category='".$_GET['partfolio']."' ORDER BY time DESC LIMIT ".$startFrom.",10" ; 
			$res = $this->sql($sql) ;
			while($part = mysql_fetch_array($res)) {
				$all_row[] = $part  ;
				
			}
			return $all_row ;
		}
		
	}
	$jspart = new Mpartjs();
	if($_GET['partfolio'] == ''){
	$ppage = $jspart->list_partjs($_POST['startFrom']);
	}else{ 
	$ppage = $jspart->list_categjs($_GET, $_POST['startFrom']);
	}
	echo json_encode($ppage);
	
?>
?>


$(document).ready(function(){
/* Переменная-флаг для отслеживания того, происходит ли в данный момент ajax-запрос. В самом начале даем ей значение false, т.е. запрос не в процессе выполнения */    
var inProgress = false;
/* С какой статьи надо делать выборку из базы при ajax-запросе */ 
var startFrom = 1;
loads();
    /* Используйте вариант $('#more').click(function() для того, чтобы дать пользователю возможность управлять процессом, кликая по кнопке "Дальше" под блоком статей (см. файл index.php) */
    $('#more').click(function(){
		loads();
		});
	function loads(){
		 $.ajax({            
            /* адрес файла-обработчика запроса */
            url: '/js/obrabotchik.php',
            /* метод отправки данных */
            method: 'POST',
            /* данные, которые мы передаем в файл-обработчик */
            data: {"startFrom" : startFrom},
			dataType: 'json',
            /* что нужно сделать до отправки запрса */
            beforeSend: function() {
            /* меняем значение флага на true, т.е. запрос сейчас в процессе выполнения */
            inProgress = true;}
            /* что нужно сделать по факту выполнения запроса */            
            }).done(function(data){
            /* Преобразуем результат, пришедший от обработчика - преобразуем json-строку обратно в массив */ 
          //  data = jQuery.parseJSON(data);
            alert (1);
            /* Если массив не пуст (т.е. статьи там есть) */
            if (data.length > 0) {
                
            /* Делаем проход по каждому результату, оказвашемуся в массиве,
            где в index попадает индекс текущего элемента массива, а в data - сама статья */                 
            $.each(data, function(index, data){
            alert (1);
            /* Отбираем по идентификатору блок со статьями и дозаполняем его новыми данными */    
            $("#partfolios").append("<div id='newmat' class='partfolios' style = 'height:0px; opacity:0;'><b>" + data.name + "</b><br />" + data.id + "</div>");
			$('#newmat'+ data.id).stop().animate({ opacity: "1", height: '50px'}, 1000);
            });
            
            /* По факту окончания запроса снова меняем значение флага на false */
            inProgress = false;
            // Увеличиваем на 10 порядковый номер статьи, с которой надо начинать выборку из базы
            startFrom += 10;
			alert (startFrom);
            }});   
		
		};
	$(window).scroll(function() {
        
        /* Если высота окна + высота прокрутки больше или равны высоте всего документа и ajax-запрос в настоящий момент не выполняется, то запускаем ajax-запрос */
        if($(window).scrollTop() + $(window).height() >= $(document).height() && !inProgress) {
       	loads();
        }
    });
});

ничего не работает всё-равно. в хроме ошибок в network=>respons нет (данные запроса него показывает), то есть дело не в php.

xTODx 25.02.2014 19:58

всё стаёт сразу после ajax. алерты подставил для проверки. Они не выполняются уже.

danik.js 25.02.2014 21:57

Так запрос происходит? Ответ приходит? Ответом приходит валидный JSON? Ты это проверил во вкладке Сеть?
Почему я должен повторять свои вопросы?

xTODx 25.02.2014 23:58

запрос происходит во вкладке сеть я проверил, запрос прошёл.
Выводит


но на этом всё.. ничего не добавило

danik.js 26.02.2014 00:16

Ошибок в консоль точно не сыплются? Код ответа 200 ОК?
Че за красная точка у тебя?
Не может вот так молча не работать код. Должна выпадать ошибка в консоль.

xTODx 26.02.2014 00:24

Вот консоль.

danik.js 26.02.2014 00:30

Добавь обработку ошибок .fail()

xTODx 26.02.2014 00:34

хорошо, куда добавить? на $.ajax ???(если да, то попробовал. ничего не поменялось)

danik.js 26.02.2014 00:41

Цитата:

Сообщение от xTODx
если да, то попробовал. ничего не поменялось

Да, также как и .done(). done() и fail() - это методы промиса, который нам предоставляет метод $.ajax()

Ты надеюсь добавил в fail() какой-нибудь алерт, чтоб видеть вызов callback'а ?

xTODx 26.02.2014 01:05

обидно, стыдно, попробуем

xTODx 26.02.2014 01:12

.fail(function (jqXHR, textStatus){alert (jqXHR + textStatus);});
если так, то имеем [object Object] parsererror

xTODx 26.02.2014 15:58

data = jQuery.parseJSON(data);

я же это убрал.. И сделал как вы говорили, добавил в $.ajax - dataType: 'json'.
.done не выполняется

danik.js 27.02.2014 05:09

Цитата:

Сообщение от xTODx
если так, то имеем [object Object] parsererror

Вот она и разгадка. Судя по следующему комменту, до тебя это не дошло :)
Все-таки у тебя невалидный JSON - проверяй внимательней.

xTODx 27.02.2014 18:30

что проверять всё-таки?( в тестовом варианте ведь работало

danik.js 27.02.2014 18:41

Цитата:

Сообщение от xTODx
что проверять всё-таки?

Проверять что ответ сервера - валидный JSON. Можешь просто скопировать ответ и вставить в консоль - если ошибки нет - все ок.

А можешь убрать dataType: 'json', и распарсить через $.parseJSON в done()

xTODx 27.02.2014 21:18

data = jQuery.parseJSON(data);

было же так в начале..
в общем вернул, выдало ошибочку

xTODx 27.02.2014 21:56

ещё заметил, в тестовом варианте все операции с sqli а в том что я проверяю sql. возможно это играет большую роль. потому что на тестовом варианте поставил в sqli вместо sql, работать перестало

danik.js 27.02.2014 23:25

Цитата:

Сообщение от xTODx
было же так в начале..
в общем вернул, выдало ошибочку

И че? Это чтобы ты увидил ошибку. Можно было просто сделать console.error(error) в .fail() но так как ты нихрена не дружишь с консолью я предложил тебе временный вариант чтоб выловить ошибку.

xTODx 28.02.2014 00:28

ну вот, выявлено примерно где она.. но в чём причина не знаю...

xTODx 01.03.2014 10:10

просто где то создаётся конфликт, ибо один и тот же код, не работает на сайте. а в тестовом документе работает

xTODx 01.03.2014 10:36

$(document).ready(function(){

/* Переменная-флаг для отслеживания того, происходит ли в данный момент ajax-запрос. В самом начале даем ей значение false, т.е. запрос не в процессе выполнения */    
var inProgress = false;
/* С какой статьи надо делать выборку из базы при ajax-запросе */ 
var startFrom = 1;

    /* Используйте вариант $('#more').click(function() для того, чтобы дать пользователю возможность управлять процессом, кликая по кнопке "Дальше" под блоком статей (см. файл index.php) */
    $('#more').click(function(){
		loads();
		});
	function loads(){
		 $.ajax({           
            /* адрес файла-обработчика запроса */
            url: 'obrabotchik.php',
            /* метод отправки данных */
            method: 'POST',
			dataType: 'json', 
            /* данные, которые мы передаем в файл-обработчик */
            data: {"startFrom" : startFrom,
			success: function(jsondata){
			alert(jsondata);
    		add(jsondata);
  			}
			},
            /* что нужно сделать до отправки запрса */
            beforeSend: function() {
            /* меняем значение флага на true, т.е. запрос сейчас в процессе выполнения */
            inProgress = true;}
            /* что нужно сделать по факту выполнения запроса */            
            });   
		
		};
		function add(data){
            alert(1);
            /* Преобразуем результат, пришедший от обработчика - преобразуем json-строку обратно в массив */ 
            
            /* Если массив не пуст (т.е. статьи там есть) */
            if (data.length > 0) {
                
            /* Делаем проход по каждому результату, оказвашемуся в массиве,
            где в index попадает индекс текущего элемента массива, а в data - сама статья */                 
           	 $.each(data, function(index, data){
            
            /* Отбираем по идентификатору блок со статьями и дозаполняем его новыми данными */    
      		      $("#partfolio").append("<p id='newmat"+ data.id +"' class = 'data' style = 'height:0px; opacity:0;'><b>" + data.name+ "</b><br />" + data.id + "</p>");
					$('#newmat'+ data.id).stop().animate({ opacity: "1", height: '50px'}, 1000);
          	  });
            
            /* По факту окончания запроса снова меняем значение флага на false */
            inProgress = false;
            // Увеличиваем на 10 порядковый номер статьи, с которой надо начинать выборку из базы
            startFrom += 10;
            }
		}
		
	$(window).scroll(function() {
        
        /* Если высота окна + высота прокрутки больше или равны высоте всего документа и ajax-запрос в настоящий момент не выполняется, то запускаем ajax-запрос */
        if($(window).scrollTop() + $(window).height() >= $(document).height() && !inProgress) {
       	loads();
        }
    });
});

сделал так, но json undifined :(

danik.js 01.03.2014 11:33

Ну ты лох. Ты нафига success запихал в data? :D

xTODx 01.03.2014 13:14

:stop: :-E :lol: ахах, всё реально как у лоха вышло)
в общем начал всё с нуля писать сразу в сайте, и в обще нашёл причину))
если к обработчику подключаю файл с настройками б.д., то выводит кружочек, и ajax не работает далее))
а если не подключаю, то всё окей. правда я вот не знаю почему оно думает, что там ошибка

danik.js 01.03.2014 13:24

Цитата:

Сообщение от xTODx
и ajax не работает далее

Ты че, до сих пор не научился работать с Developer Tools?
Тыж вроде мне скриншоты даже показывал, забыл чтоли?


Часовой пояс GMT +3, время: 14:32.