Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > JavaScript, Ajax
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.01.2015, 09:19   #1
Erilar
Пользователь
 
Регистрация: 03.01.2015
Сообщений: 20
Вопрос ajax срабатывает со второго раза

Есть файлы:
main.php:
Код HTML:
<html>	
<head>	
	<script type="text/javascript" src="scripts.js"></script>	
</head>
<body>
<ul>
    <li><a href="#" class="nav" id="news">первая</a></li>
    <li><a href="#" class="nav" id="news2">вторая</a></li>
</ul>
   <section>
<? include "news.php" ?>
   </section>

<?
$crs = trim(strip_tags($_POST['crs']));

if(file_exists($crs.'.php'))
{ 	
	include($crs.'.php');
}
else
{		
	include('news.php');
}
?>


</body>
</html>
-----------------------------
scripts.js:
Код HTML:
$(document).ready(function(){//загрузка контента (для main.php)
    $('.nav').click(function(){ 
        var clkid = this.id; 

            $.ajax({ 
                type: "POST",
                url: "main.php",
                data: "crs="+clkid,
                success: function(data){ 
                $("section").html(data);
                history.replaceState(null, null, "cont="+clkid);
                },beforeSend: function(){                       
                    $("#loader").css("display", "block");
                }
            }).done(function(data){                
                $("#loader").css("display", "none");
                window.scrollTo(0,600);  
                });
        return false; 
    });
});//загрузка контента (для main.php)

$(document).ready(function(){//загрузка Полной новости (для news.php)
    $('.view').click(function(){ 
        var clkid = this.id; 
            $.ajax({ 
                type: "POST",
                url: "view.php",
                data: "id="+clkid,
                success: function(html){ 
                $("section").html(html);
                history.pushState(null, null, url);
                window.scrollTo(0,600);
                }
            });
        return false; 
    });
});//загрузка Полной новости (для news.php)
-----------------------------------
news.php
В этом файле из базы данных вытягиваются статьи типа:
Код HTML:
<h3>Заголовок</h3>
<p>текст</p>
<a href="#" class="view" id="id статьи">подробнее</a>
При нажатии на ссылку, в этом же файле обработчик вытаскивает текст полной статьи
--------------------------------------
Проблема вот в чем:
При загрузке страницы загружается news.php и, при нажатии на "подробнее", в "section" загружается полная статья. Всё правильно. Но, когда нажимаю на ссылку
Код HTML:
<ul>
    <li><a href="#" class="nav" id="news">первая</a></li>
    <li><a href="#" class="nav" id="news2">вторая</a></li>
</ul>
"первая", чтобы загрузить news.php в "section", всё загружается хорошо, но ссылка "подробнее" перезагружает всю страницу.

Последний раз редактировалось Erilar; 04.01.2015 в 12:32.
Erilar вне форума Ответить с цитированием
Старый 04.01.2015, 09:49   #2
Gorychev
Участник клуба
 
Аватар для Gorychev
 
Регистрация: 08.03.2008
Сообщений: 1,537
По умолчанию

Хм.., а чего у вас ссыль "подробнее" с классом id? И еще, так-как этот контент выплевывается динамически на страницу, обычный onclick не привязан к нему. Для того чтобы работало, нужно привязать это событие методом on или явно указывать функцию обработчик onclick="myFunction();"
В общем, я как-то так это вижу:
Код:
<a href="#" class="view" id="id статьи">подробнее</a>
.........
$('.view').on('click', function(){
        var clkid = this.id; 
            $.ajax({ 
                type: "POST",
                url: "view.php",
                data: "id="+clkid,
                success: function(html){ 
                $("section").html(html);
                history.pushState(null, null, url);
                window.scrollTo(0,600);
                }
            });
        return false; 
    });

Последний раз редактировалось Gorychev; 04.01.2015 в 10:07.
Gorychev вне форума Ответить с цитированием
Старый 04.01.2015, 12:32   #3
Erilar
Пользователь
 
