Avatar billede jonashn Nybegynder
26. juni 2005 - 17:05 Der er 36 kommentarer og
3 løsninger

Focus i objekt oprettet efter onload

Hej eksperter!

Jeg har et lille problem med følgende kode:
<body onload="document.getElementById('cntedt').focus();">

<span id="editor">
Password: <span id="containerIn">
<span contenteditable="true" id="cntedt" onkeypress="input(this);"></span>
</span>
</span>
<script type="text/javascript">
var i=0;
var temp=new Array();
function submit(text,obj) { i++;
temp[temp.length]=obj.innerHTMLdocument.getElementById("containerIn").innerHTML=text
document.getElementById("containerIn").innerHTML+="<br>Godkendt.";
document.getElementById("editor").innerHTML+="<br>Password: <span id=\"containerIn\"><span contenteditable=\"true\" id=\"cntedtNr" + i +"\" onkeypress=\"input(this);\">test</span>"
document.getElementById("cntedtNr"+i).focus()
}
function input(obj) {
if(event.keyCode==13) {
submit(obj.innerHTML,obj);return false;
}
else return true;
}
</script>
</body>

Problemet er at den ikke kan focuse på "cntedtNr" + i.

Jeg håber at i kan forstå min lidt rodede kode. Meningen med den er at kunne lave et span og så kunne køre 2 funktioner på det, nemlig write og read.

Udfra det kan men så lave en simpel ’konsol’-simulator.

Arrayet temp er lavet for at kunne gemme det indtastede.

Grunden til at jeg lægger 'test' ind i "cntedtNr" + i spannet er at jeg ellers ikke kan indtaste noget, da musen ikke kan finde contenteditable feltet.

Jeg vil også gerne vide om der er et alternetiv til contenteditable der virker i andet end IE (Hvis jeg har forstået det rigtigt virker den KUN i IE)

Håber at i kan forstå hvad jeg mener!
Avatar billede jonashn Nybegynder
27. juni 2005 - 20:42 #1
Er der ingen der ken hjælpe? :-{
Avatar billede jonashn Nybegynder
27. juni 2005 - 20:42 #2
*kan :)
Avatar billede jonashn Nybegynder
28. juni 2005 - 09:19 #3
Skal bruge et svar snart... Hæver med 40 point
Avatar billede per1291 Nybegynder
28. juni 2005 - 15:36 #4
document.getElementById("editor").innerHTML+="<br>Password: <span id=\"containerIn\"><span contenteditable=\"true\" id=\"cntedtNr" + i +"\" onkeypress=\"input(this);\">test</span>"

Jeg tror du mangler et </span>.

Hilsen  Per
Avatar billede jonashn Nybegynder
28. juni 2005 - 16:42 #5
Det er rigtigt... Men den vil stadig ikke focuse?
Avatar billede roenving Novice
28. juni 2005 - 16:51 #6
Hvorfor benytter du dig ikke af almindelige form-elementer ?-)
Avatar billede olebole Juniormester
28. juni 2005 - 18:35 #7
<ole>

Det undrer nu også mig - men derudover er det nok lidt at tigge om øretæver at have en funktion med navnet 'input'. Personligt forsøger jeg altid at undgå navne og identifiers, der er mindste risiko for, kan blive misforstået af JS  :)

/mvh
</bole>
Avatar billede jonashn Nybegynder
28. juni 2005 - 20:46 #8
ok... Øretæver hermed modtaget :-D

Layoutet skal nærmest være en direkte kopi af command prompt.
Der skal være mulighed for at skrive tekst i spannet, og der skal være mulighed for bruger input.
Avatar billede jonashn Nybegynder
28. juni 2005 - 21:04 #9
Derfor valgte jeg at bruge spans.

Hvis jeg brugte forms ville jeg være nødt til at bruge et textarea, og det ville ikke være optimalt.

