You are not logged in.

  • Login

1

Sunday, August 14th 2011, 2:28pm

Kategorie laden ala Ebay-Kleinanzeigen

Hallo liebe programmierer Freunde,

wie der Titel schon sagt suche ich ein auf ajax basierendes Script was es möglich macht die Kategorien nach zu laden,
vom Design her wie Ebay-Kleinanzeigen ( Bsp. http://kleinanzeigen.ebay.de/anzeigen/p-…-aufgeben.html# )

Ich habe schon das Select-Auswahl mit AJAX Abhängigkeit und verschiedenen Tabellen ausprobiert und für mich angepasst,
leider sind dies Select Option Boxen, wie wird dies bei ebay-kleinanzeigen macht, spielt da Javascript eine große Rolle ?

Meine Tabelle ist wie folgt aufgebaut.....

Eine Kategorie Tabelle mit den Kategorien > id, name, parentID.

Wenn ihr mir weiter helfen könntet würde ich mich sehr freuen.

Großes Lob an die Tutorial Schreiber!!!

Einen schönen Sonntag euch noch :)

This post has been edited 1 times, last edit by "mopsel" (Aug 15th 2011, 6:53am)


2

Sunday, August 14th 2011, 3:24pm

Hi,
also das ebay Kleinanzeigen Script arbeitet auch mit JavaScript.
Wenn du das Tutorial schon umgesetzt hast und es am Ende nur noch so aussehen soll, wie bei ebay, dann brauchst du dazu nur ein bisschen CSS.

Beispiel

Cascading Style Sheets

1
2
3
4
select {
  border: 0px !important;
  background-color: transparent !important;
}

3

Monday, August 15th 2011, 5:29am

Ein großes Danke Torben :)

Da hätt ich selbst drauf kommen müssen ;)

Ich sehe grade das es bei ebay, Listen Elemente sind, geht dies auch bei der Variante die wie hier benutzen?

4

Monday, August 15th 2011, 6:16pm

Jein, geht natürlich, aber das JavaScript in unserem Tutorial ist für Select+Option gedacht.
Das erkennst du an den Stellen:

JavaScript Code

1
targetSel.options[i++] = new Option(

5

Monday, August 15th 2011, 8:30pm

Ah alles klar, danke.

Das geht dann natürlich nicht.
Ich habe versucht Listenelemente draus zu machen, merke das es garnicht so einfach ist, dachte durch ein einfaches ersetzen einer Zeile ist es schick ;)

Aber das were zu einfach, ich bin leider nur in PHP und CSS mit den Basics mal mehr mal weniger vertraut, mit Javascript bzw. Ajax habe ich
mich noch garnicht beschäftigt, muss auch leider gestehen das ich es nur in meiner Freizeit mache und ganz schön viel ist :)

Ich ziehe mein Hut vor dir Torben, dass du das alles hier auseinander halten und so viele Fragen immer beantworten kannst, egal in welche Richtung !
Dein Lebenslauf spricht für sich ;)

Siehst du eine einfache & schnelle Möglichkeit das ganze auf Listenelemnte umzuschreiben?

6

Tuesday, August 16th 2011, 9:07am

Was spricht denn gegen die Select Liste? Die Select Liste hat den Vorteil, dass man es als Ergänzung zum normalen Formular nutzen kann.
Das ganze mit <li> Listen und versteckten Input Hidden Feldern zu machen, macht das ganze doch unnötig komplex. Für einen JavaScript Anfänger ist es als nicht so einfach.

7

Tuesday, August 16th 2011, 9:21am

Da hast du wohl recht, was mich ein wenig Stört ist ist das Design, im Firefox bleibt die Scrollleiste immer zu sehen, im IE schick ;)

Ich habe eine schöne Art gefunden so eine Select Box etwas zu verschönern....

http://www.ka-mediendesign.de/blog/indiv…eckbox-styling/

Habe sie versucht einzubauen nur leider füllt er die Felder nicht aus, er zeigt mir keins zur Auswahl und öffnet sich auch nur mit einer einzelnen Zeile nach unten
obwohl ich 3 Datensätze habe, ich denke aber da wird sich irgendwas mal wieder nicht miteinander verstehen :)

Aber dieses Design würde schon richtig schick sein, nur leider bekomme ich es nicht zum laufen :(

Kennst du eine andere Art es etwas aufzuschmücken, außer die leider wenigen Möglichkeiten mit CSS ?

8

Tuesday, August 16th 2011, 6:17pm

Ah ok.. Select-Listen im Firefox haben in der Tat ein Problem mit der Scrollbar. So ist es natürlich nicht hübsch.
Also ich werde meine Version wohl nicht auf <li> umbauen. Vielleicht schaue ich mir es am Wochenende nochmal an.
Ansonsten bleibt dir nur übrig, einen weißen Balken drüber zulegen :)

