page.php bei jeden Click (Tabs) neu holen/laden

Joe

Erfahrenes Mitglied
Guten Tag,

ich habe mit Hilfe von einem Tutorial eine Tabfunktion in mein Script eingebaut.

Das alles funktioniert zwar aber ich möchte verhindern das die page.php "gecachet" werden sondern sie sollen bei jeden Click neu geholt werden.

Das hier lädt die Daten der jeweiligen page.php und soll erst bei click geladen werden.
HTML:
		/* Setting the page data for each hyperlink: */
		tmp.find('a').data('page',j);

Der modifizierte funktionierende ganze Code (ohne CSS)
HTML:
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.0/jquery.min.js"></script>
<script>$(document).ready(function(){
	/* This code is executed after the DOM has been completely loaded */
	
	/* Defining an array with the tab text and AJAX pages: */
	var Tabs = {
		'Ress'	: 'pages/page1.php',
		'Lager'	: 'pages/page2.php',
		'Gepäck'	: 'pages/page3.php',
		'Lager2'	: 'pages/page4.php'
	}
	
	/* The available colors for the tabs: */
	var colors = ['blue','green','red','orange'];
	
	/* The colors of the line above the tab when it is active: */
	var topLineColor = {
		blue:'lightblue',
		green:'lightgreen',
		red:'red',
		orange:'orange'
	}
	
	/* Looping through the Tabs object: */
	var z=0;
	$.each(Tabs,function(i,j){
		/* Sequentially creating the tabs and assigning a color from the array: */
		var tmp = $('<li><a href="#" class="tab '+colors[(z++%4)]+'">'+i+' <span class="left" /><span class="right" /></a></li>');
		
		/* Setting the page data for each hyperlink: */
		tmp.find('a').data('page',j);
		
		/* Adding the tab to the UL container: */
		$('ul.tabContainer').append(tmp);
	})

	/* Caching the tabs into a variable for better performance: */
	var the_tabs = $('.tab');
	
	the_tabs.click(function(){

		/* "this" points to the clicked tab hyperlink: */
		var element = $(this);

		/* Detecting the color of the tab (it was added to the class attribute in the loop above): */
		var bg = element.attr('class').replace('tab ','');

		/* Removing the line: */
		$('#overLine').remove();
		
		/* Creating a new line with jQuery 1.4 by passing a second parameter: */
		$('<div>',{
			id:'overLine',
			css:{
				display:'none',
				width:element.outerWidth()-2,
				background:topLineColor[bg] || 'white'
			}}).appendTo(element).fadeIn('slow');
		
		/* show the gif preloader and run an AJAX request: */
		$('#contentHolder').html('<img src="img/img/ajax_preloader.gif" width="64" height="64" class="preloader" />');
		
		$.get(element.data('page'),function(msg){
			$('#contentHolder').html(msg);
		});
			
	})
	
	/* Emulating a click on the first tab so that the content area is not empty: */
	the_tabs.eq(0).click();
});</script>

<div id="main">

<ul class="tabContainer">
<!-- The jQuery generated tabs go here -->
</ul>

<div class="clear"></div>

<div id="tabContent">
	<div id="contentHolder">
    	<!-- The AJAX fetched content goes here -->
    </div>
</div>

</div>

Ich denke nicht das es ein schweres Problem ist leider bin ich noch immer nicht firm genug mit Javascript.
Würde mich freuen wenn mir jemand helfen kann.

Gruss Joe.
 
Ich kann in dem Code keinen Caching Mechanismus erkennen. Ich nehme an, du willst das Browser-Caching umgehen.

Javascript:
//Vorher
$.get(element.data('page'), function(msg){
    $('#contentHolder').html(msg);
});

//Nachher
$.get(element.data('page') + (new Date().getTime()), function(msg){
    $('#contentHolder').html(msg);
});
 
  • Gefällt mir
