Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   Ajax загрузка контента (не вопрос) (https://javascript.ru/forum/jquery/26970-ajax-zagruzka-kontenta-ne-vopros.html)

papochka 29.03.2012 20:43

Ajax загрузка контента (не вопрос)
 
Вдруг кому пригодится. Или кто предложит лучше...

Что предлагаю? Загрузку фрагмента страницы с помощью $.ajax - вместо load()
Подробнее Кликом на ссылку подгрузить в заранее оговоренный div контент любого div'a с другой страницы того же сайта.
Особенности CSS не предлагаю - на вкус и цвет. Ссылка, кликать на которую, должна быть в формате
<a class="loot" href="page.php" rel="victim"></a>
где page.php - адрес страницы-"донора" (откуда будем выдергивать div), а victim - ID нужного div'a (который конечно может быть любым - главное, чтобы вообще он был и чтобы он совпадал в атрибуте rel ссылки и в атрибуте id элемента-донора).
В примере фрагмент подгружается в div id="thief".

Кому нужен этот велосипед, вместо простого load()? Тем, кто столкнулся с проблемой конфликтов $.ajax и load - подробнее здесь

Код скрипта:

$('.loot').live("click", function(){
 var loaderImg = "<img src='loader.gif' alt='загрузка...' />"; // картинка до загрузки
 var url = $(this).attr("href"); // получаем значение атрибута href ссылки 
 var rel = 'div#'+$(this).attr("rel"); // получаем значение атрибута rel ссылки
 $("div#thief").html(loaderImg).html(function(){
 			var a=loaderImg;
			$.ajax({ // запрашиваем данные со страницы-донора
				url:url,
				dataType:"html",
				async:false,
				success:function(b){a=$(b).find(rel)},  // извлекаем html из нужного элемента (в примере <div id="victim">)
				error:function(){alert("Ajax!Ошибка.")}
				});
				return a
 });
 $("div#thief").fadeIn('fast'); // отображаем блок, если он был скрыт
 return false;
});


Для желающих поворчать: не надо ворчать, лучше предлагайте лучше.
Или оптимизируйте, - ибо я последнее время мало сплю (см.никнейм)

Тем, кому нужен метод load - см. здесь (внизу первого поста).

Спасибо за внимание.

atlantis 29.03.2012 21:13

Если не ошибаюсь, то "return a" (14 строка) возвратит результат до завершения работы ajax запроса. Следовательно код не будет работать так как нужно.

papochka 30.03.2012 09:00

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

зы: только вот похоже html(loaderImg) здесь пятая нога... ну и loaderImg в принципе.

melky 30.03.2012 10:10

там всё нормально, запрос ведь синхронный (async:false )

можно сделать его асинхронным вот так :

var loaderImg = '<img src="loader.gif" alt="загрузка..." />';

$('.loot').live("click", function() {
    var 
        $this = $(this);
      
    $.ajax({ 
        url: $this.attr("href"),
        dataType: "html",
        context: $("#thief").html(loaderImg),
        success: function(b) {
            b = $(b).find('#'+$this.attr('rel'));
            this.html(b).fadeIn('fast')
        }
    });
           
    return false;
});​

atlantis 30.03.2012 12:04

melky,
Ой, точно. Не заметил "async:false".
Тогда всё работает :)
Я правда никогда не использовал "async:false" и не рекомендую использовать. ЗЫ Это лично моё мнение.

papochka 30.03.2012 12:54

atlantis,
melky (спасибо),
не втему, но раз уж вы об этом заговорили - можно поделиться человеческим разъяснением преимущества синхронного запроса перед асинхронным или ссылки на такое человеческое разъяснение. До сих пор не врублюсь что такое хорошо, а что такое плохо, кроме того, что при синхронном обещают зависание браузера :)
Чем плоха идея "занятся чем-то другим во время запроса"? Имеется в виду, что асинхронный может вести себя неадекватно при хреновом соединении? или что?

T-sh 30.03.2012 13:03

Цитата:

