bjnas: Input

Eine Frage an Profis

Habe eine Anwendung erzeugt die läuft unter Firefox + Chrome ohne Fehler. Auf einer anderen Plattform habe ich bemerkt das der IE den Code nicht ausführen kann.

Es geht um folgende Codes :

  
  function titelzellen(tid) {  
	var tableRef = document.getElementById(tid);  
	var rows     = tableRef.rows.length;  
	var newRow   = tableRef.insertRow(rows);  
	var newCell  = newRow.insertCell(0);  
	newCell.setAttribute('colSpan',5);  
	newCell.className ='titel';  
	var newInput = document.createElement('input');  
	newCell.appendChild(newInput);  
	newInput.type ='text';  
	newInput.name ='titel';  
	newInput.value = 'Titel';  
	newInput.select();  
	newInput.focus();  
	var newCell  = newRow.insertCell(1);  
	newCell.className ='pri3';  
	var newInput = document.createElement('input');  
	newCell.appendChild(newInput);  
	newInput.type ='submit';  
	newInput.name = 'newabs';  
	newInput.className = 'ready';  
	newInput.value = '';  
	return false;  
}	

Nach wenig nachforschen habe ich den Fehler endeckt. Die Typenzuweisungen sind nicht zulässig. (Nur auslesen) Obwohl FF & Chrome nicht motzen.

Nun die Frage: Wie erzeugt man den vers. Inputs ( submit,hidden, usw.) für den IE.