Har du ikke en idé til løsning af focusproblemet roenving?
Avatar billede jonashn Nybegynder
28. juni 2005 - 21:04 #10
... og olebole
Avatar billede olebole Juniormester
28. juni 2005 - 21:27 #11
Browser-krav? X-browser, eller?
Avatar billede olebole Juniormester
28. juni 2005 - 21:28 #12
- og hvorfor i øvrigt ikke et textarea? Har du specielle krav - og i så fald, hvilke?
Avatar billede olebole Juniormester
28. juni 2005 - 21:34 #13
PS: Måske, du misforstod min kommentar om 'JS-tæskeholdet'  ;D
Du er ikke i fare for øretæver fra undertegnede ... det er bare min erfaring, at div. browsere er yderst gavmilde med 'dummebøder', når man bruger navne som 'submit' og/eller 'input'  ;o)
Avatar billede olebole Juniormester
28. juni 2005 - 21:42 #14
- et eksempel på noget, der ofte giver anledning til spm. på E er en knap med navnet 'submit', der udløser en JS-fejl, hvis man prøver at submitte formen med JS:

<form id="gnu">
<input type="text">
<input type="submit" name="submit" value="Submit Form">
</form>

<a href="#" onclick="document.getElementById('gnu').submit()">Prøv at submitte formen</a>

Den submitter fint, hvis knappen hedder 'mySubmit' ... prøv det evt. selv, så glemmer du det ikke så let næste gang  ;o)
Avatar billede per1291 Nybegynder
28. juni 2005 - 22:24 #15
Jeg har ikke nogen løsning, men Ole har ret i at din funktion burde hedde mySubmit og ikke submit.

Desuden: Du ændrer et span vha. "innerHTML=" på en sådan måde, at der samtidig foretages en ny id-tilordning. Straks efter refererer du til det nye id, stadig vha. Javascript. Det VIL ifølge min erfaring give problemer. Jeg vil foreslå at du nøjes med at ændre i det inderste span "containerIn" og altså lader "editor" være urørt. Det vil gøre koden mere gennemskuelig og derved en tilretning nemmere.

Hilsen  Per
Avatar billede olebole Juniormester
28. juni 2005 - 22:35 #16
Jeg banker et promt-objekt af ... meget sjovt, lille projekt  :)
Avatar billede roenving Novice
28. juni 2005 - 23:49 #17
*lol*
Avatar billede per1291 Nybegynder
29. juni 2005 - 00:20 #18
Ole skriver:
> Jeg banker et promt-objekt af ... meget sjovt, lille projekt  :)

Hvad snakker du om?

Hilsen  Per
Avatar billede roenving Novice
29. juni 2005 - 00:30 #19
Prøv du i javascript at lave en prompt-klasse, og opret derinde en funktion, som har brug for at hente oplysninger fra brugeren, hvilket man jo normalt vil bruge en prompt til ...

Det giver faktisk en meget sjov løkke ved oprettelse af en instans af objektet, som, hvis du er heldig, i løbet af en 5-7 minutter vil få IE til at reagere og spørge om du virkelig vil tillade den tidsrøver i at fortsætte sit arbejde, så du kan nøjes med at lukke alle IE-instanser ...

-- hvis du er uheldig skal du nok have fat i stik-kontakten !-)
Avatar billede olebole Juniormester
29. juni 2005 - 00:51 #20
ehhhhh ... det er da vist en pudsig konstruktion, du har i tankerne. Jeg er ikke helt med på, hvad du mener, roenving  :)
Avatar billede per1291 Nybegynder
29. juni 2005 - 00:52 #21
roenving skriver:
> Det giver faktisk en meget sjov løkke [..]

Aha. En indforstået joke for de garvede programmører.

Det aktuelle problem tror jeg bunder i, at jonashn definerer et nyt id inde i en innerHTML. Det kan gøres på andre måder. Er der overhovedet brug for alle disse mulige udgaver af "cntedtNr"? I modsat fald kunne man definere de nødvendige udgaver på forhånd, i et array, og lade de fleste være usynlige.