Сообщение от papochka (Сообщение 165681)
atlantis,
melky (спасибо),
не втему, но раз уж вы об этом заговорили - можно поделиться человеческим разъяснением преимущества синхронного запроса перед асинхронным или ссылки на такое человеческое разъяснение. До сих пор не врублюсь что такое хорошо, а что такое плохо, кроме того, что при синхронном обещают зависание браузера :)
Чем плоха идея "занятся чем-то другим во время запроса"? Имеется в виду, что асинхронный может вести себя неадекватно при хреновом соединении? или что?

синхронный: отправили запрос -> ждем ответа и ничего не делаем -> пришел ответ —продолжаем.

асинхронный: отправили запрос -> делаем что хотим -> пришел ответ — обработали.

papochka 30.03.2012 17:08

Видимо превосходство синхронного запроса таится именно в
Цитата:

и ничего не делаем
, что по сравнению с
Цитата:

делаем что хотим
даже для меня существенно слаще... :)

Я не хочу много зарабатывать, я хочу много получать!

T-sh 30.03.2012 17:39

Цитата:

Сообщение от papochka (Сообщение 165751)
Видимо превосходство синхронного запроса таится именно в , что по сравнению с даже для меня существенно слаще... :)

Я не хочу много зарабатывать, я хочу много получать!

всё зависит от цели :)

бывает, что на одной странице пять-шесть ajax подгрузок, и тогда синхронный запрос — вообще ни вариант :)

а в целом, оба варианта не лучше и не хуже друг друга :)

melky 30.03.2012 20:57

Цитата:

Сообщение от papochka (Сообщение 165681)
atlantis,
melky (спасибо),
не втему, но раз уж вы об этом заговорили - можно поделиться человеческим разъяснением преимущества синхронного запроса перед асинхронным или ссылки на такое человеческое разъяснение. До сих пор не врублюсь что такое хорошо, а что такое плохо, кроме того, что при синхронном обещают зависание браузера :)
Чем плоха идея "занятся чем-то другим во время запроса"? Имеется в виду, что асинхронный может вести себя неадекватно при хреновом соединении? или что?

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

papochka 30.03.2012 22:31

Цитата:

Сообщение от T-sh (Сообщение 165755)
бывает, что на одной странице пять-шесть ajax подгрузок, и тогда синхронный запрос — вообще ни вариант :)

вот теперь я понимаю, что не видел прелестей в синхронном ))

papochka 30.03.2012 22:37

melky,
ваш скрипт у меня почему-то не заработал, но я, признаться попробовал из любопытства и впопыхах и мог чего-нить проглядеть... будет времечко свободно попробуйте сами компильнуть - для будущих поколений (а если работает - простите великодушно за занудство). Мне скорее всего действительно асинхронные пока что более близки, а вдруг кому синхронный понадобицца ;)

rustleofstars 02.04.2012 21:20

Здравствуйте. Буду очень признателен если автор топика или кто-нибудь подскажет почему у меня в функции success:function(b) не получается получить высоту загружаемого блока :
adpo(тчк)demo(тчк)biz(тчк)ua
<a class="loot" href="http://adpo.demo.biz.ua/testajax.html" rel="qwerty">testajax</a>

Пытаюсь вывести содержимое div#qwerty в div#mbox :
<div id="mask" class="window"><div id="mbox" class="window"></div></div>

Вот здесь adpo(тчк)demo(тчк)biz(тчк)ua/templates/adpo/js/jcore-main.js :
var maskHeight = $j(document).height();
        var maskWidth = $j(document).width();	
		$j('#mask').css({'width':maskWidth,'height':maskHeight});		
	

