Jeden skrypt kłóci się z drugim

0

Od razu zaznaczam, że przygodę z webmasteringiem zacząłem dwa dni temu dopiero, wcześniej zajmowałem się tylko layoutami, ale zdecydowałem, że fajnie byłoby się usamodzielnić.

No i pociąłem sobie layout, HTML wygląda tak:

<html> 
<head>
//tutaj pierdoły meta, title, itd.
<link href="index.css" rel="stylesheet" type="text/css">
<link rel="stylesheet" href="nivo-zoom.css" type="text/css" media="screen" />
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js" type="text/javascript"></script>
<script src="jquery.nivo.zoom.pack.js" type="text/javascript"></script>

<script type="text/javascript">
$(window).load(function() {
	$('body').nivoZoom({
		speed:1100,
		zoomHoverOpacity:0.8,
		overlay:true,
		overlayColor:'#FFFFFF',
		overlayOpacity:0.8,
		captionOpacity:0.8
	});
});
</script>

<script type="text/javascript" src="js.js"></script>
<script type="text/javascript" src="jquery.js"></script>
</head>
<body>
<div id="main">
	<div id="header"> 
		//headerowe rzeczy
	</div>
	<div id="left">
		<ul>
			<li><a rel="nofollow" href="index.html" title="strona glówna">strona glówna</a></li>
			<li><a rel="nofollow" href="index.html?go=portretowe" title="portretowe">portretowe</a></li>
			<li><a rel="nofollow" href="index.html?go=komercyjne" title="komercyjne">komercyjne</a></li>
			<li><a rel="nofollow" href="index.html?go=makro" title="makro">makro</a></li>
			<li><a rel="nofollow" href="index.html?go=oferta" title="oferta">oferta</a></li>
			<li><a rel="nofollow" href="index.html?go=o nas" title="o nas">o nas</a></li>
		</ul>		
	</div>
	<div id="content">
		<ul>
			<li><a rel="nofollow" href="images/z1large.jpg" class="nivoZoom topLeft"><img src="images/z1.jpg" border="0"></a></li>
			<li><a rel="nofollow" href="images/z2large.jpg" class="nivoZoom topRight"><img src="images/z2.jpg" border="0"></a></li>
			<li><a rel="nofollow" href="images/z3large.jpg" class="nivoZoom topRight"><img src="images/z3.jpg" border="0"></a></li>
			<li><a rel="nofollow" href="images/z4large.jpg" class="nivoZoom topLeft"><img src="images/z4.jpg" border="0"></a></li>
			<li><a rel="nofollow" href="images/z5large.jpg" class="nivoZoom center"><img src="images/z5.jpg" border="0"></a></li>
			<li><a rel="nofollow" href="images/z6large.png" class="nivoZoom center"><img src="images/z6.jpg" border="0"></a></li>
			<li><a rel="nofollow" href="images/z7large.jpg" class="nivoZoom bottomLeft"><img src="images/z7.jpg" border="0"></a></li>
			<li><a rel="nofollow" href="images/z8large.png" class="nivoZoom center"><img src="images/z8.jpg" border="0"></a></li>
			<li><a rel="nofollow" href="images/z9large.jpg" class="nivoZoom bottomRight"><img src="images/z9.jpg" border="0"></a></li>
		</ul>
	</div>
	
</div>

</body></html>

I teraz tak. Póki miałem tylko wgrany skrypt (nie mój, tylko trochę przerobiony na mój użytek) z jquery.nivo.zoom.pack.js to wszystko było okej. Skrypt ten działa tak, że po naciśnięciu na miniaturę będącą odnośnikiem w contencie pokazuje się pełnowymiarowa wersja obrazka tak jakby nad warstwą strony, po kolejnym kliknięciu wraca. Do tego momentu wszystko było cacy. Tutaj dołączałem:
http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js
jquery.nivo.zoom.pack.js

Po dołączeniu jQuery.js i skryptu js.js powodującego, że po kliknięciu odnośnika w #left zmienia się TYLKO #content, to po jednym takim kliknięciu na odnośnik strona zaczyna wariować i ten nivo-zoom już nie działa, tzn. otwiera się zdjęcie ale w nowej stronie..