Hilsen  Per
Avatar billede roenving Novice
29. juni 2005 - 00:57 #22
Ja, jeg gad i hvert fald ikke prøve at lægge computeren ned (igen, for jeg kom i sidste måned til ukritisk at lave en ting, som havde samme navn som en af de fødte javascript-funktioner, fordi en bruger efterspurgte noget !-)

-- hvis man bruger ægte DOM-binding er det faktisk ikke noget problem, men så skal man bruge createElement og f.eks. appendChild !o]
Avatar billede olebole Juniormester
29. juni 2005 - 03:08 #23
Hehe ... nu forstår jeg, hvad du mente  ;o)
Ja, jeg skrev et lille promt-objekt, der bruger ECMA-DOM bindings:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
    "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
    <title>TITLE</title>
<style type="text/css">
body, html {
    height: 100%;
    margin: 0px;
    padding: 0px;
    background-color: buttonface;
}
#promtCont {
    position: relative;
    width: 600px;
    height: 500px;
    margin: 40px;
    border: 2px inset threedhighlight;
    overflow-x: hidden;
    overflow-y: scroll;
    overflow: -moz-scrollbars-vertical;
    font-family: courier;
    font-size: 14px;
    font-weight: bold;
    color: #c0c0c0;
    background-color: black;
}
#promtCont textarea {
    height: 300px;
    padding: 0;
    border: 0 none;
    overflow: hidden;
    vertical-align: top;
    font-family: courier;
    font-size: 14px;
    font-weight: bold;
    color: #c0c0c0;
    background-color: transparent;
}
</style>
<script type="text/JavaScript">
/**************************************************
    ************* JsPromtObject **************
    Creates a simulated Command-Promt in DHTML
      (c) Copyright: Ole Clausen - 2005
    ******************************************
    Public Methods:
        promt(txt (String))
       
    Events:
        onrespond(resp (String))
          - Fires when user press Return
          Returns the users response as a string
**************************************************/

function JsPromtObject(id, templ) {
    var uA = navigator.userAgent.toLowerCase();
    this._ie = uA.indexOf("msie")!=-1&&uA.indexOf("opera")==-1;
    this._cont = document.getElementById(id);
    this._templCont = document.getElementById(templ);
    this._lastLine = null;
    this._inp = null;
}
var _p = JsPromtObject.prototype;
_p.promt = function(txt) {
    var tx, me = this;
    this._lastLine = this._templCont.getElementsByTagName("div")[0].cloneNode(true);
    tx = document.createTextNode(txt);
    this._lastLine.firstChild.appendChild(tx);
    this._cont.appendChild(this._lastLine);
    this._inp = this._lastLine.getElementsByTagName("textarea")[0];
    this._inp.style.width = (this._lastLine.offsetWidth - this._inp.parentNode.previousSibling.offsetWidth) + "px";
    this._inp.onkeydown = function(e){me._checkKey(e?e:event)}
    this._inp.focus();
}
_p._checkKey = function(e) {
    if (e.keyCode==13) {
        var val, sp, tx, me=this;
        val = this._inp.value;
        sp = this._inp.parentNode;
        sp.removeChild(this._inp);
        tx = document.createTextNode(val);
        sp.appendChild(tx);
        if (this.onrespond) setTimeout(function(){me.onrespond(val)},10);
    }
}

function actOnDaShit(resp) {
    oPromt.promt("Are you sure, you ment "+resp+"?>");
}

var oPromt = null;
window.onload = function() {
    oPromt = new JsPromtObject("promtCont", "templates");
    oPromt.onrespond = actOnDaShit;
    oPromt.promt("Write something>");
}
</script>
</head>
<body>

<div id="promtCont"></div>

<div id="templates" style="display:none">
    <div><span></span><span><textarea></textarea></span></div>