Reaktionen: Joe
Hey CPoly,
danke fürs drüberschauen. Nun für mich ists vermutlich nochmals schwiriger zu verstehen was genau passiert.
Ich denke es werden erst alle Daten in einer Schleife zusammengebaut als UL-Container ich nenns mal den Container für die Tabulatoren.

Wenn man so will könnte man das als Caching bezeichnen:
HTML:
/* Caching the tabs into a variable for better performance: */
	var the_tabs = $('.tab');

Die Tabs werden, so denke ich, also mit den pages.php, für jeden Tab, vorbelegt.
HTML:
	/* Looping through the Tabs object: */
	var z=0;
	$.each(Tabs,function(i,j){

Die Funktion the_tabs.click(function() greift also anscheinend nur wenn ein Click auf den vorgeladenen Tab getätigt wird.


Ich müsste das vorbelegen
$.each(Tabs,function(i,j)
in die
the_tabs.click(function()
reinbekommen. So das die tabs erst einmal leer wären.
Der emulierte Click zum schluss füllts dann.

Mein Problem ist wohl mangelnde Kompetenz denn genau das schaffe ich nämlich nicht.. auch wenn ich mir nun schon Seitenweisse Javascript abhandlungen angeschaut habe. Vorerst ists doch noch nur wollen :)

Edit beinahe vergessen: die getime funktion im code klappt so nicht. Also es zeigt dann garnix an weder tabs noch Tabinhalt.
 
Zuletzt bearbeitet:
Die Inhalte werden es beim Klick geladen. Alle Inhalte kommen ja in das gleiche Element "#contentHolder". Es gibt also mehrere Tab-Köpfe/Links, aber immer nur einen Inhalt.

Könnte du bitte nochmal unabhängig vom Code beschreiben, wie das aktuelle Verhalten ist und wie sich dieses vom gewünschten Verhalten unterscheidet?
 
Gerne.

Es es sind in diesen Fall genau 4 Tabs Ress ,Lager, Gepäck, Lager2.
Diese Tabs werden neben dem Hauptcontent in einem anderen Div angezeigt.
Die dynamische Navigation lädt überall dieses Div und deren Inhalt ein.

Jedoch wird genau für jeden Tab ein eigener Inhalt geladen:
HTML:
var Tabs = {
		'Ress'	: 'pages/page1.php',
		'Lager'	: 'pages/page2.php',
		'Gepäck'	: 'pages/page3.php',
		'Lager2'	: 'pages/page4.php'
	}
Es sind also 4 Inhalte für 4 Tabs.

Das klappt auch jedoch gibt es zb folgende Situation (Da es ein BG ist nehme ich auch so eine Situation):
Man geht ins Lager und nimmt sich Ressourcen heraus das passiert über ein Post() welche dann die Seite aktualisiert darstellt.
Soweit alles kein Problem und garnicht das Thema.
Das Problem ist es aktualisiert sich nicht der Inhalt der jquery/Ajax Tabulatoren. Die zeigen einen unveränderten Bestand.

Aus einen mir nicht verständlichen Grund wird also der Inhalt der Tabs nicht neugeladen.
 
Zuletzt bearbeitet:
Deine POST-Aktion eine AJAX-Abfrage, wenn ich das richtig verstanden habe? In diesem Fall solltest du eine Callback-Funktion der POST-Aktion definieren, die alle vier Inhaltsbereiche danach aktualisiert. Ansonsten ist es nicht verwunderlich, dass die Inhalte auf dem alten Stand bleiben.
 
  • Gefällt mir
Reaktionen: Joe
@Einfach nur Crack
nope nicht so ganz, mit Ajax hole ich die 4 verschiedenen page.php (page1.php, page2...)
Ums mal etwas zu entwirren:
Meine dynamische Navigation lädt beinahe immer die gleichen divs. Ändern tut sich dann nur der Inhalt des MainContent-div.
Das Jquery/Ajax Script hier also die Tabs werden immer in einem Nebendiv (rechts vom MainContent) dazu geladen.

Dieses Nebendiv hat dann eben meine 4 Tabs je welchen Tab man klickt holt das Script (Ajax/JQuery) dann die entsprechende page(1-4).php und gibt sie aus.

Angenommen im MainContent wird gerad das Lager dargestellt und in Nebendiv wird der Tab Ress angezeigt. Klickt man nun etwas ein oder auslagern hat sich scheinbar nix im Nebendiv also den Tabs geändert. Im MainContent dagegen alles Prima die Post Aktrion (php) war erfolgreich.
Lediglich die Tabs reagierten scheinbar nicht.
Scheinbar weil ich feststellte das nach einigen Sekunden dann doch die Anzeige der Tabs stimmte. Man muss also warten ,nix klicken und nach einigen sekunden erscheint die richtige Ausgabe nach einen Klick auf dem Tab.
Sofortiges Klicken oder eine header weiterleitung zur selben Seite hingegen bewirkt scheinbar nix.

Es wurde also tatsächlich gecached und zwar Ajax-seitig.
Dieses Stück Code verhindert das Caching:
HTML:
$.ajaxSetup ({
    // Disable caching of AJAX responses
    cache: false
});
Und genau das löst das Problem nun zeigen meine Tabs immer genau den aktuellen Inhalt da sie immer neugeladen werden anstatt gecached.

OriginalTuT
Mein modifizierter Code ohne CSS:
HTML:
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.0/jquery.min.js"></script>
<script>
$.ajaxSetup ({
    // Disable caching of AJAX responses
    cache: false
});

$(document).ready(function(){
	/* This code is executed after the DOM has been completely loaded */
	
	/* Defining an array with the tab text and AJAX pages: */
	var Tabs = {
		'Ress'	: 'pages/page1.php',
		'Lager'	: 'pages/page2.php',
		'Gepäck'	: 'pages/page3.php',
		'Lager2'	: 'pages/page4.php'
	}
	
	/* The available colors for the tabs: */
	var colors = ['blue','green','red','orange'];
	
	/* The colors of the line above the tab when it is active: */
	var topLineColor = {
		blue:'lightblue',
		green:'lightgreen',
		red:'red',
		orange:'orange'
	}
	
	/* Looping through the Tabs object: */
	var z=0;
	$.each(Tabs,function(i,j){
		/* Sequentially creating the tabs and assigning a color from the array: */
		var tmp = $('<li><a href="#" class="tab '+colors[(z++%4)]+'">'+i+' <span class="left" /><span class="right" /></a></li>');
		
		/* Setting the page data for each hyperlink: */
		var jqxhr = tmp.find('a').data('page',j)
		
		
		/* Adding the tab to the UL container: */
		$('ul.tabContainer').append(tmp);
	})

	/* Caching the tabs into a variable for better performance: */
	var the_tabs = $('.tab');
	
	the_tabs.click(function(){

		/* "this" points to the clicked tab hyperlink: */
		var element = $(this);

		/* Detecting the color of the tab (it was added to the class attribute in the loop above): */
		var bg = element.attr('class').replace('tab ','');

		/* Removing the line: */
		$('#overLine').remove();
		
		/* Creating a new line with jQuery 1.4 by passing a second parameter: */
		$('<div>',{
			id:'overLine',
			css:{
				display:'none',
				width:element.outerWidth()-2,
				background:topLineColor[bg] || 'white'
			}}).appendTo(element).fadeIn('slow');
		
		/* show the gif preloader and run an AJAX request: */
		$('#contentHolder').html('<img src="img/img/ajax_preloader.gif" width="64" height="64" class="preloader" />');

			$.get(element.data('page'),function(msg){
				$('#contentHolder').html(msg);
			})	
	})
	/* Emulating a click on the first tab so that the content area is not empty: */
	the_tabs.eq(0).click();
});</script>

<div id="main">

<ul class="tabContainer">
<!-- The jQuery generated tabs go here -->
</ul>

<div class="clear"></div>

<div id="tabContent">
	<div id="contentHolder">
    	<!-- The AJAX fetched content goes here -->
    </div>
</div>

</div>
 

Neue Beiträge

Zurück