I teraz nie wiem czy nie ma tu jakiegoś konfliktu miedzy tymi skryptami? Czy może po prostu jednej takiej zamianie contentu po kliknięciu odnośnika jest jakiś inny błąd powodujący, że zoom przestaje działać?

js.js wygląda tak:

$(document).ready(function() {
						   
	var hash = window.location.hash.substr(1);
	var href = $('#left li a').each(function(){
		var href = $(this).attr('href');
		if(hash==href.substr(0,href.length-5)){
			var toLoad = hash+'.html #content';
			$('#content').load(toLoad)
		}											
	});

	$('#left li a').click(function(){
								  
		var toLoad = $(this).attr('href')+' #content';
		$('#content').fadeOut(1400,loadContent);
		window.location.hash = $(this).attr('href').substr(0,$(this).attr('href').length-5);
		function loadContent() {
			$('#content').load(toLoad,'',showNewContent())
		}
		function showNewContent() {
			$('#content').fadeIn(1400);
		}
		return false;
		
	});

}); 

Najważniejsza informacja jest taka, że po wykonaniu powyższej funkcji (czyli po kliknięciu w odnośnik w nawigacji) coś się psuje w skrypcie zoomowania. Bo PRZED kliknięciem w odnośnik, cały nivo-zoom normalnie działa. A więc prawdopodobnie ta funkcja w powyższym skrypcie wykonuje coś takiego co uniemożliwia potem wykonanie skryptu zoomowania.

file:///C:/Users/Mosar/Desktop/fotolay/index.html - tutaj się da zoomować
file:///C:/Users/Mosar/Desktop/fotolay/index.html#index - tu już nie, tak jakby po wejściu tutaj już nie umiało się odnieść do skryptu związanego z zoomem.

0

Dzieje się tak, ponieważ zdarzenia do elementów przypinane są raz - w momencie załadowania strony. Potem robisz zapytanie ajax z tego co zrozumiałem. USUWASZ więc elementy, które oczekują zdarzeń i wstawiasz nowe. I już do tych nowych zdarzeń nie przypinasz ponownie. Nie wiem jak wywołujesz to nivo, ale poszukaj opcji przypięcia zdarzeń na stałe - nawet po zmianie zawartości - albo ręcznie je przypinaj jeszcze raz.

0

No okej dziękuje bardzo za odpowiedź. Postaram się coś z tym zrobić, choć ciężko będzie, bo kod tego nivo nie jest taki klarowny i ładny jak ten js.js

nivo:

eval(function(p,a,c,k,e,d){e=function(c){return(c<a?'':e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--){d[e(c)]=k[c]||e(c)}k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1};while(c--){if(k[c]){p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c])}}return p}('(f($){$.R.C=f(16){b e=$.1z({},$.R.C.X,16);4(e.F){4(!($.15.1y&&$.15.1x.1A(0,1)<8)){$(\'1B\').1E(\'<18 1D="y" />\');$(\'#y\').9({O:\'1C\',v:0,u:0,m:\'J%\',q:\'J%\',1F:e.W,r:e.11,\'z-P\':1w,Q:\'1j\'})}}1a 7.17(f(){b 14=$(7);b 13=$(\'a.C\',14);13.17(f(){b 3=$(7);4(3.1o(\'a\')){b 6=$(7).1p(\'6:S\');3.9({O:\'1v\',Q:\'1u-1q\'});3.j(\'1l\',\'1n 1h 1t\');3.1f(\'<18 1s="h" />\');b h=$(\'.h\',3);h.9(\'r\',\'0\');3.1r(f(){4(!3.i(\'B\')){h.1c().E({r:e.V},1b)}},f(){4(!h.i(\'G\')){h.1c().E({r:0},1b)}});3.1G(\'1V\',f(){4($(\'6.N\',3).K==0){h.A(\'G\');Y(6,3,f(){h.12(\'G\');H(6,3,h)})}l{H(6,3,h)}1a T})}})});f H(6,3,h){b o=$(\'6.N\',3);4(3.i(\'B\')){4(e.F)$(\'#y\').I(e.n/2);4($(\'.c\',3).K>0){$(\'.c\',3).I(e.n/2)}o.I(e.n/2,f(){6.E({r:1},e.n/2)});3.12(\'B\')}l{4(e.F)$(\'#y\').M(e.n/2);h.9(\'r\',\'0\');6.E({r:0},e.n/2,f(){o.M(e.n/2,f(){1e(6,o,3)})});3.A(\'B\')}}f 1e(6,o,3){4($(\'.c\',3).K>0){b c=$(\'.c:S\',3);4(!c.i(\'10-Z\')){b s=6.m();4(s==0)s=6.j(\'m\');b t=6.q();4(t==0)t=6.j(\'q\');b p=o.m();4(p==0)p=o.j(\'m\');b k=o.q();4(k==0)k=o.j(\'q\');c.9({m:p,r:e.19});4(3.i(\'1g\')){c.9({v:(k-c.L())+\'w\',D:\'g\'})}l 4(3.i(\'1k\')){c.9({x:\'g\',D:\'g\'})}l 4(3.i(\'1m\')){c.9({x:\'g\',u:\'g\'})}l 4(3.i(\'U\')){c.9({v:1H.1I(t/2-k/2)+(k-c.L())+\'w\',u:(s/2-p/2)+\'w\'})}l{c.9({v:(k-c.L())+\'w\',u:\'g\'})}c.A(\'10-Z\')}c.M(e.n/2)}}f Y(6,3,1i){b 1d=1O 1X();$(1d).1P(f(){$(7).A(\'N\');$(7).9({O:\'1K\',Q:\'1j\',\'z-P\':1S});4(1T.1Z.1U(/1W \\d\\.\\d+/)){3.9(\'z-P\',\'J\')}4(3.i(\'1g\')){$(7).9({v:\'g\',D:\'g\'})}l 4(3.i(\'1k\')){$(7).9({x:\'g\',D:\'g\'})}l 4(3.i(\'1m\')){$(7).9({x:\'g\',u:\'g\'})}l 4(3.i(\'U\')){b s=6.m();4(s==0)s=6.j(\'m\');b t=6.q();4(t==0)t=6.j(\'q\');b p=$(7).m();4(p==0)p=$(7).j(\'m\');b k=$(7).q();4(k==0)k=$(7).j(\'q\');$(7).9({v:(t/2-k/2)+\'w\',u:(s/2-p/2)+\'w\'})}l{$(7).9({v:\'g\',u:\'g\'})}$(7).j(\'1l\',\'1n 1h 1M\');3.1f($(7));1i.1N(7)}).j(\'1Q\',3.j(\'1R\'))}};$.R.C.X={n:1J,V:0.8,F:T,W:\'#1Y\',11:0.5,19:0.8}})(1L);',62,124,'|||link|if||img|this||css||var|nivoCaption||settings|function|0px|nivoZoomHover|hasClass|attr|bigImgHeight|else|width|speed|imgLarge|bigImgWidth|height|opacity|imgWidth|imgHeight|left|top|px|bottom|nivoOverlay||addClass|zoomed|nivoZoom|right|animate|overlay|loading|doZoom|fadeOut|100|length|outerHeight|fadeIn|nivoLarge|position|index|display|fn|first|false|center|zoomHoverOpacity|overlayColor|defaults|loadImg|processed|nivo|overlayOpacity|removeClass|nivoZooms|context|browser|options|each|div|captionOpacity|return|300|stop|newImg|showCaption|append|topRight|to|callback|none|bottomRight|title|bottomLeft|Click|is|find|block|hover|class|zoom|inline|relative|90|version|msie|extend|substr|body|fixed|id|prepend|background|bind|Math|ceil|500|absolute|jQuery|close|call|new|load|src|href|99|navigator|match|click|MSIE|Image|333|userAgent'.split('|'),0,{}))

Dla mnie to trochę mało jasne. Ten skrypt do wyświetlania tylko contentu jest fajnie napisany, a to tutaj to jakaś masakra, wygląda gorzej niż kod w asemblerze :D

No i do tego funkcja:

<script type="text/javascript">
$(window).load(function() {
	$('#content li').nivoZoom({
		speed:1100,
		zoomHoverOpacity:0.8,
		overlay:true,
		overlayColor:'#FFFFFF',
		overlayOpacity:0.8,
		captionOpacity:0.8
	});
});
</script>
0