</div>

</body>
</html>
Avatar billede olebole Juniormester
29. juni 2005 - 03:21 #24
Oooops ... der er lidt overflødige rester i constructor'en. Sådan kan den skrives:

function JsPromtObject(id, templ) {
    this._cont = document.getElementById(id);
    this._templCont = document.getElementById(templ);
    this._lastLine = null;
    this._inp = null;
}
Avatar billede jonashn Nybegynder
29. juni 2005 - 12:13 #25
Olebole >> Lige hvad jeg skulle bruge!

Jeg er desværre ikke nogen hej til JS, så vil du ikke lige forklare det overordnede system i Prompt objektet?
Avatar billede jonashn Nybegynder
29. juni 2005 - 12:20 #26
...Og hvad hvis man vil skrive 3 linier, vente 2000ms og så skrive en linie til og først efter den lave en inputprompt?
Avatar billede olebole Juniormester
29. juni 2005 - 19:48 #27
Du kan prøve denne her, der er skrevet lidt om:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
    "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
    <title>TITLE</title>
<style type="text/css">
body, html {
    height: 100%;
    margin: 0px;
    padding: 0px;
    background-color: buttonface;
}
#promtCont {
    position: relative;
    width: 600px;
    height: 500px;
    margin: 40px;
    border: 2px inset threedhighlight;
    overflow-x: hidden;
    overflow-y: scroll;
    overflow: -moz-scrollbars-vertical;
    font-family: courier;
    font-size: 14px;
    font-weight: bold;
    color: #c0c0c0;
    background-color: black;
}
#promtCont .spacer {
    height: 12px;
}
#promtCont textarea {
    padding: 0;
    border: 0 none;
    overflow: hidden;
    vertical-align: top;
    font-family: courier;
    font-size: 14px;
    font-weight: bold;
    color: #c0c0c0;
    background-color: transparent;
}
</style>
<script type="text/JavaScript">
/**************************************************
    ************* JsPromtObject **************
    Creates a simulated Command-Promt in DHTML
      (c) Copyright: Ole Clausen - 2005
    ******************************************
    Public Methods:
        promt(txt (String))
          - Promts the user.
         
        answerResponse(txt (String))
          - Writes an answer to user.
            Typically called from a callback-function
            when the onrespond-event is fired
    Events:
        onrespond(resp (String))
          - Fires when user press Return.
          Returns the users response as a string.
**************************************************/

function JsPromtObject(id, templ) {
    this._cont = document.getElementById(id);
    this._templCont = document.getElementById(templ);
    this._lastLine = null;
    this._inp = null;
}
var _p = JsPromtObject.prototype;
_p.promt = function(txt) {
    var tx, me = this;
    this._lastLine = this._templCont.getElementsByTagName("div")[0].cloneNode(true);
    tx = document.createTextNode(txt);
    this._lastLine.firstChild.appendChild(tx);
    this._cont.appendChild(this._lastLine);
    this._inp = this._lastLine.getElementsByTagName("textarea")[0];
    this._inp.style.width = (this._lastLine.offsetWidth - this._inp.parentNode.previousSibling.offsetWidth) + "px";
    this._inp.onkeydown = function(e){me._checkKey(e?e:event)};
    this._inp.onkeyup = function(e){me._checkHeight()};
    this._inp.focus();
}
_p.answerResponse = function(txt) {
    var tx, dv = document.createElement("div");
    dv.className = "answer";
    tx = document.createTextNode(txt);
    dv.appendChild(tx);
    this._cont.appendChild(dv);
}
_p.spacer = function() {
    var tx, dv = document.createElement("div");
    dv.className = "spacer";
    tx = document.createTextNode("\40");
    dv.appendChild(tx);
    this._cont.appendChild(dv);
}
_p._checkKey = function(e) {
    if (e.keyCode==13) {
        var val, sp, tx, me=this;
        val = this._inp.value;
        sp = this._inp.parentNode;
        sp.removeChild(this._inp);
        tx = document.createTextNode(val);
        sp.appendChild(tx);
        if (this.onrespond) setTimeout(function(){me.onrespond(val)},10);
    }
    if (this._inp.scrollHeight>parseInt(this._inp.style.height)) this._inp.style.height = this._inp.scrollHeight + 40 + "px";
}
_p._checkHeight = function() {
    if (this._inp.scrollHeight>parseInt(this._inp.style.height)) this._inp.style.height = this._inp.scrollHeight + 40 + "px";
} // JsPromtObject - END