Danke im Voraus für eure Hilfe
mfg bjnas

  1. Liebe(r) bjnas,

    Nach wenig nachforschen habe ich den Fehler endeckt. Die Typenzuweisungen sind nicht zulässig. (Nur auslesen) Obwohl FF & Chrome nicht motzen.

    Ähm, das ist anscheinend so nicht ganz der Fall, denn wie sonst sollte man ein entsprechendes <input> Element dynamisch erzeugen? Das mit dem nur-lesen verhält sich offensichtlich etwas komplexer.

    Sobald Du ein <input>-Element in das Dokument eingehängt hast (appendChild), ab dann wäre es fatal, wenn man seinen Typ ändern könnte, denn dann könnte man ja einfach aus einem type="text" ein type="file" machen und dann wunderbare Sicherheitslücken auftun.

    Meine Vermutung ist, dass Du nur dann den Typ verändern kannst, solange Du das Element noch nirgendwo eingehängt hast.

    Deine select() und focus() Methodenaufrufe würde ich für den IE in ein http://de.selfhtml.org/javascript/beispiele/fehlerbehandlung_try_catch.htm#quelltext@title=try{}catch(e){}-Statement verpacken, denn der kann manchmal aus unerfindlichen Gründen keinen Focus setzen.

    Liebe Grüße,

    Felix Riesterer.

    --
    ie:% br:> fl:| va:) ls:[ fo:) rl:° n4:? de:> ss:| ch:? js:) mo:} zu:)
  2. Hi,»

    newInput.name ='titel';

    damit können einige Versionen des ie nicht umgehen, die Microsoft empfehlung lautet, wie folgt zu verfahren:
    document.createElement('<input type="radio" name="' + inp_name + '">');

    siehe auch http://msdn.microsoft.com/de-de/library/ms536389(en-us).aspx

    Gruesse, Joachim

    --
    Am Ende wird alles gut.
    1. Hallo Joachim

      habs mal versucht, nun geht es im IE. Dafür motzen jetzt F und Chrome wegen den falschen Argumente im createElement.

      So wie's aussieht brauche ich eine Broswer Weiche ??

      Schönen Abend

      bjn

      1. Hi,

        habs mal versucht, nun geht es im IE. Dafür motzen jetzt F und Chrome wegen den falschen Argumente im createElement.

        So wie's aussieht brauche ich eine Broswer Weiche ??

        Gut erkannt.

        Microsofts JScript bietet übrigens eine Technik namens conditional compilation an.

        MfG ChrisB

        --
        Light travels faster than sound - that's why most people appear bright until you hear them speak.
      2. Hi,

        So wie's aussieht brauche ich eine Broswer Weiche ??

        ja, entweder so wie ChrisB angeregt hat oder analog zu diesem kleinen Test zum Clonen von Formularelementen, wobei die Abfrage des Navigator-Objectes immer eine Krücke ist, weil diese Eigenschaft von manchen Browsern wie z.B Opera manipulierbar ist.

        Gruesse, Joachim

        --
        Am Ende wird alles gut.
        1. » So wie's aussieht brauche ich eine Broswer Weiche ??
          ja, ...

          nein. Da sein einziges Problem das setzen des type Attribut ist und wie ihm schon zweimal gesagt wurde, liegt das Problem nur daran, dass er dies nach dem Einfügen in das Dokument tut.

          Struppi.

          1. »» » So wie's aussieht brauche ich eine Broswer Weiche ??
            »» ja, ...

            nein. Da sein einziges Problem das setzen des type Attribut ist und wie ihm schon zweimal gesagt wurde, liegt das Problem nur daran, dass er dies nach dem Einfügen in das Dokument tut.

            Struppi.

            Dieser Gedankengang habe ich als erstes ausprobiert. Also das appendChild an den Schluss. Gestern ging's nicht, vielleicht weil ich es nach Select und Focus eingefügt habe obwohl ja noch nicht vorhanden. Jetzt vor Select und Focus funktioniert es.

              
                    var newInput = document.createElement('input');  
            	newInput.type ='text';  
            	newInput.name ='titel';  
            	newInput.value = 'Titel';  
            	newCell.appendChild(newInput);  
            	newInput.select();  
            	newInput.focus();  
            
            

            Danke für Eure Hilfe und Denkanstösse.

            Mfg Bjn

    2. » newInput.name ='titel';
      damit können einige Versionen des ie nicht umgehen, ..

      umgehen können sie schon damit, nur wird das Element nicht in die Elementcollection eingebunden. D.h. man kann nicht über document.formular.elementname darauf zu greifen. Das Element wird aber trotzdem ganz normal beim submit übergeben.

      siehe auch http://msdn.microsoft.com/de-de/library/ms536389(en-us).aspx

      Ein workaround - wenn man unbedingt über elements[..] darauf zugreifen möchte. Ist aber im Prinzip nicht nötig, da die Elementreferenz ja zu Verfügung steht, über 'newInput'.

      Struppi.

      1. Hi,

        umgehen können sie schon damit, nur wird das Element nicht in die Elementcollection eingebunden.

        das Name Attrinut lässt sich im ie6 nicht setzen, daher ist die Übermittlung der Daten mühsam - auch wenn das Element übergeben wird. Insofern sehe ich den Würger durchaus als Alternative.

        Gruesse, Joachim

        --
        Am Ende wird alles gut.
        1. » umgehen können sie schon damit, nur wird das Element nicht in die Elementcollection eingebunden.
          das Name Attrinut lässt sich im ie6 nicht setzen, daher ist die Übermittlung der Daten mühsam - auch wenn das Element übergeben wird.

          Das ist falsch, der Name läßt sich setzen und wird auch übermittelt.

          Struppi.

          1. Hi,

            Das ist falsch, der Name läßt sich setzen und wird auch übermittelt.

            dann klone mal eine Gruppe von radios, gib der geklonten Gruppe via input.name einen neuen Namen, und siehe was passiert: ie6 behandelt die alte Gruppe und die geklonten als _eine_ gemeinsame Gruppe, so dass immer nur ein radio selektiert werden kann. Das das Element übergeben wird habe ich nicht bestritten.

            Gruesse, Joachim

            --
            Am Ende wird alles gut.
            1. » Das ist falsch, der Name läßt sich setzen und wird auch übermittelt.
              dann klone mal eine Gruppe von radios, gib der geklonten Gruppe via input.name einen neuen Namen, und siehe was passiert: ie6 behandelt die alte Gruppe und die geklonten als _eine_ gemeinsame Gruppe, so dass immer nur ein radio selektiert werden kann.

              Interessanter Bug, aber was hat der mit dem von createElement zu tun?

              Struppi.

              1. Hi,

                Interessanter Bug, aber was hat der mit dem von createElement zu tun?

                siehe http://www.wendenburg.de/test/rad.html, auch hier funktionieren die radios im ie6 nur in den unteren beiden Gruppen, wo sie mit dem Hack erzeugt werden. Die beiden oberen, korrekt erzeugten Gruppen sind sie im ie6 nicht klickbar.

                Gruesse, Joachim

                --
                Am Ende wird alles gut.
                1. » Interessanter Bug, aber was hat der mit dem von createElement zu tun?
                  siehe http://www.wendenburg.de/test/rad.html, auch hier funktionieren die radios im ie6 nur in den unteren beiden Gruppen, wo sie mit dem Hack erzeugt werden. Die beiden oberen, korrekt erzeugten Gruppen sind sie im ie6 nicht klickbar.

                  Ja, der Bug liegt an der fehlerhaften implementierung von appendChild, das Element wird mit dem Namen nicht in die Element-collection eingereiht. Für die Funktionalität spielt es aber nur bei Radiogroups eine Rolle. Aber du sprachst von Schwierigkeiten bei der Übermittlung, die gibt es nicht.

                  Und wenn schon, würde ich den workaround so wie ihn Chris vorgeschlagen hat einbauen, das dürfte zuverlässiger sein.

                  Struppi.

  3. Danke allen für die Lösungsvorschläge.
    Werde Sie sofort testen.

    MFG  bjn

  4. Nach wenig nachforschen habe ich den Fehler endeckt. Die Typenzuweisungen sind nicht zulässig.

    Doch ist sie schon. Nur wenn das Element bereits im Dokument vorhanden ist, läßt sich der Typ in manchen Browsern nicht mehr ändern. Wenn du die Reihenfolge änderst funktioniet dein Skript.

    Struppi.