praegune kellaaeg 16.06.2024 14:20:28
|
Hinnavaatlus
:: Foorum
:: Uudised
:: Ärifoorumid
:: HV F1 ennustusvõistlus
:: Pangalink
:: Telekavad
:: HV toote otsing
|
|
autor |
sõnum |
|
Naljatilk
HV kasutaja
liitunud: 03.03.2006
|
20.04.2010 14:08:22
Javascripti abil "option" tägi muutmine |
|
|
Tervist!
Mul on pisuke probleem javascriptiga: koostasin oma firmale laosüsteemi ning soovin, et toodete arv ühes sissekandes ei ole fikseeritud. Lahendusena kasutan AJAX-it ning ridu saab juurde lisada nii, kuidas tuju on.
Ainuke jama on, et kui laen uue rea, taastatakse teksti input-ides ja selectides algne väärtus: kui laadisin selecti nii, et teatud optionile on lisatud tag SELECTED, siis jääb see option antud selectis püsima.
<select name="select1">
<option value="1">Esimene</option>
<option value="2" SELECTED>Teine</option>
</select> |
Kui aga ei lisa SELECTED tägi lehe laadimisel (Ajaxi lehe), valin ise käsitsi teise variandi, siis nullitakse valik ära. Sama ka inputidega.
Lihtsustatud kood, mis laeb uue rea näeb välja:
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=iso8859-4" />
<script type="text/javascript" src="js/ajax.js"></script>
<script type="text/javascript">
// koostatakse string uusSelect, mis liidetakse tooted_div div-ile juurde
// string näeb välja <select><option1>esimene option</option1> ... </select><div id="lisadiv1"></div>
// selectil on juures onchange atribuut, mis andmete muutmise korral kutsub välja uue funktsiooni, mis lisab hinna ja koguse lisadiv1-te.
// kui lisada uus select, siis nullitakse selecti väärtus ära, kui optionil puudub SELECTED
function xmlToSelect(Sisend,valitudId){
var tooteid = document.getElementById('tooteid').value;
var andmed = Sisend.split("</kokku>");
var kokkuA = andmed[0];
var kokkuB = kokkuA.split("<kokku>");
var i = parseInt(kokkuB[1]) + 1;
var allesString = andmed[1];
var uusSelect = '<select id="toode' + tooteid + '" name="toode' + tooteid + '" onchange="tooteAndmed(this.options[this.selectedIndex].value, ' + tooteid + ');"><option value="0">Vali toode</option>';
for(var j = 1; j < i; j++){
// pikk jutt, s*tt jutt
// siin asjad laabuvad
if(nuumer == valitudId)
uusSelect += '<option id="toodeOption' + j + '" SELECTED value="' + nuumer + '">' + toode + '</option>'; //print
else
uusSelect += '<option id="toodeOption' + j + '" value="' + nuumer + '">' + toode + '</option>'; //print
}
uusSelect += '</select><div id="toode_ekstra_div'+tooteid+'" style="display:inline;"> </div>';
document.getElementById('tooted_div').innerHTML += uusSelect;
}
function XmlToToode(Sisend,selectiNr){
var division = 'toode_ekstra_div' + selectiNr;
var andmed = Sisend.split("</myygihind>"); //splitib stringi Sisend koha pealt </kokku>
var kokkuA = andmed[0];
var kokkuB = kokkuA.split("<myygihind>");
var myygihind = kokkuB[1];
var andmed = Sisend.split("</km>"); //splitib stringi Sisend koha pealt </kokku>
var kokkuA = andmed[0];
var kokkuB = kokkuA.split("<km>");
var km = kokkuB[1];
document.getElementById(division).innerHTML = '<input type="text" name="kogus' + selectiNr + '" id="kogus' + selectiNr + '" value="1" />' +
'<input type="text" name="hind' + selectiNr + '" id="hind' + selectiNr + '" value="' + myygihind + '" />' +
'<input type="text" name="km' + selectiNr + '" id ="km' + selectiNr + '" value="' + km + '" /><br />';
summa();
}
function uusToode(id){
// kutsub ajaxi abil uue lehe, returnib stringi, string töötab
// kutsub välja xmlToSelect funktsiooni
// tulemuseks <select>, mille abil saab valida soovitud toodete vahel
}
function tooteAndmed(id){
// kutsub ajaxi abil uue lehe, returnib stringi, string töötab
// kutsub välja XmlToToode funktsiooni
// tulemuseks input boxid <select> tägi järgses divisioonis
}
</script>
</head>
<body>
<form method="post" action="action.php">
<input type="hidden" id="tooteid" name="tooteid" value="0" />
<label>Toode:</label>
<div id="tooted_div">
Toote div
</div>
<label> </label><a href="javascript:uusToode(0)"><img src="images/pluss.png" /></a><br />
</form>
</body></html>
|
Kõik töötab ja laetakse uus rida, ainuke jama on, et read resetitakse. Javascriptiga olen tegelenud kõige enam kuu aega praeguseks, aga kuna php ja Java taust on olemas, oskan kasutada interneeduse abi probleemide lahendamiseks. Sellest hoolimata võin oskamatusest vigu teha või ei tea "petmismeetodeid".
Üritasin lahendada probleemi sellega, et muudan JS abil <option>'i SELECTED-iks, aga mingil põhjusel ei tunnista option oma atribuuti
Pikem kood, mida kasutasin on seesugune:
function selectOptionByValue(selObj, val){
var A= selObj.options, L= A.length;
while(L){
if (A[--L].value== val){
document.getElementById('toodeOption'+L).selected = true;
L= 0;
}
}
} |
Või ka tagastasin L-i, lisasin igale optionile unique id ja üritasin selle läbi lisada optionit selected=selected ja true ja 1.
Lisaks ka:
document.getElementById('toode' + selectiNr).options[number].selected = 'selected'; |
Oskab keegi öelda, mida ma teen valesti või, kuidas lahendada probleemi?
Viimase lahendusena võiks ju teoorias laadida kogu tooted_div elemendi JS vahemällu, otsida stringitöötlusega üles selectedIndex-i (valuede ja selectide numbrite abil) jne-jne, aga see on parasjagu viimane teema, milleni jõuan.
Tuharikast õhku,
Martin
_________________ Vaata pilti |
|
Kommentaarid: 11 loe/lisa |
Kasutajad arvavad: |
|
:: |
0 :: |
0 :: |
11 |
|
tagasi üles |
|
|
andrusny
Kreisi kasutaja
liitunud: 20.03.2006
|
20.04.2010 17:50:36
|
|
|
Kole palju infi. Kui tahtsid nüüd küsida, kuidas JS abil selectida teatud option, siis see võiks nii käia.
<select name="select1" id="valik">
<option value="1">Esimene</option>
<option value="2" >Teine</option>
</select>
<script>
var selectmenu=document.getElementById("valik")
selectmenu.options[1].selected = true;
</script> |
_________________
|
|
Kommentaarid: 7 loe/lisa |
Kasutajad arvavad: |
|
:: |
0 :: |
0 :: |
7 |
|
tagasi üles |
|
|
nene
Kreisi kasutaja
liitunud: 20.03.2004
|
20.04.2010 21:32:09
|
|
|
Naljatilk, sa näed palju vaeva käsitsi XML-i parsimisega, aga kui sa laed Ajaxi päringuga XML-i, siis on brauser juba sinu eest kogu töö ära teinud ja sul jääb vaid üle kasutada XMLHttpRequest objektis sisalduvat XML DOM-i. Näiteks nii:
// olgu xhr meil XMLHttpRequest objekt, mis on just XML-i ära laadinud.
var dom = xhr.responseXML.documentElement;
var myygihind = dom.getElementsByTagName("myygihind")[0];
var km = dom.getElementsByTagName("km")[0]; |
_________________ Mõistus otsas? Pane pinusse... |
|
Kommentaarid: 24 loe/lisa |
Kasutajad arvavad: |
|
:: |
0 :: |
1 :: |
23 |
|
tagasi üles |
|
|
Naljatilk
HV kasutaja
liitunud: 03.03.2006
|
20.04.2010 22:32:16
|
|
|
andrusny kirjutas: |
Kole palju infi. Kui tahtsid nüüd küsida, kuidas JS abil selectida teatud option, siis see võiks nii käia.
<select name="select1" id="valik">
<option value="1">Esimene</option>
<option value="2" >Teine</option>
</select>
<script>
var selectmenu=document.getElementById("valik")
selectmenu.options[1].selected = true;
</script> |
|
Ligikaudu selline mu küsimus oli tõesti. Sellise nurga alt ma isegi lähenesin erinevaid meetmeid pidi, aga viga see ei lahendanud..
Probleem on see, et kui lisan uue tooterea
<select name="select1" id="valik">
<option value="1">Esimene</option>
<option value="2" >Teine</option>
</select> |
ja valin seal näiteks teise optioni ning määran JS-ga, et "Teine" on selected=true. Uue rea lisades "reset"-itakse kõik eelmised selectid ära ehk selles selectis oleks aktiivne hoopiski "Esimene".
Kui lisada uus rida nii, et koheselt on valitud "Teine" võimalus
Probleem on see, et kui lisan uue tooterea
<select name="select1" id="valik">
<option value="1">Esimene</option>
<option value="2" SELECTED >Teine</option>
</select> |
siis uue rea lisades jääb ikkagi valituks "Teine" option.
Probleem ja lahendus saavad seega olla kahes kohas:
1. kui uuendan kasti "tooted_div", ei nullitaks eelnevaid ära
2. otsesesse DOM-i saaks lisada SELECTED väärtuse.
Siinkohas jääbki mul kogemusest vajaka.. Kuidas jõuda selleni, et pärast iga plussile vajutust ei nullitaks kõike ära?
nene kirjutas: |
Naljatilk, sa näed palju vaeva käsitsi XML-i parsimisega, aga kui sa laed Ajaxi päringuga XML-i, siis on brauser juba sinu eest kogu töö ära teinud ja sul jääb vaid üle kasutada XMLHttpRequest objektis sisalduvat XML DOM-i. Näiteks nii:
// olgu xhr meil XMLHttpRequest objekt, mis on just XML-i ära laadinud.
var dom = xhr.responseXML.documentElement;
var myygihind = dom.getElementsByTagName("myygihind")[0];
var km = dom.getElementsByTagName("km")[0]; |
|
Tänud õpetussõnade eest! Taaskord on probleemiks see, et ei ole eriti tegelenud AJAX-iga. Ma tean, et peab saama TagName-i abil otsida ning jamasin sellega paar kaunist tunnikest kuni andsin alla ning läksin stringitöötluse peale üle.
Tundub, et mul jäi lisamata responseXML-ile vaid documentElement.
Uurin asja pisut lähemalt lähiajal, hetkel üritan saada põhja tööle ja siis hakkan vaatama ilusamate asjade poole.
_________________ Vaata pilti |
|
Kommentaarid: 11 loe/lisa |
Kasutajad arvavad: |
|
:: |
0 :: |
0 :: |
11 |
|
tagasi üles |
|
|
nene
Kreisi kasutaja
liitunud: 20.03.2004
|
21.04.2010 01:19:26
|
|
|
Ma arvan, et su probleem on selles reas:
document.getElementById('tooted_div').innerHTML += uusSelect; |
Iga kord kui sa tooted_div sisse uue <select> elemendi lisad lood sa kogu tooted_div sees oleva HTML-i uuesti. <option> elemendi selected atribuut määrab aga vaikimisi valitud väärtuse; kui kasutaja select-kastist midagi valib, siis see selected atribuudi väärtust ei muuda, seega ei kajastu kasutaja valitud väärtus ka innerHTML-is ja läheb kaduma.
See probleem on lihtsasti välditav kasutades appendChild meetodit. Näiteks nii:
javascript:
|
function xmlToSelect(Sisend, valitudId) { ... var tooted = document.getElementById("tooted_div"); var select = document.createElement("select"); select.id = "toode" + tooteid; select.name = "toode" + tooteid; select.onchange = function(){ tooteAndmed(this.options[this.selectedIndex].value, tooteid); }; select.innerHTML = '<option value="0">Vali toode</option>'; tooted.appendChild(select); }
|
_________________ Mõistus otsas? Pane pinusse... |
|
Kommentaarid: 24 loe/lisa |
Kasutajad arvavad: |
|
:: |
0 :: |
1 :: |
23 |
|
tagasi üles |
|
|
Naljatilk
HV kasutaja
liitunud: 03.03.2006
|
21.04.2010 16:54:47
|
|
|
nene kirjutas: |
Naljatilk, sa näed palju vaeva käsitsi XML-i parsimisega, aga kui sa laed Ajaxi päringuga XML-i, siis on brauser juba sinu eest kogu töö ära teinud ja sul jääb vaid üle kasutada XMLHttpRequest objektis sisalduvat XML DOM-i. Näiteks nii:
// olgu xhr meil XMLHttpRequest objekt, mis on just XML-i ära laadinud.
var dom = xhr.responseXML.documentElement;
var myygihind = dom.getElementsByTagName("myygihind")[0];
var km = dom.getElementsByTagName("km")[0]; |
|
Üritasin seda viisi kasuta, aga annab ikka ja jälle vea.
Hetkel näeb mu xmlHttpRequesti funktioon välja seesugune
javascript:
|
function httpRequestReturn(url, alko){ if (window.XMLHttpRequest) { // code for IE7+, Firefox, Chrome, Opera, Safari yhendus = new XMLHttpRequest(); } else { // code for IE6, IE5 try { yhendus = new ActiveXObject("Msxml2.XMLHTTP"); } catch (e) { try { yhendus = new ActiveXObject("Microsoft.XMLHTTP"); } catch (e) {} } } yhendus.overrideMimeType('text/xml'); yhendus.open("GET", url, false); // asynkroonne yhendus.send(null); return yhendus.responseXML.documentElement; }
|
Edasi saadetakse see XMLobject vanale heale funktsioonile:
javascript:
|
function xmlToSelect(Sisend, valitudId){ var i = Sisend.getElementsByTagName("kokku")[0]; ...
|
Selle kõige peale kuvab mulle error console
Error: Sisend.getElementsByTagName is not a function |
Kas probleem on
1. süntaksis?
2. peaksin ma saatma selle responseXML-i otse AJAXi päringu funktsioonist kuhugi edasi?
3. peaksin ma handle-ima seda päringut koheselt AJAXi päringu funkstioonis?
Ikka ja jälle tänud,
Martin
_________________ Vaata pilti |
|
Kommentaarid: 11 loe/lisa |
Kasutajad arvavad: |
|
:: |
0 :: |
0 :: |
11 |
|
tagasi üles |
|
|
-ordi-
HV vaatleja
liitunud: 03.06.2009
|
21.04.2010 18:31:49
|
|
|
Ma ei ole kunagi Javascriptiga kokku puutunud aga ma arvan et peaksid kasutama ülakomasid 'sisu', Pythonis on sama funktsioon ja seal tuleb kasutada ülakomasid.
xml.getElementsByTagName('item')[0];
Vb panin kanti!
|
|
Kommentaarid: 2 loe/lisa |
Kasutajad arvavad: |
|
:: |
0 :: |
0 :: |
2 |
|
tagasi üles |
|
|
nene
Kreisi kasutaja
liitunud: 20.03.2004
|
21.04.2010 22:43:36
|
|
|
Huvitav. Proovisin järgi ja minul töötab küll. Lisan ka koodi, millega katsetasin:
javascript:
|
function httpRequestReturn(url, alko){ // code for IE7+, Firefox, Chrome, Opera, Safari if (window.XMLHttpRequest) { var yhendus = new XMLHttpRequest(); } else { // code for IE6, IE5 try { yhendus = new ActiveXObject("Msxml2.XMLHTTP"); } catch (e) { try { yhendus = new ActiveXObject("Microsoft.XMLHTTP"); } catch (e) {} } } yhendus.overrideMimeType('text/xml'); yhendus.open("GET", url, false); yhendus.send(null); return yhendus.responseXML.documentElement; } function test() { var dom = httpRequestReturn("test.xml"); alert(dom); // peaks ütlema [object Element] vms var myygihind = dom.getElementsByTagName("myygihind")[0].childNodes[0].nodeValue; alert(myygihind); // peaks ütlema 200 var km = dom.getElementsByTagName("km")[0].childNodes[0].nodeValue; alert(km); // peaks ütlema 10 }
|
ning XML:
<?xml version="1.0"?>
<kokku>
<myygihind>200</myygihind>
<km>10</km>
</kokku> |
Lisaks veel paar märkust...
yhendus.open("GET", url, false); // asynkroonne |
Kommentaar on vale - false määrab, et tehakse hoopis sünkroonne päring. Reaalses rakenduses soovitaksin kasutada siiski asünkroonseid päringuid.
function httpRequestReturn(url, alko){ |
Mõningane alkoholijoove?
Lõpetuseks veel ka see, et nagu näha pole XML DOM-i kasutamine mingi lust ja lillepidu. Parem on kasutada mõne teise library abi. Näiteks jQuery. Kui sa aga pole kohustatud oma andmevahetust just XML-is teostama, siis soovitaksin kasutada hoopis JSON-it, millega on palju mugavam ringi käjja kui XML-iga.
@-ordi-: JavaScriptis pole 'ülekomadel' ja "jutumärkidel" pea mingit sisulist vahet.
_________________ Mõistus otsas? Pane pinusse... |
|
Kommentaarid: 24 loe/lisa |
Kasutajad arvavad: |
|
:: |
0 :: |
1 :: |
23 |
|
tagasi üles |
|
|
-ordi-
HV vaatleja
liitunud: 03.06.2009
|
21.04.2010 22:49:40
|
|
|
nene kirjutas: |
Huvitav. Proovisin järgi ja minul töötab küll. Lisan ka koodi, millega katsetasin:
javascript:
|
function httpRequestReturn(url, alko){ // code for IE7+, Firefox, Chrome, Opera, Safari if (window.XMLHttpRequest) { var yhendus = new XMLHttpRequest(); } else { // code for IE6, IE5 try { yhendus = new ActiveXObject("Msxml2.XMLHTTP"); } catch (e) { try { yhendus = new ActiveXObject("Microsoft.XMLHTTP"); } catch (e) {} } } yhendus.overrideMimeType('text/xml'); yhendus.open("GET", url, false); yhendus.send(null); return yhendus.responseXML.documentElement; } function test() { var dom = httpRequestReturn("test.xml"); alert(dom); // peaks ütlema [object Element] vms var myygihind = dom.getElementsByTagName("myygihind")[0].childNodes[0].nodeValue; alert(myygihind); // peaks ütlema 200 var km = dom.getElementsByTagName("km")[0].childNodes[0].nodeValue; alert(km); // peaks ütlema 10 }
|
ning XML:
<?xml version="1.0"?>
<kokku>
<myygihind>200</myygihind>
<km>10</km>
</kokku> |
Lisaks veel paar märkust...
yhendus.open("GET", url, false); // asynkroonne |
Kommentaar on vale - false määrab, et tehakse hoopis sünkroonne päring. Reaalses rakenduses soovitaksin kasutada siiski asünkroonseid päringuid.
function httpRequestReturn(url, alko){ |
Mõningane alkoholijoove?
Lõpetuseks veel ka see, et nagu näha pole XML DOM-i kasutamine mingi lust ja lillepidu. Parem on kasutada mõne teise library abi. Näiteks jQuery. Kui sa aga pole kohustatud oma andmevahetust just XML-is teostama, siis soovitaksin kasutada hoopis JSON-it, millega on palju mugavam ringi käjja kui XML-iga.
@-ordi-: JavaScriptis pole 'ülekomadel' ja "jutumärkidel" pea mingit sisulist vahet. |
Ok targem nüüd, muidu JSON'i asemel võid ka pilgu visata YAML'le, neid mõlemaid on tunduvalt mugavam kasutada kui XML'i.
|
|
Kommentaarid: 2 loe/lisa |
Kasutajad arvavad: |
|
:: |
0 :: |
0 :: |
2 |
|
tagasi üles |
|
|
Naljatilk
HV kasutaja
liitunud: 03.03.2006
|
22.04.2010 15:50:32
|
|
|
nene kirjutas: |
Huvitav. Proovisin järgi ja minul töötab küll. Lisan ka koodi, millega katsetasin:
function httpRequestReturn(url, alko){ |
Mõningane alkoholijoove?
Lõpetuseks veel ka see, et nagu näha pole XML DOM-i kasutamine mingi lust ja lillepidu. Parem on kasutada mõne teise library abi. Näiteks jQuery. Kui sa aga pole kohustatud oma andmevahetust just XML-is teostama, siis soovitaksin kasutada hoopis JSON-it, millega on palju mugavam ringi käjja kui XML-iga.
@-ordi-: JavaScriptis pole 'ülekomadel' ja "jutumärkidel" pea mingit sisulist vahet. |
Tänud! Sain tööle.
Alko asi on see, et kasutasin hxr-i esmalt sõbra kokteili lehe tegemisel ja jäi tobedusest sisse.
JSON-i osas on nii, et ei saanud hetkel eval()-iga eriti hästi hakkama, nädalavahetusel uudistan lähemalt, aga tundub tõepoolest kõvasti mugavam olevat. Ja jQuery peale liigun ka kindlasti varsti, hetkel on see, et üritan Javascriptiga esmalt sinasõbraks saada. Kunagi läheb ikka neid teadmisi vaja ja uute keelte peale on lihtsam liikuda, kui vanad pisut selgemad.
-ordi-, ma olen ise ka juba paar aastat tegelenud PHP-ga ning tean täpselt, kui tobedaid vigu saab valede märkide kasutamisel teha. Seetõttu olen erinevate vigade otsimise käigus juba jutumärkide kasutuse omale kenasti selgeks teinud.
_________________ Vaata pilti |
|
Kommentaarid: 11 loe/lisa |
Kasutajad arvavad: |
|
:: |
0 :: |
0 :: |
11 |
|
tagasi üles |
|
|
|
lisa lemmikuks |
|
|
sa ei või postitada uusi teemasid siia foorumisse sa ei või vastata selle foorumi teemadele sa ei või muuta oma postitusi selles foorumis sa ei või kustutada oma postitusi selles foorumis sa ei või vastata küsitlustele selles foorumis sa ei saa lisada manuseid selles foorumis sa võid manuseid alla laadida selles foorumis
|
|
Hinnavaatlus ei vastuta foorumis tehtud postituste eest.
|