9

Saturday, August 20th 2011, 3:21pm

Stimmt, ein weißer Balken ist dann auch noch möglich :)

Sage mal ich versuche die Ausgabe nebeneinander sprich horizontal auszugeben , aber irgendwie will es nicht, was mach ich falsch ?

HTML Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<table>
		<tr>
			<td id="elem1" style="display:none">
			<select name="hauptkategorie" size="5" onchange="sendRequest(this, 'elem2')">
			<option value=""></option></select></td>
 
			<td id="elem2" style="display:none">
			<select name="unterkategorie" size="3" onchange="sendRequest(this, 'elem3')">
			<option value=""></option></select></td>
 
			<td id="elem3" style="display:none">
			<select name="unterunterkategorie" size="3" onchange="sendRequest(this, 'elem4')">
			<option value=""></option></select></td>
 
			<td id="elem4" style="display:none">
			<select name="unterunterkategorie" size="3" onchange="sendRequest(this, 'elem5')">
			<option value=""></option></select></td>
 
			<td id="elem5" style="display:none">
			<select name="unterunterkategorie" size="3" onchange="sendRequest(this, 'elem6')">
			<option value=""></option></select></td>
 
			<td id="elem6" style="display:none">
			<select name="unterunterkategorie" size="1" onchange="sendRequest(this)">
			<option value=""></option></select></td>
		</tr>
	</table>


Ist es möglich im letzten Select eine Art Fertig Meldung auszugeben, dass nicht einfach zum Schluss eine leere Select Box da steht ?

10

Saturday, August 20th 2011, 10:33pm

Mein Script toggle display zwischen block und none.. tds sind aber display:table-cell
Entweder du änderst den JavaScript Code oder du stellst auf divs um.

Nimm doch statt der Tabelle divs mit float:left

11

Sunday, August 21st 2011, 9:26am

Dank dir, hat gut geklappt mit den divs... für alle die es auch brauchen .....

HTML Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<div>
 
			<div id="elem1" style="display:none; float:left;">
			<select name="hauptkategorie" size="5" onchange="sendRequest(this, 'elem2')">
			<option value=""></option></select></div>
 
			<div id="elem2" style="display:none; float:left;">
			<select name="unterkategorie" size="5" onchange="sendRequest(this, 'elem3')">
			<option value=""></option></select></div>
 
			<div id="elem3" style="display:none; float:left;">
			<select name="unterkategorie" size="5" onchange="sendRequest(this, 'elem4')">
			<option value=""></option></select></div>
 
			<div id="elem4" style="display:none; float:left;">
			<select name="unterkategorie" size="5" onchange="sendRequest(this, 'elem5')">
			<option value=""></option></select></div>
 
			<div id="elem5" style="display:none; float:left;">
			<select name="unterkategorie" size="5" onchange="sendRequest(this, 'elem6')">
			<option value=""></option></select></div>
 
			<div id="elem6" style="display:none; float:left;">
			<select name="unterkategorieende" size="5" onchange="sendRequest(this)">
			<option value=""></option></select></div>
 
	</div>
	<br style="clear: left;" />





Kannst du mir auch sagen, was ich ändern muss,
dass eine Art Fertig Meldung erschein wenn man die letzte Select Box ausgewählt hat,
zur Zeit kommt zum Schluss einfach nur eine leere Select Box.

Vielen Dank schonmal!

12

Sunday, August 21st 2011, 11:01am

Naja, das ist im Mini Tutorial nicht vorgesehen. Wenn du es programmieren magst, dann würde ich empfehlen, dass du im letzten Select einen zusätzlichen Parameter angibst.

HTML Code

1
... onchange="return sendRequest(this, false, 'success')"


Den JavaScript änderst du wie folgt:

JavaScript Code