/*  Callback functions - START  */
function actOnDaShit(resp) {
    oPromt.answerResponse("You response '"+resp+"' was valid");
    oPromt.answerResponse("Linie 2");
    oPromt.answerResponse("Linie 3");
   
    setTimeout("finishDaShit('"+resp+"')", 2000);
}
function finishDaShit(resp) {
    oPromt.answerResponse("Linie 4 om "+resp);
    oPromt.spacer();
   
    oPromt.promt("Write something else>");
}
/*  Callback functions - END  */

var oPromt = null;
window.onload = function() {
    oPromt = new JsPromtObject("promtCont", "templates");
    oPromt.onrespond = actOnDaShit;
    oPromt.promt("Write something>");
}
</script>
</head>
<body>

<div id="promtCont"></div>

<div id="templates" style="display:none">
    <div><span></span><span><textarea style="height:60px"></textarea></span></div>
</div>

</body>
</html>

Jeg er klar over, det ikke virker i Opera - men den er zq for syg til, jeg gider at rode med den lige nu  :)
Avatar billede olebole Juniormester
29. juni 2005 - 19:53 #28
- og du kan naturligvis indsætte en spacer, hvor du vil ... f.eks. før den fjerde linie. Den har jeg i øvrigt glemt under 'Public Methods' i dokumentationen ... tjaahhh  :)
Avatar billede jonashn Nybegynder
30. juni 2005 - 17:50 #29
Skønt... Nu er det perfekt! Læg et svar alle tre, per1291 og roenving har trods alt brugt tid på mit spørgsmål, så de får 10 point hver.
Avatar billede olebole Juniormester
30. juni 2005 - 18:24 #30
- helt fair  :)
Avatar billede per1291 Nybegynder
30. juni 2005 - 23:33 #31
Pænt af dig.
Avatar billede roenving Novice
01. juli 2005 - 10:32 #32
Jamen, så velbekomme '-)
Avatar billede jonashn Nybegynder
01. juli 2005 - 13:55 #33
Værsko :)
Olebole>>Jeg har oprettet http://www.eksperten.dk/spm/629785 med 40 point til dig så det passer.
Avatar billede roenving Novice
02. juli 2005 - 11:19 #34
Tak for point ;~}
Avatar billede jonashn Nybegynder
10. juli 2005 - 10:59 #35
Sikke en smiley ;~O
Avatar billede jonashn Nybegynder
10. juli 2005 - 11:00 #36
Øv... den blev ikke så pæn :-)
Avatar billede jonashn Nybegynder
10. juli 2005 - 11:15 #37
Olebole>>er det muligt at gøre sådan at actOnDaShit ikke køres hver gang input er modtaget, men at man f.eks kan skrive (i actOnDaShit)
inputText=oPrompt.prompt("indtast etellerandet");
oPrompt.write("du skrev " + inputText)
altså lidt ligesom window.prompt()??
Avatar billede jonashn Nybegynder
12. juli 2005 - 20:42 #38
glem det... Jeg fandt en bedre måde at løse problemet på. Tusind tak for hjælpen allesammen!!!
Avatar billede olebole Juniormester
12. juli 2005 - 21:44 #39
- hov ... der er da vist en del kommentarer, jeg ikke har set her. Tak, for points  :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester