#javascript #ajax #load #lightbox #slimbox
#javascript #ajax #загрузить #лайтбокс #slimbox
Вопрос:
Я буквально все просмотрел в Интернете, но безуспешно, поэтому теперь я обращаюсь к тем, кто точно знает, что они делают.
Я загружаю изображения с facebook, используя симпатичный маленький инструмент, который использует jQuery для загрузки изображений из определенного альбома на фан-страницу.
Вот страница, над которой я сейчас работаю: http://www.sfssc.ca/houstonwehaveaproblem.html
Моя проблема в том, что я не могу заставить изображения внизу страницы работать с slimbox.
Сценарий для этого
<script>
jQuery(document).ready(function() {
var AlbumID = "163187497033669";
var graph = "https://graph.facebook.com/" AlbumID "/photos?callback=?";
jQuery.getJSON(graph, function(data) {
var albumItem = [];
for(var key in data){
for(var key2 in data[key]){
val2=data[key][key2];
if(typeof(val2.source)!="undefined"){
albumItem.push(
'<li><a class="imageLink" rel="lightbox" href="' val2.source '" ><img src="' val2.picture '"/></a></li>'
);
};
};
};
jQuery('<ul />', {
'class': 'album',
html: albumItem.join('')
}).appendTo('#FBalbum');
});
});
</script>
Единственные изменения, которые я внес в этот скрипт, это то, что я добавил rel=»lightbox» в 12-ю строку. Когда я проводил исследование, моим лучшим обоснованным предположением было то, что это была команда, называемая Ajax, и Slimbox нужно было перезагрузить. Хотя это может быть на 100% неверно.
Если кто-нибудь может мне помочь с этим, я был бы очень признателен. Все, что мне нужно, это иметь возможность использовать slimbox с загруженными этими изображениями.
Спасибо, Саймон
Ответ №1:
Я предполагаю, что вы только что включили файл slimbox JS. Это не будет работать, поскольку в DOM нет изображений при загрузке slimbox, потому что они добавляются впоследствии, а slimbox работает только для ссылок, которые УЖЕ присутствуют при вызове функции.
Добиться того, что вы говорите, просто, немного изменив slimbox.js . Вы найдете это в нижней части slimbox.js:
// AUTOLOAD CODE BLOCK (MAY BE CHANGED OR REMOVED)
if (!/android|iphone|ipod|series60|symbian|windows ce|blackberry/i.test(navigator.userAgent)) {
jQuery(function($) {
$("a[rel^='lightbox']").slimbox({/* Put custom options here */}, null, function(el) {
return (this == el) || ((this.rel.length > 8) amp;amp; (this.rel == el.rel));
});
});
}
Оберните его внутри функции и просто вызывайте его всякий раз, когда вы динамически меняете DOM (после добавления изображений). Измените приведенный выше код на этот:
function loadsb(){
if (!/android|iphone|ipod|series60|symbian|windows ce|blackberry/i.test(navigator.userAgent)) {
$("a[rel^='lightbox']").slimbox({/* Put custom options here */}, null, function(el) {
return (this == el) || ((this.rel.length > 8) amp;amp; (this.rel == el.rel));
});
} }
Вызов loadsb()
после appendTo('#FBalbum');
РЕДАКТИРОВАТЬ: поскольку у вас возникли проблемы, позвольте мне сделать это еще проще.
Используйте это как свой slimbox.js
: http://pastebin.com/8iye0PEB . Я удалил объявление функции из этого файла, добавлю его в JS на главной странице.
Теперь я вижу из вашего включенного JS, на объект Jquery не ссылается $
, на него ссылается jQuery. итак, теперь ваша главная страница JS будет:
<script>
//Function to load SlimBox. PS: I'm refrencing the jQuery object by "jQuery" and not $ sign because of your markup
function loadsb(){
if (!/android|iphone|ipod|series60|symbian|windows ce|blackberry/i.test(navigator.userAgent)) {
jQuery("a[rel^='lightbox']").slimbox({/* Put custom options here */}, null, function(el) {
return (this == el) || ((this.rel.length > 8) amp;amp; (this.rel == el.rel));
});
} }
jQuery(document).ready(function() {
var AlbumID = "163187497033669";
var graph = "https://graph.facebook.com/" AlbumID "/photos?callback=?";
jQuery.getJSON(graph, function(data) {
var albumItem = [];
for(var key in data){
for(var key2 in data[key]){
val2=data[key][key2];
if(typeof(val2.source)!="undefined"){
albumItem.push(
'<li><a class="imageLink" rel="lightbox" href="' val2.source '" ><img src="' val2.picture '"/></a></li>'
);
};
};
};
jQuery('<ul />', {
'class': 'album',
html: albumItem.join('')
}).appendTo('#FBalbum');
//Let's now call the function we created above
loadsb();
//Slimbox is now loaded.
});
});
</script>
Также, пожалуйста, обратите внимание: теперь, когда мы должны вручную загрузить slimbox, он не будет работать, просто включив JS-файл на страницу. вам придется использовать объявление функции и вызывать ее всякий раз, когда вы хотите загрузить SB. (или просто переместите объявление функции в slimbox.js файл и вызовите его один раз в самом этом файле.)
Комментарии:
1. Спасибо @Abhinav Pandey, но, похоже, это не работает, теперь даже загруженное в html изображение не работает. Я сделал, как вы сказали, заменил блок кода на тот, который вы показали ниже, и добавил в html-скрипт loadsb() в разделе appendTo(‘#FBalbum’); , но безуспешно. У вас есть какие-либо идеи, что может быть не так?
2. Вероятно, потому, что объект jQuery на вашей странице не обрабатывается
$
знаком. В любом случае, я отредактировал свой ответ, прочитайте под словом Редактировать