проблемы с 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, а покажи ответ сервера (вкладка Network).
|
![]() Держите |
Блин, всему учить..
Кликни по запросу, и там выбери вкладку Response - это и есть ответ сервера. И сразу вопрос - почему у тебя Type идет text/html, а не application/json? Если ты передаешь json, разве не логично выставить правильный заголовок? Цитата:
|
<!--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 допустим... |
он пути считает со своего места положения что ли? хотя указано всё с корневого каталога везде...
|
можно ли сделать по другому??? подключить на прямую этот файл, а в обработчике вызывать просто функцию??
|
Цитата:
1) структура каталогов и файлов 2) зависимости между файлами Иначе мы не вкурсе че там у тебя и как. |
папки в корне сайта
/controller /js /models /views /config скрипт лежит в js, он открывается в файле который лежит в папке views. js тянет файл с папки /controllers в этот файл подключается файл с папки /models, в котором отправляется запрос к базе. А что если я сразу подключу файл с папки сontrollers, а через обработчик ajah буду вызывать функцию? реально ли так? |
Цитата:
Тебе нужно указывать относительный путь: ../models/bla.php (две точки - это выход в вышестоящий каталог) |
<?php
class Config{
function __construct() { // конструктор загружает в $APP_PATH путь к проекту
$this->APP_PATH = dirname(dirname(__FILE__)) ;
}
}
$config = new Config() ;
?>
require_once "{$config->APP_PATH}/models/mcreateedit.php" ; |
вот так делаю... но на сколько я понимаю, JS пофиг на данные с php:) так ведь?
|
Цитата:
|
ну тогда извиняюсь, просто думал что если php обработчик вызывается, то он будет видеть эти функции.. попробуем сейчас по новой..)
|
Цитата:
Цитата:
|
<?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. |
всё стаёт сразу после ajax. алерты подставил для проверки. Они не выполняются уже.
|
Так запрос происходит? Ответ приходит? Ответом приходит валидный JSON? Ты это проверил во вкладке Сеть?
Почему я должен повторять свои вопросы? |
|
Ошибок в консоль точно не сыплются? Код ответа 200 ОК?
Че за красная точка у тебя? Не может вот так молча не работать код. Должна выпадать ошибка в консоль. |
|
Добавь обработку ошибок .fail()
|
хорошо, куда добавить? на $.ajax ???(если да, то попробовал. ничего не поменялось)
|
Цитата:
Ты надеюсь добавил в fail() какой-нибудь алерт, чтоб видеть вызов callback'а ? |
обидно, стыдно, попробуем
|
.fail(function (jqXHR, textStatus){alert (jqXHR + textStatus);});
если так, то имеем [object Object] parsererror |
data = jQuery.parseJSON(data); я же это убрал.. И сделал как вы говорили, добавил в $.ajax - dataType: 'json'. .done не выполняется |
Цитата:
Все-таки у тебя невалидный JSON - проверяй внимательней. |
что проверять всё-таки?( в тестовом варианте ведь работало
|
Цитата:
А можешь убрать dataType: 'json', и распарсить через $.parseJSON в done() |
|
ещё заметил, в тестовом варианте все операции с sqli а в том что я проверяю sql. возможно это играет большую роль. потому что на тестовом варианте поставил в sqli вместо sql, работать перестало
|
Цитата:
|
ну вот, выявлено примерно где она.. но в чём причина не знаю...
|
просто где то создаётся конфликт, ибо один и тот же код, не работает на сайте. а в тестовом документе работает
|
$(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 :( |
Ну ты лох. Ты нафига success запихал в data? :D
|
:stop: :-E :lol: ахах, всё реально как у лоха вышло)
в общем начал всё с нуля писать сразу в сайте, и в обще нашёл причину)) если к обработчику подключаю файл с настройками б.д., то выводит кружочек, и ajax не работает далее)) а если не подключаю, то всё окей. правда я вот не знаю почему оно думает, что там ошибка |
Цитата:
Тыж вроде мне скриншоты даже показывал, забыл чтоли? |
| Часовой пояс GMT +3, время: 13:34. |