$j('.loot').live("click", function(){	
var loaderImg = "<div class=\"ajaxloader\"><img  src='http://adpo.demo.biz.ua/templates/adpo/img/ajax_loader2.gif' alt='загрузка...' /><br>&nbsp;&nbsp;&nbsp;<span class=\"ajaxloadertxt\">Загрузка...</span></div>"; // картинка до загрузки
var url = $j(this).attr("href"); // получаем значение атрибута href ссылки 
var rel = 'div#'+$j(this).attr("rel"); // получаем значение атрибута rel ссылки
 $j("div#mbox").delay(3000).html(loaderImg).html(function(){
 		var a=loaderImg;						
			$j.ajax({ // запрашиваем данные со страницы-донора
				url:url,
				dataType:"html",
				async:false,
				success:function(b){a=$j(b).find(rel);	
                    var swidth = screen.width;
					var sheight = screen.height;
					$j("#mbox").css({"display" : "block"});
                    $j("#qwerty").css({"display" : "block"});						
					var boxW = $j("#qwerty").width();
					var boxH = $j("#qwerty").height();
				    var winW = swidth/2-boxW/2;
					var winH = sheight/2-boxH/2;               	
					$j("#mask").delay(100).fadeIn(100);
					$j("#mbox").delay(100).fadeIn(500);
					$j("#mbox").css({"top" : winH});
					$j("#mbox").css({"left": winW});
					$j("#console").html("winW - "+winW+", winH - "+winH+", boxW - "+boxW+", boxH - "+boxH+", swidth - "+swidth+", sheight - "+sheight+" ");				
				},
              complete: function(msg) {
        
},		
				error:function(){alert("Ajax!Ошибка.")}
				});
				return a
 });
 return false;
 
});

atlantis 02.04.2012 21:30

Эмм... Я извиняюсь, но что это: $j.ajax ...
Символ "j" я что-то никогда не видел, чтобы так использовался. Оно вообще хоть работает? :)

rustleofstars 03.04.2012 09:42

Цитата:

Сообщение от atlantis (Сообщение 166597)
Эмм... Я извиняюсь, но что это: $j.ajax ...
Символ "j" я что-то никогда не видел, чтобы так использовался. Оно вообще хоть работает? :)

Там в adpo(тчк)demo(тчк)biz(тчк)ua/templates/adpo/js/jcore-main.js сверху
var $j = jQuery.noConflict();{

Все работает но эти переменные на выходе null :
var boxW = $j("#qwerty").width();
var boxH = $j("#qwerty").height();

Kolyaj 03.04.2012 09:44

Цитата:

Сообщение от rustleofstars
Там в adpo(тчк)demo(тчк)biz(тчк)ua/templates/adpo/js/jcore-main.js сверху

Да откуда хоть вы такие все приходите-то? Ссылку нормальную что мешает сделать? Это интернет, тут люди по ссылкам тыкают.

melky 03.04.2012 09:45

скрипт запускается после загрузки страницы ?

rustleofstars 03.04.2012 10:27

Цитата:

Сообщение от melky (Сообщение 166663)
скрипт запускается после загрузки страницы ?

сам скрипт http://adpo.demo.biz.ua/templates/adpo/js/jcore-main.js запускается в <head>, в нем все находится внутри $j(document).ready(function(){... Пробовал запускать скрипт в конце <body> и тоже boxW = null, boxH = null

rustleofstars 03.04.2012 11:02

Как я понял эти переменные
var boxW = $j("#qwerty").width();
var boxH = $j("#qwerty").height();

равны null потому что на странице, на которой выполняется скрипт нет
<div id="qwerty"></div>

Этот див берется из страницы источника из rel ссылки .loot. Если создать пустой <div id="qwerty"></div> на странице вызова скрипта то boxH = null а boxW равен ширине экрана. Неужеле нет возможности измерять ширину и высоту блока указанного в rel ссылки .loot как источник ?

1n3gan 10.04.2013 13:11

Спасибо за скрипт, все работает.
Только у меня вопрос. Каким образом можно добиться смены url в адресной строке браузера при переходе по ссылкам?

mirra88 24.08.2014 17:03

Помогло даже в работе с модулем новостей Joomla!
 
Большое спасибо! Помогло даже в работе с модулем новостей Joomla!

face2005 11.11.2014 13:58

не знаю.. у меня при клике по ссылке , происходит обычный переход на страницу page.php///

Mikhail1989 06.08.2015 10:36

Может кто-нибудь помочь?
Есть такой скрипт:
$(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);

                        }
                    })}
                })

Он грузит в нужный блок, всю страницу. Как сделать чтобы он умел грузить не только всю страницу, но также и блоки. Т.е. когда нужно грузит блок, в другом случае страницу. Как не пытался объединить этот скрипт со скриптом ТС ничего не выходит.


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