prayerslayer
Oar. Mh.
|
Hm, da hab ich was vergessen zu schreiben. Um die JSON Daten im HTML Dokument zu haben, verwende ich <div id="myJSONData">${myJSONData}</div>
Im Handler meines Controllers (Spring Framework...) rufe ich modelAndView.addObject("myJSONData", myJSONString);
auf. Das erstetzt dann die Variable im div durch myJSONString. So weit, so gut. Ich kenne leider keine andere Möglichkeit um Daten ins DOM zu schreiben und befürchte aufs stärkste, dass sich wegen der ${} Syntax irgendwas in die Quere kommen wird, wenn der Code nicht einer JSP steht.
|
jives
And the science gets done
|
Und was würde gegen <script type="text/javascript">var myJSON = ${myJSONData};</script>
sprechen?
|
prayerslayer
Oar. Mh.
|
Nichts handfestes, weil ich es noch nicht probiert habe. Mein Bedenken war, dass wegen dem Start mit ${... sich jQuery einschalten wird. (--> ${document}.ready(), ${"myJSONData").html()...) Andererseits habe ich ja schon auf jQuery.noConflict() umgestellt, also ist es einen Versuch wert
|
jives
And the science gets done
|
Ich hab praktisch keine Erfahrung mit JSP, aber ich nehme doch stark an, dass der Client nichts von der ${}-Syntax sehen wird. Das sind doch nur Platzhalter in den Templates und werden serverseitig ersetzt (?). Außerdem ist die Syntax für Selektoren bei jQuery eh $()
|
prayerslayer
Oar. Mh.
|
Außerdem ist die Syntax für Selektoren bei jQuery eh $()  Ah ups  Da hast du wohl recht  Na ich meld mich dann später wieder.
|
prayerslayer
Oar. Mh.
|
ZOMG DAS FUNKTIONIERT
|
jives
And the science gets done
|
 Glad to help
|
prayerslayer
Oar. Mh.
|
Ihr seid echt eine große Hilfe, danke  Ich hätt wieder etwas. Und zwar versuche ich grad ein Autocomplete-Feature zu schreiben. Was ich dafür machen müsste, wäre in einem text input Teile markieren zu können. Oder noch schärfer, wenn die Autocomplete-Vorschläge nicht markiert, sondern so ausgegraut wären. Leider hab ich nicht wirklich was gefunden, aber das geht doch! //Edit: Ausgrauen wird vermutlich nur mit Flash, Silverlight oder sowas gehen, hab ich recht? Dann lass ich das raus. JS+HTML only! Bisheriger Code (mehrere Suchbegriffe durch whitespaces getrennt): var $j = jQuery.noConflict();
var allSug = jsonSI; //alle verfügbaren suchbegriffe
var oldSug = allSug; //suchbegriffe, die den bisherigen string gematched haben
function suggestSearchItem() {
var typed = $j("#searchString").val();
console.log(typed);
console.log(oldSug);
if (typed=="Enter your search here"){
return;
}
var newSug = "[";
var suggestion = typed;
//whitespace separates search items
if (typed.charAt(typed.length-1)==' ') {
oldSug = allSug;
console.log("skipped character");
return;
}
//if there are more than 1 search item, take only the last one
if (typed.lastIndexOf(" ")!=-1){ //more than one search item
console.log("more than one search string");
typed = typed.substring(typed.lastIndexOf(" ")+1);
console.log("using "+typed);
}
//go through old suggestions
for (var i=0; i<oldSug.length-1; ++i) {
//if smth from old suggestions matches the char, add it to new suggestions
console.log("check "+oldSug[i].name.charAt(typed.length-1)+" and "+typed.charAt(typed.length-1));
if (oldSug[i].name.charAt(typed.length-1)==typed.charAt(typed.length-1)) {
newSug+="{\"name\":\""+oldSug[i].name+"\"},";
}
console.log(newSug);
}
//if there were new suggestions, overwrite old ones
if (newSug.length>1) {
console.log("parse suggestions");
newSug = newSug.substring(0, newSug.length-1);
newSug+="]";
console.log("--> "+newSug);
oldSug = JSON.parse(newSug);
}
//write it in input field
suggestion+=oldSug[0].name.substring(suggestion.length);
console.log("suggesting: "+suggestion);
$j("#searchString").val(suggestion);
}
Ist noch buggy, zB gibts Probleme wenn Chars gelöscht werden. Und natürlich dass der Cursor dann am Ende des Autocompletes steht. Außerdem muss ich noch einbauen, dass mit Pfeil runter oder Tab oder sowas der nächste Vorschlag kommt.
Bearbeitet von prayerslayer am 08.06.2010, 17:05
|
jives
And the science gets done
|
Du möchtest kein Dropdown-Menü so wie hier http://docs.jquery.com/UI/Autocomplete oder? Hab ich das richtig verstanden dass im Input einfach auf den nächsten Vorschlag vervollständigt wird - also z.B. Input: jq wird zu jQ ery, wobei der letzte Teil markiert ist/eine andere Farbe hat?
|
prayerslayer
Oar. Mh.
|
Das wäre auch schön. Aber kann ich da mehrere auswählen und zB mit Komma oder Blank trennen?
//Ich habs nämlich gestern mit dem Plugin versucht, aber da hat sich jQueryUI beschwert. "Property source is not a function" oder so.
Bearbeitet von prayerslayer am 09.06.2010, 16:08
|
prayerslayer
Oar. Mh.
|
Passt, ich steh wieder mal auf der Leitung. Ich will ein simples Verwaltungssystem für die verfügbaren Tags machen. Am Anfang ist ein Suchfeld mit Autocomplete und ein "Manage" Button. Nach Klick auf "Manage" verschwindet dieser und es erscheinen 2 Buttons "Edit" und "Delete". Die sollen dann auch genau das machen und submitten alten und neuen Namen des Tags mit POST ans Servlet. <script type="text/javascript">
function createEditInput() {
var search = newItemName.value; //alter inhalt des autocomplete feldes
$j("#searchButton").remove(); // managebutton entfernen
$j("#editForm").append("<INPUT type='hidden' value='"+search+"' id='oldName'/><INPUT id='editButton' name='editButton' type='submit' value='Edit'/><INPUT id='editButton' name='editButton' type='submit' value='Delete'/>" ); //andere 2 buttons hinzufügen
}
</script>
Ich hab 2 Submit-Buttons mit gleicher ID und Namen, weil ich gelesen hab, dass ich im Servlet abfragen kann, welcher gedrückt wurde. Der Rest sind jedenfalls nur mehr 2 Forms. <form id="editForm" action="searchItems" method="POST">
<INPUT type="text" id="newItemName" name="newItemName" value="Type desired search item to edit"/>
<INPUT type="button" id="searchButton" onClick="createEditInput();" value="Manage"/>
Problem: "400 - Request syntactically incorrect." Die Sachen kommen gar nicht im Servlet an. Kann es sein, dass durch das append() die Submitbuttons nicht beim Form "registriert" sind?
Bearbeitet von prayerslayer am 13.06.2010, 20:10
|
-=Willi=-
The Emperor protects
|
Ein paar kurze Tipps, die ich so gesammelt habe, während ich mit jQuery gearbeitet hab: Der Selector ist wie schon gesagt $(), nicht $j() und wenn man mit jQuery arbeitet sollte der gesamte JavaScript-Code zwischen $({ ... }); stehen, selbst Funktionsdefinitionen. z.B: <script type="text/javascript">
$({
function foo()
{
alert("bar");
}
$(".button").click(function() { foo(); });
});
</script>
Hat zwar jetzt nicht direkt etwas mit deinem Problem zu tun aber vielleicht hilft es dir. edit: Form-Elemente im Nachhinein hinzufügen sollte normal schon gehen.
Bearbeitet von -=Willi=- am 13.06.2010, 21:52
|
prayerslayer
Oar. Mh.
|
Hättest ein paar Posts weiter oben gelesen, wüsstest du dass das $j fürs JQuery.NoConflict() da ist  Danke für die Mühe, aber hilft mir nicht...
|
-=Willi=-
The Emperor protects
|
Hättest ein paar Posts weiter oben gelesen, wüsstest du dass das $j fürs JQuery.NoConflict() da ist D'oh  . Könnte es daran liegen, dass <INPUT type='hidden' value='"+search+"' id='oldName' /> kein name-Attribut hat?
|
prayerslayer
Oar. Mh.
|
Hm, ich war der Meinung dass name optional ist, wenn man schon id hat. Aber ich probiers gleich...
|