1
2
3
4
5
6
7
8
function sendRequest(domref, target, success) {
	if(success) {
		success = document.getElementById(success);
		success.style.display = 'block';
	}
 
	// skip if no target specified
	if(!target) return false;


Und im HTML platzierst du eine Success Meldung innerhalb von <div id="success"></div>

13

Monday, August 22nd 2011, 5:23am

Morgen Torben,

dass klappt ganz gut, nur leider klappt es nur wenn ich auch wirklich bei dem letzten Select Element ankomme,
dass heißt ist die Kategorientiefe nicht so tief sondern nur 1 oder 2 Unterkategorien tief, greift es nicht, weil er ja das nächste Elemente anspricht
was aber dann keinen Inhalt hat.

Kann man den Parameter "success" nicht einfach immer übergeben und im Javascript abfragen, wenn Rückgabewert leer,
dann gebe Success aus ?

14

Monday, August 22nd 2011, 6:17pm

Select-Auswahl mit AJAX Abhängigkeit

script.js Zeile 52 - Dort kannst du prüfen ob die Daten leer sind und success ausgeben.
In dem Fall darf domref natürlich nicht leer sein, da Zeile 22 sonst zum Abbruch führt.

JavaScript Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
/**
 * clears a select form element
 * 
 * @param targetSel - dom reference to the select element
 */
function clearSelect(targetSel) {
	for (var i=targetSel.length; i>=0; i--) {
		targetSel.options[i] = null;
	}
}
/**
 * sends a request under usage of a loading graphic - targettable has to be positioned relative
 *
 * @param srcref - reference to the select element with chosen data
 * @param target - form element name of target element
 */
function sendRequest(domref, target) {
	// skip if no target specified
	if(!target) return false;
 
	// save reference to next target
	if(domref) domref.followup = target;
 
	var req;
	try {
		req = window.XMLHttpRequest ? new XMLHttpRequest():
			new ActiveXObject("Microsoft.XMLHTTP");
	} catch (e) {
		// no AJAX Support
	}
	req.onreadystatechange = function() {
		if ((req.readyState == 4) && (req.status == 200)) {
			// merge empty line with response
			var data = eval('(' + req.responseText + ')');
			var targetRef = document.getElementById(target);
			var targetSel = targetRef.getElementsByTagName('select')[0];
 
			// make it visible
			targetRef.style.display = 'block';
 
			// clear old data
			clearSelect(targetSel);
 
			// fill with data from json response
			var i=0;
			for(var x in data) {
				targetSel.options[i++] = new Option(
					data[x].text, 
					data[x].id
				);
			}
 
			// clear all followups
			while(targetSel.followup) {
				targetRef = document.getElementById(targetSel.followup);
 
				// make it hidden
				targetRef.style.display = 'none';
 
				// mark next select
				targetSel = targetRef.getElementsByTagName('select')[0];
 
				// clear old data
				clearSelect(targetSel);
			}
		}
	}
 
	req.open('post', 'ajax.php');
	req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
 
	// send empty post with initial load
	req.send(domref !== null ? 'id='+domref.value+'&name='+domref.name : '');
 
	return false; // return false to avoid reload/recentering of the page
}

15

Tuesday, August 23rd 2011, 5:31pm

In welcher Variablen steckt der der Ausgabewert, den ich abfragen müsste ?

Ich habe jetzt in jedem

HTML Code

1
2
3
<div id="elem2" style="display:none; float:left;">
			<select name="unterkategorie" size="5" onchange="sendRequest(this, 'elem3', 'success')">
			<option value=""></option></select></div>

success mit übergeben.

Und an Zeile 52

JavaScript Code

1
2
3
4
if(success) {
		success = document.getElementById(success);
		success.style.display = 'block';
			}

eingefügt.

Was muss noch in der if Abfrage rein, dass er es auch nur dann aus gibt wenn das Select leer wäre, also die Datenbankanfrage kein Ergebnis zurück gibt ?

16

Tuesday, August 23rd 2011, 9:02pm

Was muss noch in der if Abfrage rein, dass er es auch nur dann aus gibt wenn das Select leer wäre, also die Datenbankanfrage kein Ergebnis zurück gibt ?

Prüfe auf i, das wird vorher hoch iteriert.
if(i && success)

17

Thursday, September 8th 2011, 11:21pm

Hey Torben, ich bin deinem Rat gefolgt,
und werfe nun ein Div Container mit einer Fertigmeldung über alle Select Boxen, wenn die letzt mögliche Auswahl getroffen wurde.

Nach langem suchen und probieren, muss ich doch nochmal nachfragen :)

Gibt es die Möglichkeit, wenn ja wie, die Select Boxen zu resetten bzw. den ganzen Div Container der Select Box/en neuzuladen?
Problem ist wenn die Auswahl getroffen wurde und die Fertigmeldung nun über allen Select Boxen liegt, kann ich sie nicht mehr ändern.

Danke schonmal!
Schönen Abend noch :)

18

Thursday, September 8th 2011, 11:33pm

Noch eine Zusatzfunktion? Ohje... na dann lass uns Callbacks unterstützen

JavaScript Code

1
2
3
4
5
6
7
8
9
function sendRequest(domref, target, success) {
	if(success) {
		if(typeof success == 'function') {
			success();
		} else {
			success = document.getElementById(success);
			success.style.display = 'block';
		}
	}


Außerdem musst du folgende Methode bekannt machen:

JavaScript Code

1
2
3
4
5
6
7
8
9
function easyfunc1() {
	// zeige success
	success = document.getElementById(success);
	success.style.display = 'block';
 
	// verstecke die selects
	selectdiv = document.getElementById('div_um_select');
	selectdiv.style.display = 'none';
}


und so aufrufen:

HTML Code

1
... onchange="sendRequest(this, 'elem3', easyfunc1)">

Similar threads

Social bookmarks