css, html, php, javascript, jQuery, ajax … – решения, примеры, рецепты
12 Дек
На написание этой статьи меня подвигло то обстоятельство, что на один и тот же вопрос приходится отвечать по 5-7 раз в неделю. Вопрос этот обычно звучит примерно так: «Элементы вставляются в страницу из ajax-запроса к серверу и для них не работает ни один обработчик событий! Как это поправить?».
Начнем пожалуй с того, что поправлять вряд ли что-то нужно. Скорее надо разобраться с тем, что, и в какой последовательности происходит. Разберемся на вот таком простом примере. Я приведу HTML, javascript-код и php-код сценария на сервере.
<button>Отправить ajax-запрос</button> <span id="process"></span> <p>Параграф 1</p> <p>Параграф 2</p>
HTML-код очень прост. Имеем два параграфа, кнопку, с помощью которой будем отправлять ajax-запрос и элемент span, который будет использоваться для вставки в него текстовых сообщений.
Теперь javascript-код:
$(document).ready(function(){
// обрабатываем клик на параграфах
$("p").click(function() {
alert($(this).text());
});
// ajax-запрос
$("button").click(function() {
$.ajax({
url: "eventHandlingAjax.php",
beforeSend: function(){
$("#process").css("display","inline")
.text("Отправляю ajax-запрос");
},
success: function(answ){
$("#process").text("Ответ получен")
.fadeOut(3000);
$("body").append(answ);
}
});
});
});
Для начала свяжем событие click с элементами p. По событию будем выводить в alert текст, содержащийся в данном параграфе.
Ajax-запрос будем выполнять при клике на элементе button. Сложного тут ничего нет – запрос будет отправлен к файлу eventHandlingAjax.php, а перед отправкой мы вставим соответствующее сообщение в элемент span, сделав его видимым с помощью CSS (изначально этот элемент был скрыт с помощью того же CSS). При получении ответа от сервера мы вставим сообщение об этом в тот же элемент span и самое главное, добавим в body то, что мы получили в качестве ответа.
А что именно мы получили можно будет узнать, посмотрев код серверного сценария.
<?php
header('Content-Type: text/html; charset=utf-8');
if($_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest') {
print '<p>Добавленный параграф</p>;
}
?>
Мы добавим в body всего-навсего HTML-код еще одного параграфа.
Если Вы уже успели испытать этот пример, то наверняка отметили то обстоятельство, что обработчик события click действует только для тех двух параграфов, которые присутствовали на странице с самого начала. А для добавленных параграфов этот обработчик не действует. Почему? Давайте разбираться.
Что происходит в момент загрузки HTML-страницы? На экране монитора появляется кнопка и два параграфа. Самое интересное в javascript-коде. В момент готовности DOM наш javascript-код начинает отрабатывать, и первое, что он делает, отбирает в объект jQuery все элементы p на странице и вешает на них обработчик события click. Затем уже вешает обработчик клика и на элемент button, но это нас сейчас интересует в гораздо меньшей степени.
Что происходит дальше? Дальше мы отправляем ajax-запрос к серверу и получаем от него в качестве ответа еще один элемент p, который вставляется в DOM. Вот это и есть самый важный момент – обработчик события click по сути связан не с какими-то элементами p на странице, а с конкретным объектом jQuery, в котором на данный момент находится только два элемента p, которые присутствовали на странице изначально. Добавленный параграф в этот объект jQuery не мог быть включен, поскольку тогда еще не существовал, поэтому и обработчик события click для него работать не будет.
Поправить это можно, добавив обработчик события клик в callback-функцию, определенную в опции success ajax-запроса. Я приведу javascript-код и Вы сможете посмотреть, как он изменился.
$(document).ready(function(){
// обрабатываем клик на параграфах
$("p").click(function() {
alert($(this).text());
});
// ajax-запрос
$("button").click(function() {
$.ajax({
url: "eventHandlingAjax.php",
beforeSend: function(){
$("#process").css("display","inline")
.text("Отправляю ajax-запрос");
},
success: function(answ){
$("#process").text("Ответ получен")
.fadeOut(3000);
$("body").append(answ);
$("p").click(function() {
alert($(this).text());
});
}
});
});
});
Я специально не стал удалять первый обработчик события click, поскольку на этом примере можно наглядно увидеть разницу между двумя объектами jQuery, которые содержат элементы p. Первый из них был создан в момент загрузки html-страницы и содержит в себе два элемента p, а вот второй объект jQuery создан уже после выполнения ajax-запроса, и содержит все элементы p, которые удалось обнаружить в DOM, т.е. после одного запроса будет три параграфа, после двух – четыре и так далее. Визуально существование двух объектов jQuery подтверждается тем, что при клике на любом из «добавленных параграфов» Вы увидете только одно сообщение в alert’е, а вот при клике на первом или втором параграфе Вы увидете уже два alert’а – соответственно для первого и для второго объекта jQuery. Количество объектов jQuery будет расти вместе с количеством выполненных ajax-запросов.
Можно пойти иным путем и прописать обработчик события непосредственно в файле сценария на сервере – в этом случае он также будет подгружен и отработает правильно. Принципиальной разницы между этими подходами нет.
Но на самом деле – это не совсем правильный путь, хотя в некоторых случаях может выручить и такое решение.
Я хочу рассказать о еще одном возможном способе решения этой задачи, который состоит в использовании плагина jQuery Listen. В коде кое-что конечно изменится. Естественно, что для использования этого плагина, его необходимо подключить к странице:
<script type="text/javascript" src="js/jquery-1.2.6.js"></script> <script type="text/javascript" src="js/jquery.listen.js"></script>
HTML-код остался без изменений, а вот javascript-код изменился:
$(document).ready(function(){
jQuery.listen("click", "p", function(){
alert($(this).text());
});
// ajax-запрос
$("button").click(function() {
$.ajax({
url: "eventHandlingAjax.php",
beforeSend: function(){
$("#process").css("display","inline")
.text("Отправляю ajax-запрос");
},
success: function(answ){
$("#process").text("Ответ получен")
.fadeOut(3000);
$("body").append(answ);
}
});
});
});
Обратите внимание, что вместо нашего обработчика события click на элементах p, мы используем плагин jQuery Listen, передавая ему событие, которое необходимо отслеживать, элементы, с которыми это событие необходимо связать и функцию, которая будет выполнена при наступлении этого события. Можете посмотреть работу плагина – вот пример.
Отзывов (80) на «Обработка событий для элементов DOM, загружаемых через ajax.»
Ох, я припоминаю, когда только начинал – промучался с этим ужасно долго
Сейчас предпочитаю в javascript определять функцию, которая принимает аргументов объект DOM и вешает на него то, что нужна. А в success: помимо всего просто вызывать эту фукнцию, передавая ее вновь добавленный элемент.
Кстати, намекну на еще одину распространенную ошибку, на которой новички ломают ноги: конструкции типа
var myVar = $(‘input[@name=myInput]‘).value()
в myVar будет занесено не ЗНАЧЕНИЕ, а объект JQUERY (можно почитать об этом в мануале).
А поэтому если мы делаем так:
var myVar = $(‘input[@name=myInput]‘).value();
$(‘input[@name=myInput]‘).attr(‘value’, myVar+’- это старое значение’);
Получается полный бред
Дополню пост Алексея, чтобы показать как бред НЕ делать, а делать правильно:
var myVar = $(«input[@name=myInput]«).attr(«value»);
To Алексей: Спасибо!
Спасибо. Полезно.
Я тоже вспомнил много упущенного времени из-за этой проблемы… но нашел другое решение: воспользоваться плагином livequery обновления
подключаем это:
а в процедурах объектов пишем так
$(«input[name='"+pref+"f']«).livequery(«change»,function(){
дальше как всегда)
Мне кажется что тут можно рассмотреть еще один вариант, для кторого не нужны дополнительные плагины.
Добовлять событие ‘click’ через .bind(), а в опции success
применять к объектам .unbind() и сразу же вешать событие заново.
Точность своих слов подтвердить не могу, некогда проверить, но по теории должно работать.
Поставленную задачу можно решить проще – создав JQuery-объект на основе присланного html и повесить обработчик события click только на вновь созданные параграфы. Модифицированный вариант для обработчика события success:
function(answ){
$(«#process»).text(«Ответ получен»).fadeOut(3000);
var el = $(answ);
$(«body»).append(el);
// вешаем обработчик только
// на добавленные параграфы
el.find(«P»).andSelf().click(function() {
alert($(this).text());
});
}
А вообще, вешать обработчики на каждый конкретный параграф (тем более, с учетом, что их количество динамически меняется) – не очень хорошая практика. Можно обойтись единственным обработчиком события click, который повешен на контейнер, содержащий в себе параграфы. Определить, по какому абзацу произведен клик можно по свойству target объекта-события. В этом случае нам будет абсолютно без разницы, каким образом создан тот или иной параграф – при загрузке страницы или динамически.
Ребята! Рад, что предлагаете свои решения.
To ZerGer: Речь не шла о конкретном решении – вообще-то вся статья написана только для того, чтобы растолковать смысл. Ведь как я и писал в ее начале, отвечать на подобный вопрос приходится чуть ли не каждый день. По-моему смысл растолкован нормально, а решение в каждом конкретном случае конечно нужно искать наиболее подходящее именно к этому случаю.
Как раз сейчас столкнулся с такой проблемой, попытаюсь резюмировать.
Спасибо за Вашу работу.
Склоняюсь к варианту добавления js кода в подгружаемый файл, так всё становиться более понятным.
К тому же что делать если для файла сценария на сервере содержаться элементы к которым нужно применить точно такую же ajax функцию.
получаеться бесконечная рекурсия.
$.ajax({
url: «eventHandlingAjax.php»,
beforeSend: function(){
$(«#process»).css(«display»,»inline»)
.text(«Отправляю ajax-запрос»);
},
success: function(answ){
$(«#process»).text(«Ответ получен»)
.fadeOut(3000);
$(«body»).append(answ);
$.ajax({ ….
});
}
});
В продолжении темы… только что наткнулся описание нововведений в jQuery 1.3 beta (пока только тут: http://ajaxian.com/archives/jquery-13-beta-sizzling-and-feature-testing):
Live event delegration: Reglib’s claim to fame was how event delegation was “live” meaning that if you added elements later on, they would also fall into the same delegations. With $(«#foo > div»).live(«click», someFn); you get the same in jQuery.
Т.е., новый метод live() подобен по функционалу методу listen(), реализованному в плагине jQuery Listen. Различия только в методе отбора элементов, на которые вешаются обработчики событий.
Здравствуйте, прошу помощи. Я знаком с jQuery совсем недавно и многого не понимаю в ней. Помогите можалуйста.
Требуется по событию изменения выбора в запустить два аякс запроса на два разных пхп-скрипта, я делаю так:
$(«#kabsel»).change(
function () {
$.ajax({
type: «POST»,
data: ‘n=’+$(«#kabsel»).val(),
url: «ajax_master.php»,
success: function(answer){
$(«#result_kab»).html(answer);
}
});
$.ajax({
type: «POST»,
data: ‘n_date=’+$(«#daysel»).val()+’&n_month=’+$(«#monthsel»).val()+’&n_kabinet=’+$(«#kabsel»).val()+’&n_master=’+$(«#mastsel»).val(),
url: «ajax_time.php»,
success: function(answer){
$(«#result_time»).html(answer);
}
});
});
Первый запрос обрабатывается и возвращается ответ от сервера, но второй запрос не проходит, в чём может быть проблема?
Отдельно второй запрос проходит и возвращает результат в div id=#result_time.
Задача решилась неожиданно просто:
success: function(answer){
$(«#result_kab»).html(answer);
$.ajax({
type: «POST»,
data: ‘n_date=’+$(«#daysel»).val()+’&n_month=’+$(«#monthsel»).val()+’&n_kabinet=’+$(«#kabsel»).val()+’&n_master=’+$(«#mastsel»).val(),
url: «ajax_time.php»,
success: function(answer){
$(«#result_time»).html(answer);
}
});
}
просто вставил второй аякс запрос в функцию успешного выполнения первого
Но возникла ещё одна проблема, может подскажете, пока сам не додумался: сервер возвращает хтмл ответ в виде списка …
у меня есть ещё один аякс запрос по изменению этой формы:
$(«#daysel»).change(
function () {
$.ajax({
…
И вот он не работает. Как заставить jQuery обработать событие, вызванное только что полученным при помощи аякса элементом?
Или проблема в чём-то ещё?
Если этот элемент я создам сразу в странице, то этот же аякс запрос срабатывает.
Вообще-то запросы у Вас должны были срабатывать и в начальном варианте. Вот пример – работает….
Что касается второго вопроса, то если я его понял правильно, то у Вас не срабатывают обработчики событий для элементов загруженных через ajax-запрос? Так тогда Вам в помощь как раз эта статья, в комментариях к которой Вы и задаете вопрос. И еще вот эта Плагин Live Query
ого! Спасибо огромное во-первых за оперативный ответ, во-вторых за терпеливый ответ не в стиле «забанили в гугле?» и в-третьих за свежую статью про Live Query, которая кстати мне и помогла =)
Решение: заменил все
.change(
на
.livequery(«change»,
и оно заработало
вопрос немного не по теме, но все же, если вызвать страницу $(«#maincontent»).load(‘http://site.ru/index.php’); таким образом, то передаются ли ей cookies? если учесть, что домены разные
Если Вы попробуете использовать метод load() для загрузки URL с другого домена, то однозначно получите ошибку. Этот метод не поддерживает такую возможность.
А это ограничение яваскрипт или jQuery? И есть ли метод для загрузки html с другого домена?
Это ограничение в общем-то JavaScript. Но на самом деле загрузка данных с другого домена возможна. Читайте про ajax-запросы, тогда разберетесь.
Специально для кроссдоменой передачи данных разработан такой формат как JSON.
А если вам нужно загрузить через jQuery именно html с другого домена, то напиши серверный скрипт, который будет этот html парсить, и дергайте уже свой собственный скрипт.
Алексей, дополню про JSON – точнее это JSON with padding или JSONP. Получать можно, если сервер отдает данные в этом формате. Пример использования (с помощью jQUery) есть в статье jQuery и Ajax: запросы. В jQuery есть еще и метод $.getScript( url, [callback] ), который поможет загрузить и выполнить javascript-код с другого домена.
Спасибо за статью! сильно помогла!
Gennady, очень понравился ваш сайт и методика объяснения материала) очень интересует тема про динамический select подгружаемый с базы данных, было бы очень приятно почитать это у вас, нравится ваша логика))
Млин… Мужик… Ты просто гений!
Почёт и уважение!
а как сделать вместо кнопки ссылку на тот-же php файл
To: Jerboa
Вы о чем спрашиваете?
вообще меня интересует такой момент.
есть и набор ссылко. я пытаюсь сделать так чтобы при нажатии на одну из ссылок передавались параметры в php файл он их обрабатывал, а результат
полученный после выполнения сценария делал апдейт .
вот такой вопрос, как это сделать чтоб заработало наконец)
Вообще Вы задаете вопрос не по теме статьи. Но, если коротко, то:
HTML-разметка:
<a href=»someurl_1.php» rel=»nofollow»>url 1</a>
<a href=»someurl_2.php» rel=»nofollow»>url 2</a>
<a href=»someurl_3.php» rel=»nofollow»>url 3</a>
<div id=»result»></div>
JS-код:
$('a').click(function(){ var url = $(this).attr('href'); $.ajax({ url: url; success: function(data){ $('#result').html(data); } }); return false; });А чтобы все-таки понять смысл – читайте про селекторы jQuery, про реализацию ajax-запросов в jQuery. Все материалы на эту тему есть.
что-то ваш пример не работает ((
Очень не хочется говорить нехорошее… Может Вам все-таки стоит для начала попытаться разобрать какие-то совсем простые примеры, почитать документацию – попробовать понять. У меня просто ощущение, что Вы хотите просто с наскока взять, вставить и чтобы даже не думать…
Gennady. хм может вам за синтексисом кода последить. тогда не будет вопросов.
Хм, уважаемый…. Фрагменты кода здесь приводится не для того, чтобы его скопировать и вставить, а для того чтобы пояснить суть.
Есть вопросец, не совсем по теме, но все же. Сколько может быть вложений запросов? Ну вот, то есть, что я имею ввиду. У меня, к примеру, по нажатию на button запрос посылается PHP-скрипту, откуда приходят JSON-данные и дальше я хочу передать эти данные в другой скрипт на обработку. Система у меня такая. $getJson(… А в callback, я создаю новый запрос. И нифига не работает. так делать нельзя или я чего-то не понимаю?
Почему нельзя? Можно. Теоретически – до бесконечности. «Нифига не работает» скорее всего потому, что пытаетесь передать в новый запрос какие-то параметры, которые отсутствуют в области видимости callback-функции.
Ну или что-то в этом духе…
Не хорошо, админ, бомбить посты, я задавал вопрос по существу- БЕЗ jQuery реализовать callback-функции, а именно возврат динамичной переменной от клиента серверу – обработка, и обратно на исполнение. Естественно средствами ajax. Это такой сложный вопрос?
Как говорится – ничего личного, но вопрос был задан так, что было не очень понятно на что отвечать-то. К тому же к этому посту он вообще никаким боком…. Ну и про сложность вопроса – вот файл, в котором приведены коды выполнения ajax-запроса на «чистом» JavaScript и для сравнения с использованием jQuery – судите о сложности. Это пример выполнения самого в общем-то простого запроса.
…
Да, и все-таки в основном здесь идет разговор о jQuery
ага, спасибо, но километры аналогичного кода я уже за несколько дней просмотрел..
Идея в том, что ajax’сом мы выполняем скрипт результат которого подставляется в div или span. Но это «мертвый результат» в моем случае. Т.к. ПЕРЕД выполнением ajax в том же документе выполняется другой js-код. Так каким образом приостановить тот первый скрипт? пока не появиться результат из аякса? Или вернуть какой либо параметр в страницу-родитель? Иначе эти возвращаемые данные не обрабатываются
Первый js-код (до ajax-запроса) наверное трогать и не надо. Он же ведь для чего то нужен, верно? Как выход (может не самый изящный, но работоспособный) – грузить обработчик для подгружаемых данных вместе с самими данными. Тогда будет точно работать.
да, первый js нужен для прокрутки картинок в определенном div.
если я определю сразу нужные картинки в див(т.е. вставлю эти изображения в страницу), то все ок. Но если я подменю их ajax’сом, все, капут, никакой динамики.
как подключить такой обработчик?
вот код ajax.js
————
var xmlHttp
function showIMG(str)
{
xmlHttp=GetXmlHttpObject()
if (xmlHttp==null)
{
alert («Браузер не поддерживает запросы HTTP»)
return
}
var url=»request.php»
url=url+»?q=»+str
url=url+»&sid=»+Math.random()
xmlHttp.onreadystatechange=stateChanged
xmlHttp.open(«GET»,url,true)
xmlHttp.send(null)
}
function stateChanged()
{
if (xmlHttp.readyState==4 || xmlHttp.readyState==»complete»)
{
document.getElementById(«gal»).innerHTML=xmlHttp.responseText
}
}
function GetXmlHttpObject()
{
var objXMLHttp=null
if (window.XMLHttpRequest)
{
objXMLHttp=new XMLHttpRequest()
}
else if (window.ActiveXObject)
{
objXMLHttp=new ActiveXObject(«Microsoft.XMLHTTP»)
}
return objXMLHttp
}
———-
request.php содержит галерею, которая при выводе не обрабатывается первым js-кодом.
Вот значит этот самый первый js-код и надо подгружать вместе с картинками. Добавьте его в request.php
Я тоже новичок в Jquery но почему не сделать проще а именно
$(document).ready(function(){
// обрабатываем клик на параграфах
$(«p»).click(function() {
alert($(this).text());
});
// ajax-запрос
$(«button»).click(function() {
$.ajax({
url: «eventHandlingAjax.php»,
beforeSend: function(){
$(«#process»).css(«display»,»inline»)
.text(«Отправляю ajax-запрос»);
},
success: function(answ){
$(«#process»).text(«Ответ получен»)
.fadeOut(3000);
$(«body»).append(answ);
$(«p:last»).click(function() {
alert($(this).text());
});
}
});
});
});
Вот изменение если кто не углядел $(«p:last»).click(function() {
alert($(this).text());
То есть обработчик события клик добавится только на последний параграф, или не все тут так просто?
Не все так просто. Пример, он на то и пример, чтобы быть простым. Тут Вы знаете, что добавлен только один параграф. А если не один? Т.е. на самом деле Вы не ошибаетесь. Ваше решение вполне жизнеспособно. Но только когда код относительно прост. Стоит ему начать разрастаться и Вы моментально запутаетесь в логике обработчиков событий для динамически создаваемых элементов.
Добрый день. Ситуация такая, что по клику на элемент, вставляемый в страницу из ajax-запроса к серверу должен вставляться следующий элемент из очередного ajax-запроса. Т.е. все это представляет собой тест, при клике на ответ которого из запроса вставляется следующий вопрос. С фф и опера все хорошо проходит, а в ие ни способом описаным в статье, ни через .live() запрос с вставленных элементов не выполняется, хотя алерт вызывается. В чем может быть дело?
Попробуйте пошаманить с url (относительный или абсолютный). Проверьте еще везде ли точки с запятой в конце стоят – несколько раз сталкивался с таким, забудешь и в FF и Opera работает, а IE ни в какую. И FireBag ничего не говорит…
Проверил/пошаманил, никаких изменений так и не наметилось. Сслыки, элементы, обработчики видит,а запрос делать не хочет.
Бросьте в меня кодом
Попробую посмотреть, может помогу чем-то. Тут http://www.linkexchanger.su/about есть форма…
Подскажите как возможно передаваемые данные POST представить ввиде JSON?
Вопрос немного неясен… Нет связи между типом HTTP-запроса (POST, GET) и форматом представления данных (JSON). Вам вероятно смогут помочь статьи из категории json. Посмотрите.
была такая же задачка как у Jerboa. поставить вместо ссылку. Тоже сразу не понял. Хотел уже спросить здесь, но …. Автору спасибо. Почитал про селекторы – понял. вот пример. Может кому-то из начинающих тоже пригодится.
ссылки вида
Главная
Услуги
Цены
Контакты
JS-код
$(‘a[id]‘).click(function(){
var addurl = $(this).attr(‘id’);
alert (addurl);
$.ajax({ url: «url.php?id=» + addurl,
beforeSend: function(){
$(«#process»).css(«display»,»inline»)
;
},
success: function(answ){
$(«#process»).fadeOut(3000);
$(«body»).append(answ);
}
});
return false;
});
Сорри. что-то намутил
в общем в ссылки надо просто id добавить. Типа: id=main id=service и т.д.
Подскажите, пожалуйста!
у меня не работает в IE и Google Chrome код javascript’а, подгружаемый ajax’ом. В Мозилле – работает. В чем причина и как это исправить?
Василий, Вы не обижайтесь, но прочитайте сами внимательно свой вопрос, получается
Код не работает – в чем причина?
Вы как сами думаете, можно что-то ответить по делу?
Вообще-то вопрос более развернутый был:
«не работает … код javascript’а, подгружаемый ajax’ом».
Хотя не спорю, можно было и поподробнее. Суть следующая: ajax’ом на страничку подгружал контент, который содержал html и javascript, javascript не выполнялся. Делалось это все одним запросом $.ajax… Решение нашел в следующем виде: первым запросом подгружаю html, на успешное его выплнение вторым запросом $.getScript подгружаю javascript. Ьак все работает. Вопрос теперь другой: можно ли одним запросом подгружать и html, и javascript, разумеется чтобы javascript выполнялся?
Вопрос теперь другой: можно ли одним запросом подгружать и html, и javascript, разумеется чтобы javascript выполнялся?
Можно конечно – да Вы просто с обычным alert’ом например поэкспериментируйте.
Ну, например вот такой запрос:
$.ajax({ url: "ajax.html", success: function(data){ $("body").html(data); // вставляем данные } });а в файле ajax.html кроме HTML еще и
alert("Есть контакт!");Принципиально – это работает, ну а далее могут быть какие-то детали…
Здравствуйте, работаю с большим объемом данных на страницах. Данные подгружаю в один и тот же див элемент при помощи $.ajax без перезагрузки всей страницы. Столкнулся с такой проблемой, что объем оперативной и в виртуальной памяти занимаемой браузером после непродолжительной работы заметно растет. При этом, когда почти полностью забивается оперативка браузер начинает долго думать и что-то обрабатывать, подгрузка данных сильно тормозит. Такое складывается впечатление, что каждый $.ajax запрос кешируется и при следующем запросе результат предыдущего запроса не очищается. Может, посоветуете как вылечить эту проблему?
Если дело действительно в кэшировании, то попробуйте в опциях ajax-запроса передавать cache: false. Эта опция по умолчанию установлена в true для всех dataType, кроме script и jsonp.
да я ставлю данную опцию (cache: false) – результат тот же (
А в div’e данные заменяются на новые? Или добавляются? Как именно вставляете – через html(val) или append(content)? Может где-то тут проблема?
Заменяются на новые через html(val). А тут какая может быть проблема?
append(content) добавляет данные к уже существующим…. html(val) – заменяет. Так что моя версия не прошла, значит еще в чем-то дело…
Я с июля месяца канался, сегодня все получилось!!! УрА! Спасибо
Здравствуйте!
Разобрался в вопросе, но сейчас возникла сложность. Итак, суть проблемы: на сайте множество галерей, состоящих из огромного количества фотографий. Сначала было решено выводить все галереи сразу же на экран, но потом решили этого не делать, потому что страница получется загруженной. Перезагружать страницу для загрузки фоток-нельзя. Пришлось использовать аякс и jquery для разделения галерей и подгрузки их в фоновом режиме. Каждая галерея залинкована по идентификатору к jquery галереи lightbox. Проблема в том, что при подзагрузке галерей, новые галереи не обрабатываются скриптом lightbox и они вместо всплывающего окна открываются тупо в новом.
Может быть кто-то встречался с данной проблемой именно с lightbox и знает как проинициализировать ее заного. Изрыл инет — решения не нашел.
Использую такой код для загрузки:
function loadpage(div_id){
div_id.find(‘a.ajaxload’).click(
function(){
if ($(this).attr(«href»).indexOf(«http://») == -1) {
if ($(this).attr(«class») != «cajaxload») {
var url = $(this).attr(‘href’);
div_id.hide(’slow’,
function(){
div_id.empty();
$(«#loading_animation»).show();
$.get(url,{},
function(response){
$(«#loading_animation»).hide();
div_id.append(response).fadeIn(’slow’);
$.fn.lightbox.initialize();
loadpage(div_id);
}
)
}
);
return false;
}
}
}
);
}
$(document).ready(function(){
var div_id = $(‘#information_system_19′);
loadpage(div_id);
});
Имхо initialize() тут не прокатит… В callback-функции, которая выполняется при получении ответа сервера попробуйте выполнить:
$.Lightbox.construct({
……..
});
по идее так должно сработать.
З.Ы. Если конечно используете LightBox (balupton edition) в ее последней реинкарнации
Не помогло((((
Затупил)))) Поковырял чуток и все стало гуд! Спасибо огромное за подсказку!!
Доброй ночи.
как и некоторые предыдущие посетители хочу задать вопрос не в тему(не касаясь jQuery), но мне нужно просто понять принтцип, как сделать.
прочитав эту статью, понятно как получить ответ сервера, но у меня несколько другая задача.
и состоит она в следующем.
есть файл index.php
в этом файле через include подключены ещё 2 php файла, 1-й файл с формой для комментариев, 2-й – вывод самих комментариев.
надо сделать асинхронный запрос к обработчику, проверить форму, записать коммент в базу и вывести записаный коммент.
так вот, с большей частью задачи я справился, есть запрос, есть проверка данных, есть ответ сервера(или успех или ошибка о заполнении формы). но осталась нерешённый вопрос как вывести новый комментарий на страницу.
подскажите как правильно сделать?
или в обработчике, после записи коммента в БД сделать запрос к ней же, получить в цикле все комменты и вставить в ответ сервера или есть способ как обновить на index.php подключённый через include файл для вывода комментов?
ещё есть вопрос как мне вставить комменты в предназначеный для этого ?
ответ сервера об ошибках при заполнении формы я вставляю в предназначенный для этого , а сами комменты мне надо вставлять в другой .
формировать это в обработчике перед отправкой ответа сервера или уже после получения ответа в файле index.php.
если есть готовые примеры, дайте пожалуйста ссылку.
порывшись в инете толком ни чего не нашёл, а может плохо искал
вот ссылка на форму
http://test.roganov.kharkov.ua/lovedance/
прошу прощения ещё раз за вопрос не в тему, но побывав на некоторых блогах/сайта сложилось такое впечатление, что посетители задают вопросы в пустоту, ответов нет. только на Вашем блоге видно, что идёт диалог с посетителем
p.s.
>для этого ?
>ответ сервера об ошибках при заполнении формы я >вставляю в предназначенный для этого , а сами >комменты мне надо вставлять в другой .
здесь идёт речь о див,
Доброго… утра
:
В общем как я понял, вопрос только в том, как в одном ответе получить данные, для вставки их в разные элементы DOM, верно?
Если на сервере Вы формируете сообщение об ошибке заполнения формы (или инфу об успешном добавлении комментария), то там же можно взять из вашей БД последний добавленный ID (тут даже не надо все комменты лопатить).
Дальше совсем просто. Первая часть ответа – сообщение, вторая – последний коммент (если есть), так? Ну и задайте между ними разделитель какой-нибудь, например ::: или
В клиенте разбивайте ответ с помощью split и вставляйте части в отведенные для них места….
Вы несколько неверно с точки зрения методики подходите мне кажется…
Смотрите, элементов ‘#edit-has-date-’+i+’end-wrapper’ много, верно? Наверное стоит использовать какой-то объединяющий их признак, ну например имя класса, или что-то еще, чтобы выбрать их с помощью селектора в набор за один раз, а не в цикле выбирать каждый…
Пусть так:
$('.wrapper').each(function(){ $(this).change(function(){ // тут this - конкретный элемент набора // работайте с ним как угодно и без // привязки к id даже }); });Вот как-то так примерно…
Сергей, возможно… Почитайте статьи про селекторы jQuery, а точнее – фильтры атрибутов.
http://www.linkexchanger.su/2008/52.html
Gennady, Вы правильно поняли, спасибо за подсказку, буду пробовать.
Ну, ошибки бывают не только в синтаксисе, но и в логике например.
Может не отрабатывать при наличии обработчика onload на body, такое тоже бывает…
а вот если так опишу проблему:
есть куча форм, добавляющихся динамически по событию.
я пытаюсь прописать в яваскрипте цикл от 1 до N, который будет прописывать всем $(«#элемент»+i).change() вложенные условия.
Такая схема почему-то не работает.. Вернее все динамически добавленные элементы совершают действия не на свои дивы, а на последний добавленный элемент. Предположил, что возможно нужно делать другим способом: например, в тело какого-то элемента засовывать с моими .change()
т.е. чтобы мои функции прописывались непосредственно в код…
… все описанное = исключительно доводы, полученные в процессе страданий с jquery+drupal
To Сергей:
c друпалом….
на Ваш вопрос выше – я не сталкивался
А что касается последнего вопроса – я Вам описал схему как это делается, т.е. как правильно навесить обработчики событий на множество элементов – сначала выбрать все, а потом вешать события на элементы набора, обходя их специально для этого и предназначенным методом each.
Не думаю, что движок тут принципиально при чем-то. Он разве что на уровне подключения библиотеки может скажем, не понять пути и т.д. А у Вас, имхо, чистая методика…
Сергей, указанное в селекторе выражение, т.е.
выберет один-единственный элемент, тот у которого есть атрибут id=»events_chck». Если же таких элементов окажется много (а это неправильно! он должен быть уникальным в пределах веб-страницы), тогда будет выбран первый, встретившийся в html-разметке.
Вам бы надо почитать про селекторы jQuery – это очень важная часть и если ее хорошо не понимать, можно столкнуться с трудностями
… Я вас еще потерроризирую чуть чуть по смежным темам ?))
в этом коде
$(”.events_chck”).each(function() {
$(this).find(”input”).change(function() {
alert(this);
});
});
я могу как-то запомнить текущий объект .events_chck ?
на месте алерта мне нужно к нему обращаться, а this, понятно, уже от find изменился…
простое myVar = this при выводе пишет undefined, значит как-то по-другому нужно..
просто не рационально потом изнутри функции делать поиски родителей… да и тем более там класс одинаковый. Что посоветуете?
Сергей, всю переписку выше удаляю, поскольку для читателей отследить логику вопросов-ответов становится довольно затруднительно и может привести к неверным выводам….
Если хотите пример – высылайте html-разметку, четко опишите, что надо. Выберу немного времени – напишу обработчики. По примеру думаю все сразу поймете.
Прочитал эту тему, чувствую что копать надо в этом направлении. Но все равно не получается.
Нужно реализовать автозаполнение в подгружаемом ajax-ом окне. На самой странице автозаполнение работает в модальном окне нет.
Этой конструкцией
$(document).ready(function(){
$(‘#citi’).live(«keyup», function(){
alert($(this).attr(‘value’));
});
}
удалось назначить событие на подгружаемый select.
Как спомощью live или другим какм способом
рализовать такую конструкцию?
$(document).ready(function(){
$(‘#citi’).autocomplete(cities);
}
помогите пожалуйста уже третий день мучаюсь.
Спасибо за статью и отзыв с описанием live()
Статья хороша, примеров в комментах достаточно, но не нашел такой банальной ситуации, как следующая:
нажимаем на кнопку – загружается страница в определенный див. Как загрузилась – раскрывается тоглом.
При закрытии – этого дива – он очищается.
Не могу правильно написать код. помогите. Пока что код как и на открытие и на закрытие – загружает аякс.
$(«#demo»).click(function() {
$.ajax({
url: «form_contacts.php»,
beforeSend: function(){
$(«#demo_progress»).css(«display»,»inline»);
},
success: function(answ){
$(«#demo_progress»).fadeOut(500);
$(«#demo_form»).html(answ).toggle(«fast»);
}
});
});
Давайте так сделаем… Комментов уже много к статье – я обсуждение закрываю. Ваш вопрос продублирую на форуме, где и дам Вам пример.