Регистрация: 03.01.2015
Сообщений: 20
По умолчанию

Просто пример для вопроса написал вручную, вместо id нужно view написать.
Объясните пожалуйста чем отличается "$('.view').on('click', function(){"
от "$('.view').click(function(){ ".

Цитата:
Сообщение от Gorychev Посмотреть сообщение
В общем, я как-то так это вижу:
Код:
$('.view').on('click', function(){
Сделал. Но не помогло...

Последний раз редактировалось Stilet; 04.01.2015 в 14:40.
Erilar вне форума Ответить с цитированием
Старый 04.01.2015, 13:53   #4
Naive
Раздолбайских Дел
Старожил
 
Аватар для Naive
 
Регистрация: 22.05.2009
Сообщений: 3,828
По умолчанию

Нужно вешать живое событие на статичный блок, который будет ловить всплывание от динамических дочерних по селектору (это если тонкости курить будешь, что гуглить).
Код:
$('body').on('click','.view',function(){ /*...*/ })
Здесь тело документа выступает этим статичным блоком, клик - отлавливаемое событие, класс вью - где ищем событие, дальше все также.
Это синтаксис молодых версий jQuery, в старых вместо этого использовались методы .live и/или .delegate, но работали они криво-косо, посему от них отказались.
Alar, верни репу!
Naive вне форума Ответить с цитированием
Старый 04.01.2015, 14:05   #5
Erilar
Пользователь
 
Регистрация: 03.01.2015
Сообщений: 20
По умолчанию

Спасибо! Работает.
Цитата:
Сообщение от Naive Посмотреть сообщение
Код:
$('body').on('click','.view',function(){ /*...*/ })
Не повлияет ли такой способ на быстродействие? (извините если чушь ляпнул)
Erilar вне форума Ответить с цитированием
Старый 04.01.2015, 17:14   #6
Naive
Раздолбайских Дел
Старожил
 
Аватар для Naive
 
Регистрация: 22.05.2009
Сообщений: 3,828
По умолчанию

Цитата:
Сообщение от Erilar Посмотреть сообщение
Не повлияет ли такой способ на быстродействие? (извините если чушь ляпнул)
Не в таких объемах.
Alar, верни репу!
Naive вне форума Ответить с цитированием
Старый 04.01.2015, 18:42   #7
Erilar
Пользователь
 
Регистрация: 03.01.2015
Сообщений: 20
Вопрос

Цитата:
Сообщение от Naive Посмотреть сообщение
Не в таких объемах.
А в таких?
Код HTML:
$(document).ready(function(){
$('body').on('click','.nav', function(){
var clkid = this.id;
$.ajax({
type: "POST",
url: "/cont/main.php",
data: "crs="+clkid,
success: function(data){ 
$("section").html(data);
history.replaceState(null, null, "?option=main&cont="+clkid);
},beforeSend: function(){                       
$("#loader").css("display", "block");
}
}).done(function(data){                
$("#loader").css("display", "none");
window.scrollTo(0,580);  
});
return false; 
});
});

$(document).ready(function(){
$('body').on('click','.view', function(){
var clkid = this.id; 
$.ajax({ 
type: "POST",
url: "../../cont/view.php",
data: "id_text="+clkid,
success: function(html){ 
$("section").html(html);
history.pushState(null, null, "?option=main&cont=view&id_text="+clkid);
},beforeSend: function(){                       
$("#loader").css("display", "block");
}
}).done(function(data){                
$("#loader").css("display", "none");
window.scrollTo(0,580);  
});
return false; 
});
});

$(document).ready(function(){
$('body').on('click','.g_news', function(){
var clkid = this.id; 
$.ajax({ 
type: "POST",
url: "../../cont/group_news.php",
data: "page="+clkid,
success: function(html){ 
$("section").html(html);
history.pushState(null, null, "?option=main&cont=group_news&page="+clkid);
},beforeSend: function(){                       
$("#loader").css("display", "block");
}
}).done(function(data){                
$("#loader").css("display", "none");
window.scrollTo(0,580);  
});
return false; 
});
});

$(document).ready(function(){
$('body').on('click','.a_news', function(){
var clkid = this.id; 
$.ajax({ 
type: "POST",
url: "../../cont/all_news.php",
data: "page="+clkid,
success: function(html){ 
$("section").html(html);
history.pushState(null, null, "?option=main&cont=all_news&page="+clkid);
},beforeSend: function(){                       
$("#loader").css("display", "block");
}
}).done(function(data){                
$("#loader").css("display", "none");
window.scrollTo(0,580);  
});
return false; 
});
});

$(document).ready(function(){
$('body').on('click','.disk', function(){
var clkid = this.id; 
$.ajax({ 
type: "POST",
url: "/cont/disk.php",
data: "id="+clkid,
success: function(html){ 
$("section").html(html);
history.pushState(null, null, "?option=main&cont=disk&id="+clkid);
},beforeSend: function(){                       
$("#loader").css("display", "block");
}
}).done(function(data){                
$("#loader").css("display", "none");
window.scrollTo(0,580);  
});
return false; 
});
});

$(document).ready(function(){
$('body').on('click','.del_wall', function(){
var clkid = this.id; 
$.ajax({ 
type: "POST",
url: "/cont/profile.php",
data: "id_val="+clkid,
success: function(html){ 
$("section").html(html);
history.pushState(null, null, "?option=main&cont=profile");
},beforeSend: function(){                       
$("#loader").css("display", "block");
}
}).done(function(data){                
$("#loader").css("display", "none");
window.scrollTo(0,580);  
});
return false; 
});
});

$(document).ready(function(){
$('body').on('click','.song', function(){
var clkid = this.id; 
$.ajax({ 
type: "POST",
url: "/cont/song.php",
data: "id="+clkid,
success: function(html){ 
$("section").html(html);
history.pushState(null, null, "?option=main&cont=song&id="+clkid);
},beforeSend: function(){                       
$("#loader").css("display", "block");
}
}).done(function(data){                
$("#loader").css("display", "none");
window.scrollTo(0,580);  
});
return false; 
});
});
Erilar вне форума Ответить с цитированием
Старый 05.01.2015, 05:04   #8
Naive
Раздолбайских Дел
Старожил
 
Аватар для Naive
 
Регистрация: 22.05.2009
Сообщений: 3,828
По умолчанию

И в таких не страшно, тупить может начать на таблицах с 100к+ строками (по слухам)
Сам я таких шедевров не вершил еще.
пс. код я бы оптимизировал, выбросив функцию с аяксом отдельно, разбив логику по параметрам, ужмется раз в ~7. Основные блоки можно закешировать, а статичным вешать обычные события, не живые.
Alar, верни репу!
Naive вне форума Ответить с цитированием
Старый 06.01.2015, 11:15   #9
Erilar
Пользователь
 
Регистрация: 03.01.2015
Сообщений: 20
По умолчанию

Цитата:
Сообщение от Naive Посмотреть сообщение
пс. код я бы оптимизировал
Можно пример? Голова не соображает уже...
Erilar вне форума Ответить с цитированием
Старый 06.01.2015, 11:48   #10
Naive
Раздолбайских Дел
Старожил
 
Аватар для Naive
 
Регистрация: 22.05.2009
Сообщений: 3,828
По умолчанию

Да так оставь, ничего страшного.
Alar, верни репу!
Naive вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Уведомление о создании файла срабатывает 2 раза HellMercenariess Общие вопросы Delphi 4 07.06.2013 19:22
Меню второго уровня. artur7373888 HTML и CSS 0 05.02.2013 22:45
Комп заводится со второго или третьего раза victorshkoda Компьютерное железо 32 14.04.2012 18:59
Выход из аккаунта, сесии удаляются со второго раза gufon PHP 5 04.05.2011 22:54
Загружается со второго раза Xardas Компьютерное железо 10 10.03.2008 08:51