Tрябва ли да пишем неща, които никога няма да ползваме? Source Code Licenses
Jul 16

Тези дни нямах много свободно време, но това не ми пречи да помогна малко на колега с JavaScript -а :) .
Така, основния проблем на моя колега беше че има списък със малки снимки и като се натисне някоя от тях, тя трябва да се покаже в цял размер. И както карам колегите в офиса, от доста време, JavaScript-a трябва да е unobtrusive и цялата страница да е функционална дори и с изключен от браузарът JavaScript. HTML кода ще изглежда горе-долу така:


<div id="big_image"><img src="{$picUrl}" alt="" /></div>
// ... code
<ul>
{foreach from=$pictures item=pic}
	<li><a href="{$pic.url}" target="_blank" rel="gallery"><img src="{$pic.thumb}" alt="" /></a></li>
{/foreach}
</ul>

Идеята е ако няма JavaScript просто снимката ще се отвори в нов прозорец, допълнителен плюс е и че ще имаме пътя за оригиналната снимката, достъпен чрез атрибута href на линковете.
Та колегата написъл следното:


Event.observe(window, 'load', function(){
	$$('a').each(function(a){
		a.observe('click', function(e){
			if (a.getAttribute('rel') == 'gallery') {
				$$('#big_image img').setAttribute('src', a.getAttribute('href'));
				e.stop();
			}
		});
	});
});

На пръв поглед не изглежда зле, но само на пръв поглед. Като за начало под много неуважавания IE6 снимката няма се сменя. А и  трябва и да се добави class=”selected” на избраната картинка.

Така че реших първо да пефасонирам кода и се получи това (сложих id=”thumb” на ul-то с малките снимка за по-бързо намиране на елементите):


document.observe('dom:loaded', function(){
	$$('#thumb a[rel=gallery]').invoke('observe', 'click', function(e){
		e.stop();
		$('big_image').down('img').setAttribute('src', this.getAttribute('href'));
	});
});

После добавих кръпката за IE6, за опресняване на снимка защото само със смяна на атрибута src няма да се промени снимката(поне в повечето случай).  И най-сигуния начин, който знам (ако някой знае по-добър, нека сподели) е изцяло да заменям img таг-а с нов img таг и така кода става такъв ( + това за class=”selected” )


document.observe('dom:loaded', function(){
	$$('#thumb a[rel=gallery]').invoke('observe', 'click', function(e){
		e.stop();
		$('big_image').innerHTML = '<img src="' + this.getAttribute('href') + '" />';
		this.up('ul').select('.selected').invoke('removeClassName', 'selected');
		this.addClassName('selected');
	});
});

Горе долу това е, като само в бъдеще един ефект за появяване и скриване на снимката трябва да се добави :)

Leave a Reply

  • Enter this code