skrypt jest spakowany http://matthewfl.com/unPacker.html

0

Aaaa, dzięki :)

Tak jak mówiłem akurat w kwestii webmasteringu jestem totalnie początkujący. Ogólna umiejętność programowania mi coś daje, ale ogromnej ilości rzeczy jeszcze nie wiem :/ Chyba mnie to póki co przerasta (naprawienie tego), bo to się mija z celem korzystanie z jQuery nie wiedząc jak właściwie to działa.

2

Błędem Twoim, jak i większości jest "uczenie się jQuery" - zapominając, że jest to framework do javascriptu. Pasowałoby pierwsze poznać język, jego konstrukcje itd, a potem brać się za framework.

edit:
Nie musisz absolutnie znać kodu nivo, żeby naprawić błąd. Po prostu w funkcji, która obsługuje Ci poprawne przyjęcie danych przez ajax - wklep jeszcze raz to samo, co masz w window load

0

Dzięki za pomoc, nie zrobiłem dokładnie tak jak napisałeś, ale naprowadziło mnie to na rozwiązanie. Po prostu to co miałem w window load wkleiłem osobno do każdej miniatury na onclick :) W ten sposób już działa za każdym razem.

0

@Mossar: Wklej tu zapytanie ajax, to Ci pokaże o co mi chodzi, to jest nawet łatwiejsze, niż Twoje dopisywanie do onclick

0

Problem w tym, że właśnie nie wiem gdzie mam to zapytanie AJAX, jak wprowadzałem ten skrypt to musiałem dołączyć ten plik nivo.zoom.pack.js i dodać ten skrypt:

 
<script type="text/javascript">
$(window).load(function() {
	$('body').nivoZoom({
		speed:1100,
		zoomHoverOpacity:0.8,
		overlay:true,
		overlayColor:'#FFFFFF',
		overlayOpacity:0.8,
		captionOpacity:0.8
	});
});
</script>

A potem jedyne co musiałem zrobić, żeby działał zoom na obrazku to dodanie do <a> frazy class="nivoZoom" tak jak tutaj:
<a href="images/z1large.jpg" class="nivoZoom">

Nic więcej nie umieszczałem, czyli reszta jest obsługiwana chyba w tym nivo.zoom.pack.js, który daję tutaj. Z tego co widzę to najważniejsze sie zaczyna na 21 linijce.
http://pastie.org/8117692
Robiłem według strony twórcy:
http://nivozoom.dev7studios.com/

0

Po dołączeniu jQuery.js i skryptu js.js powodującego, że po kliknięciu odnośnika w #left zmienia się TYLKO #content

tego potrzebuję

0
 
$(document).ready(function() {
						   
	var hash = window.location.hash.substr(1);
	var href = $('#left li a').each(function(){
		var href = $(this).attr('href');
		if(hash==href.substr(0,href.length-5)){
			var toLoad = hash+'.html #content';
			$('#content').load(toLoad)
		}											
	});

	$('#left li a').click(function(){
								  
		var toLoad = $(this).attr('href')+' #content';
		$('#content').fadeOut(1400,loadContent);
		window.location.hash = $(this).attr('href').substr(0,$(this).attr('href').length-5);
		function loadContent() {
			$('#content').load(toLoad,'',showNewContent())
		}
		function showNewContent() {
			$('#content').fadeIn(1400);
		}
		return false;
		
	});

});
0

To teraz wywal ten window load całkiem i zrób w pliku js tak:

function przypnijZdarzeniaNivo() { // funkcja, w której dodajesz zdarzenia nivo
  $('body').nivoZoom({
    speed:1100,
    zoomHoverOpacity:0.8,
    overlay:true,
    overlayColor:'#FFFFFF',
    overlayOpacity:0.8,
    captionOpacity:0.8
  });
}

$(window).load(przypnijZdarzeniaNivo); // po załadowaniu strony dodajemy zdarzenia

function showNewContent(fade) { // funkcja przeniesiona tutaj, żeby zawsze była zdefiniowana
  if (fade) { $('#content').fadeIn(1400); }
  przypnijZdarzeniaNivo();
}

