Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   Выполнение JS в страницах подгруженных через ajax (https://javascript.ru/forum/jquery/57189-vypolnenie-js-v-stranicakh-podgruzhennykh-cherez-ajax.html)

Mikhail1989 23.07.2015 12:08

Выполнение JS в страницах подгруженных через ajax
 
Подскажите как можно сделать. Есть такой скрипт
$(document).ready(function(){
    
                $('a').click(function(e){
                    e.preventDefault();
                    var link = $(this).attr('href');
                    $.ajax({
                        type:'post',
                        url: link,
                        success: function(mes){
                            $('#content').html(mes);
                            
                        }
                    })
                })
            })

Который находится на странице и подгружает в определенный блок различные html страницы. Как можно сделать чтобы этот скрипт работал также и в подгружаемом блоке?:help:

jasper-blondin 23.07.2015 12:15

Добавить данный скрипт в подгружаемые страницы. Иначе исходный скрипт не увидит искомые объекты в подгруженной странице.

jasper-blondin 23.07.2015 12:18

А вообще интересная задача. Получается, нужно, чтобы в блоке #content ссылки также открывали страницы в этом же блоке #content. Похоже на обычный iframe.

Mikhail1989 23.07.2015 12:27

Цитата:

Сообщение от jasper-blondin
Добавить данный скрипт в подгружаемые страницы. Иначе исходный скрипт не увидит искомые объекты в подгруженной странице.

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

рони 23.07.2015 12:30

Mikhail1989,
ставить клик на документ а не на ссылку
$(document).on('click', 'a' , function(e){})

Mikhail1989 23.07.2015 13:18

Цитата:

Сообщение от рони (Сообщение 381087)
Mikhail1989,
ставить клик на документ а не на ссылку
$(document).on('click', 'a' , function(e){})

огромное Вам спасибо за помощь, мучился уже не первый день.

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

рони 25.07.2015 17:07

Цитата:

Сообщение от Mikhail1989
загруженные при начальной загрузке сайта, не распространяются на контент

инициализировать контент по новой после загрузки.

laimas 26.07.2015 07:30

Цитата:

Сообщение от Mikhail1989
как в ajax подгружать выполнение скриптов

Возвращается некий html, в котором есть и JS выполняемый по загрузке контента:

<?
if($_POST['a']) exit(
    '<div id=as></div>
    <script> 
        $(function() {
            $("#as").text("Опаньки!").css({color:"#f00"})
        });
    </script>'
)
?>
<html> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.0/jquery.min.js" type="text/javascript"></script>
<script> 
$(function() {
    $.post(location, {a:1}, function(d) {
        $('body').append(d)
    }, 'html')
});
</script>     
</head> 

<body>
</body> 
</html>

Mikhail1989 27.07.2015 10:51

Цитата:

Сообщение от рони (Сообщение 381485)
инициализировать контент по новой после загрузки.

извините за, может быть, глупый вопрос, но как инициализировать контент по новой?:help:

рони 27.07.2015 10:57

Mikhail1989,
а как до того , что и чем инициализировали ? у хороших плагинов есть refresh

Mikhail1989 27.07.2015 11:34

рони,
плагин jScrollPane (http://jscrollpane.kelvinluck.com/)
пытаюсь инициализировать его так
$('.scroll-pane').jScrollPane();

но срабатывает он почему то частично, т.е. полоса прокрутки изменяется, но до конца не прокручивается контент.

рони 27.07.2015 11:43

Цитата:

Сообщение от Mikhail1989
$('.scroll-pane').jScrollPane();

а разве не так ?
$(function()
			{
				$('.scroll-pane').jScrollPane();
			});
или лучше так
$(window).load(function()
			{
				$('.scroll-pane').jScrollPane();
			});

рони 27.07.2015 11:50

Mikhail1989,
если изменилось содержание одного $('.scroll-pane') ;
после того как загрузили новое содержимое сделать так
var api = $('.scroll-pane').data('jsp');
api.reinitialise();
если елементов много обойти циклом все
пример http://jscrollpane.kelvinluck.com/dynamic_height.html

Mikhail1989 27.07.2015 15:32

Цитата:

Сообщение от рони (Сообщение 381672)
Mikhail1989,
если изменилось содержание одного $('.scroll-pane') ;
после того как загрузили новое содержимое сделать так
var api = $('.scroll-pane').data('jsp');
api.reinitialise();
если елементов много обойти циклом все
пример http://jscrollpane.kelvinluck.com/dynamic_height.html

извините за глупость, но это выполнять надо в основном файле или в подгружаемом, уже по всякому перепробовал, результат нет:help:
ps. и вот что интересно если нажать на ссылку повторно, то срабатывает как надо, при
$('.scroll-pane').jScrollPane();

рони 27.07.2015 16:29

Mikhail1989,
это api.reinitialise(); или это $('.scroll-pane').jScrollPane(); надо ставить в то что у вас подгружает контент

Mikhail1989 27.07.2015 16:49

рони,
если так
$(document).on('click', 'a', function(e){
                    e.preventDefault();
                    var link = $(this).attr('href');
                    var api = $('.scroll-pane').data('jsp');
                    $.ajax({
                        type:'post',
                        url: link,
                        success: function(mes){
                          $('#content').prev('.slider').hide();
                            $('#content').html(mes);
                            api.reinitialise();
                        }
                    })
                })

то в консоли
TypeError: api is null
api.reinitialise();

если так
$(document).on('click', 'a', function(e){
                    e.preventDefault();
                    var link = $(this).attr('href');
                    $.ajax({
                        type:'post',
                        url: link,
                        success: function(mes){
                          $('#content').prev('.slider').hide();
                            $('#content').html(mes);
                            $('.scroll-pane').jScrollPane();
                            
                        }
                    })
                })

то срабатывает, но прокрутка не действует до конца, а если нажать на ссылку повторно, то уже все работает как надо

рони 27.07.2015 17:43

Mikhail1989,
$(window).on('resize', function() {
   $('.scroll-pane').each( function() {
     var api = $(this).data('jsp');
    if(api) {api.reinitialise()}
    else {
      $(this).jScrollPane();
    }

}  )


})

$(document).on('click', 'a', function(e){
                    e.preventDefault();
                    var link = $(this).attr('href');
                    $.ajax({
                        type:'post',
                        url: link,
                        success: function(mes){
                          $('#content').prev('.slider').hide();
                            $('#content').html(mes);
                            $(window).resize()

                        }
                    })
                })

Mikhail1989 27.07.2015 23:08

рони,
спасибо, но все никак не работает.
постоянно срабатывает это условие
else {
$(this).jScrollPane();
	    }

и как результат не полная прокрутка подгруженного материала

Mikhail1989 28.07.2015 14:02

Цитата:

Сообщение от рони (Сообщение 381740)
Mikhail1989,
$(window).on('resize', function() {
   $('.scroll-pane').each( function() {
     var api = $(this).data('jsp');
    if(api) {api.reinitialise()}
    else {
      $(this).jScrollPane();
    }

}  )


})

$(document).on('click', 'a', function(e){
                    e.preventDefault();
                    var link = $(this).attr('href');
                    $.ajax({
                        type:'post',
                        url: link,
                        success: function(mes){
                          $('#content').prev('.slider').hide();
                            $('#content').html(mes);
                            $(window).resize()

                        }
                    })
                })

поменял resize на scroll работает, но как-то это не совсем красиво выглядит

хотя, нормально вроде, спасибо

Mikhail1989 31.07.2015 12:54

рони,
подсобите еще пожалуйста, опять проблема по этому скрипту, на одной из подгружаемых страниц есть свои обработчики для ссылок, но этот обработчик же действует, и на них тоже. Как его можно отключить перед выполнением нужных мне обработчиков. Пробовал .ubind() .off() не получилось, наверно, не туда их добавляю.

рони 31.07.2015 14:49

Mikhail1989,
установите разные классы и назначьте через класс клики

Mikhail1989 01.08.2015 14:22

Цитата:

Сообщение от рони (Сообщение 382274)
Mikhail1989,
установите разные классы и назначьте через класс клики

спасибо все получилось

Mikhail1989 03.08.2015 00:31

рони,
снова обращаюсь к вам за помощью, никак не могу реинициализировать еще один плагин - PrettyPhoto. Пробую после загрузки контента вставить вот это
$("a[rel^='prettyPhoto']").prettyPhoto();
но результата никакого

рони 03.08.2015 06:56

Цитата:

Сообщение от Mikhail1989
PrettyPhoto

что это такое ? и где макет :(

Mikhail1989 03.08.2015 10:48

Цитата:

Сообщение от рони (Сообщение 382518)
что это такое ? и где макет :(

это клон lightbox, вот страница http://www.no-margin-for-errors.com/...ightbox-clone/
подгружаю через все тот же скрипт добавив в success, вот это
$("a[rel^='prettyPhoto']").prettyPhoto();
для реанициализации
$(document).on('click', '.link', function(e){
                    e.preventDefault();
                    var link = $(this).attr('href');
                    if (link == 'index.html') {$('#content').prev('.slider').show();}
                    else {
                    $.ajax({
                        type:'post',
                        url: link,
                        success: function(mes){
                          $('#content').prev('.slider').hide();
                            $('#content').html(mes);
                            $("a[rel^='prettyPhoto']").prettyPhoto();
                            $(window).scroll()

                        }
                    })}
                })

и гружу файл с галлереей
<div class="gal1">
<div class="photo1"><a href="large1.jpg" rel="prettyPhoto[pp_gal1]" title="Фото1"><img src="foto/small1.jpg"><span></span></a></div>                                
</div>
<div class="gal1">
<div class="photo1"><a href="large2.jpg" rel="prettyPhoto[pp_gal1]" title="Фото2"><img src="foto/small2.jpg"><span></span></a></div>                                
</div>
<div class="gal1">
<div class="photo1"><a href="large3.jpg" rel="prettyPhoto[pp_gal1]" title="Фото3"><img src="foto/small3.jpg"><span></span></a></div>                                
</div>

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

рони 03.08.2015 14:26

Цитата:

Сообщение от Mikhail1989
а изображений нет

может путь к фото неполный?

Mikhail1989 03.08.2015 15:45

Цитата:

Сообщение от рони (Сообщение 382566)
может путь к фото неполный?

Путь полный, я здесь просто пример показал как делаю. Могу ссылку скинуть, чтобы вы посмотрели.
:help:

рони 03.08.2015 16:30

Цитата:

Сообщение от Mikhail1989
Могу ссылку скинуть, чтобы вы посмотрели

пиши в личку

Mikhail1989 04.08.2015 16:33

рони,
а можно как-то прокачать этот скрипт
$(document).on('click', '.link', function(e){
                    e.preventDefault();
                    var link = $(this).attr('href');
                    if (link == 'index.html') {$('#content').prev('.slider').show();}
                    else {
                    $.ajax({
                        type:'post',
                        url: link,
                        success: function(mes){
                          $('#content').prev('.slider').hide();
                            $('#content').html(mes);
                            $("a[rel^='prettyPhoto']").prettyPhoto();
                            $(window).scroll()

                        }
                    })}
                })

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

рони 04.08.2015 18:23

Цитата:

Сообщение от Mikhail1989
отдельные контейнеры, видел что как-то через rel делают, но так и не смог прикрутить. Нет ли у вас каких-нибудь идей по этому поводу?

не понял что вы хотите -- настройте ваш сервер как вам нужно -- нужна страница пусть выдаёт страницу -- нужен блок пусть блок отдаёт -- или вам не $.ajax нужен
а $.load --где можно указать куда грузить а после загрузки какую часть загруженнного добавлять.

http://api.jquery.com/load/

Mikhail1989 05.08.2015 09:59

Цитата:

Сообщение от рони (Сообщение 382736)
не понял что вы хотите -- настройте ваш сервер как вам нужно -- нужна страница пусть выдаёт страницу -- нужен блок пусть блок отдаёт -- или вам не $.ajax нужен
а $.load --где можно указать куда грузить а после загрузки какую часть загруженнного добавлять.

http://api.jquery.com/load/

да нужен функционал $.load, но вот здесь сделали через ajax. Пробовал сделать что-то подобное с моим скриптом, но чтобы и старый функционал остался подгрузка полной страницы и добавить новые функции подгрузка блока. Но как-то никак не собрать чтобы все работало.

Mikhail1989 06.08.2015 22:54

Цитата:

Сообщение от Mikhail1989 (Сообщение 382795)
да нужен функционал $.load, но вот здесь сделали через ajax. Пробовал сделать что-то подобное с моим скриптом, но чтобы и старый функционал остался подгрузка полной страницы и добавить новые функции подгрузка блока. Но как-то никак не собрать чтобы все работало.

неужели нельзя ничего сделать?

рони 06.08.2015 22:57

Mikhail1989,
вам нужен либо телепат, либо специалист ... увы ничем более помочь не могу

Mikhail1989 07.08.2015 12:55

Цитата:

Сообщение от рони (Сообщение 383023)
Mikhail1989,
вам нужен либо телепат, либо специалист ... увы ничем более помочь не могу

а вы не знаете можно как-нибудь через $.load подгружать не конкретный селектор на странице а любой? Т.е. у нас есть конструкция
$('#content').load('full_news.html #link2');

и в ней грузится информация только из #link2, а надо чтобы как-то так было:
var a = '#'+$(this).attr('rel');
                    $('#content').load('full_news.html a');

но это соответственно не работает, может есть какой-нибудь вариант решения?

рони 07.08.2015 13:09

Цитата:

Сообщение от Mikhail1989
$('#content').load('full_news.html a');

$('#content').load('full_news.html ' + a);

Mikhail1989 07.08.2015 13:46

Цитата:

Сообщение от рони (Сообщение 383071)
$('#content').load('full_news.html ' + a);

спасибо, наконец все получилось


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