$(document).ready(function() {
        var hash = window.location.hash.substr(1);
        var href = $('#left li a').each(function(){
                var href = $(this).attr('href');
                if(hash==href.substr(0,href.length-5)){
                        var toLoad = hash+'.html #content';
                        $('#content').load(toLoad, showNewContent) // funkcja ta zastępuje elementy, więc trzeba będzie znowu dodać zdarzenia do nowych elementów
                        // zajrzyj w dokumentację http://api.jquery.com/load/
                }                                                                                        
        });
 
        $('#left li a').click(function(){
                var toLoad = $(this).attr('href')+' #content';
                $('#content').fadeOut(1400,loadContent);
                window.location.hash = $(this).attr('href').substr(0,$(this).attr('href').length-5);
                function loadContent() {
                        $('#content').load(toLoad,function(){ showNewContent(true); }); // potrzebujemy przekazać parametr do funkcji showNewContent, więc musimy otoczyć to funkcją anonimową (przeszukaj google za tym hasłem) - poprzedni zapis był całkiem błędny i dziwię się, że w ogóle działał
                }
                return false;
        });
});
 
0

Pięknie działa, dziękuje bardzo.

W tym miejscu $('#content').load(toLoad,function(){ showNewContent(true); }) oprócz wczytywania nowego contentu jednocześnie są przypinane zdarzenia związane z Nivo tak, dlatego, że u góry wywołałeś funkcję przypnijZdarzeniaNivo w tym showNewContent? Wcześniej było tak, że po takim załadowaniu contentu, Nivo nie było przypinane na nowo, bo nie było w ogóle powiązane z tym, a teraz z tego co rozumiem jest przy każdym ładowaniu contentu.

Co do tej funkcji anonimowej to trochę poczytałem o niej, ale nie za bardzo rozumiem, czemu tutaj wymagane było otoczenie tej funkcji anonimową, a nie da się po prostu wywołać tej funkcji.

1
Mossar napisał(a):

W tym miejscu $('#content').load(toLoad,function(){ showNewContent(true); }) oprócz wczytywania nowego contentu jednocześnie są przypinane zdarzenia związane z Nivo tak, dlatego, że u góry wywołałeś funkcję przypnijZdarzeniaNivo w tym showNewContent? Wcześniej było tak, że po takim załadowaniu contentu, Nivo nie było przypinane na nowo, bo nie było w ogóle powiązane z tym, a teraz z tego co rozumiem jest przy każdym ładowaniu contentu.

Dokładnie

Co do tej funkcji anonimowej to trochę poczytałem o niej, ale nie za bardzo rozumiem, czemu tutaj wymagane było otoczenie tej funkcji anonimową, a nie da się po prostu wywołać tej funkcji.

Kiedy jako parametr przekazujesz funkcję, nie możesz przekazać argumentów tej funkcji. Czyli jak masz np.

function testowa(x) {
  if (x==1) { alert('jeden'); }
  else { alert('nie jeden'); }
}
function abc(funkcja_do_odpalenia) {
  // wykonuje jakies akcje, a na koniec odpala funkcję z parametru
}

to nie możesz zrobić tak:

abc(testowa(1)); // źle

możesz zrobić tak:

abc(testowa);

Wobec tego brak jest możliwości przekazania tej jedynki w parametrze.
A więc otaczasz to funkcją anonimową, która parametrów sama z siebie nie przyjmuje, ale w treści wywołuje interesującą nas funkcję z parametrem:

abc(testowa, function(){ testowa(1); });

jeżeli jest to nieczytelne, to rozpiszmy to tak:

zamiast_anonimowej = function() {
  testowa(1);
}
abc(testowa, zamiast_anonimowej);

Nie jestem dobry w tłumaczeniu, mam nadzieję, że to zrozumiałe

0

Jak to nie, ja zrozumiałem od razu jak to wytłumaczyłeś. Po prostu nie da się wywołać funkcji z parametrem będącym funkcją z parametrem, więc trzeba to jakoś ominąć robiąc funkcję bezargumentową, w której wywoływana jest funkcja z argumentem. Dzięki jeszcze raz :) Dużo mi ta pomoc dała.

1 użytkowników online, w tym zalogowanych: 0, gości: 1