David Hörpel: Problem mit Array

Hallo!

In einem CMS soll mittels eines Arrays der inhalt dynamisch nachgeladen werden, wenn er gebraucht wird. Die Werte dazu werden aus einer Mysql- Datenbank ausgelese. Hier mal ein Beispiel:

<script language="JavaScript1.2">
  linkset['cat_69']='<table border="0" cellspacing="1" cellpadding="0">'
  linkset['cat_69']+='  <tr>'
  linkset['cat_69']+='    <td colspan="2" id="title-cat"><span>Id: 69</span>Ordner: Leistungskurs-Englisch</td>'
  linkset['cat_69']+='  </tr>'
  linkset['cat_69']+='  <tr>'
  linkset['cat_69']+='    <td id="navi">'
</script>

Das Problem ist jetzt, das, dass er immer sagt "linkset" sei undefiniert, wobei, wenn man var linkset = new array() hinschreibt,es auch nicht funktioniert...
Ok, ich weiß das da type="text/javascript" fehlt, aber daran kanne s nun irklich nicht liegen... ;-)
Hat einer von euch noch eine Idee, wie man den Browsern diesen Array als definierbar vermitteln kann? ;)

Gruß David!

  1. Hallo!

    Ich habe mich leider gerade etwas mißverständlich ausgedrückt:

    Wenn ich linkset = new array() am Anfang definiere, kommt der Fehler zwar nicht mehr, aber er übergibt einfach keinen Inhalt, also einen leeren Array. Es funktioniert jedenfalsl auch nicht ;-)

    Gruß David!

  2. Hallo,

    In einem CMS soll mittels eines Arrays der inhalt dynamisch nachgeladen werden, wenn er gebraucht wird. Die Werte dazu werden aus einer Mysql- Datenbank ausgelese.

    Diesen Teil deiner Anwendung kannst du ja mal posten.

    Gruß,
    MW

    1. Hallo!

      In diesem Teil wird das Script erzeugt:

      <!-- BEGIN TREE -->{EMPTY_ROW}<!-- BEGIN CLOSETREE --><div id="tree_{IDCAT}" style="display:block;"></div><!-- END CLOSETREE --> <p class="cat{CAT_STATUS}" onMouseOver="this.className='cathover{CAT_STATUS}';" onMouseOut="this.className='cat{CAT_STATUS}';">&nbsp;{BUTTON_PUBLISH}{CAT_ACTIONS} &nbsp;<label>{SPACES_BEFORE}<a href="{CAT_EXPAND_URL}" onMouseOver="on('{CAT_EXPAND_ALT}');" onMouseOut="off();"><img src="tpl/standard/img/but_expand{CAT_EXPAND_STATUS}.gif" width="9" height="9" alt="{CAT_EXPAND_ALT}" title="{CAT_EXPAND_ALT}" id="expand_{IDCAT}" /></a> <script language="JavaScript1.2">   linkset['cat_{IDCAT}']='<table border="0" cellspacing="1" cellpadding="0">'   linkset['cat_{IDCAT}']+='  <tr>'   linkset['cat_{IDCAT}']+='    <td colspan="2" id="title-cat"><span>Id: {IDCAT}</span>{LANG_FOLDER}: {ADDSLASHES_CAT_NAME}</td>'   linkset['cat_{IDCAT}']+='  </tr>'   linkset['cat_{IDCAT}']+='  <tr>'   linkset['cat_{IDCAT}']+='    <td id="navi">' <!-- BEGIN CAT_CONFIG -->   linkset['cat_{IDCAT}']+='    <p class="menurow" onclick="document.location.href='{CAT_CONFIG_URL}'" onMouseOver="on('{CAT_CONFIG_ALT}');" onMouseOut="off();"><img src="tpl/standard/img/but_config.gif" width="10" height="10" />&nbsp;{CAT_CONFIG_ALT}</p>' <!-- END CAT_CONFIG --> <!-- BEGIN CAT_LOCK -->   linkset['cat_{IDCAT}']+='    <p class="menurow" onclick="document.getElementById('recharge').src='{CAT_LOCK_URL}'" onMouseOver="on('{CAT_LOCK_ALT}');" onMouseOut="off();"><img src="tpl/standard/img/but_lock{CAT_LOCK_STATUS}.gif" width="10" height="10" />&nbsp;{CAT_LOCK_ALT}</p>' <!-- END CAT_LOCK --> <!-- BEGIN CAT_DELETE -->   linkset['cat_{IDCAT}']+='    <p class="menurow" onclick="return delete_confirm();document.location.href='{CAT_LOCK_URL}'" onMouseOver="on('{CAT_DELETE_ALT}');" onMouseOut="off();"><img src="tpl/standard/img/but_delete.gif" width="10" height="10" />&nbsp;{CAT_DELETE_ALT}</p>' <!-- END CAT_DELETE -->   linkset['cat_{IDCAT}']+='    <div class="sub">' <!-- BEGIN CAT_NEWCAT -->   linkset['cat_{IDCAT}']+='      <p class="menurow" onclick="document.location.href='{CAT_NEWCAT_URL}'" onMouseOver="on('{CAT_NEWCAT_ALT}');" onMouseOut="off();"><img src="tpl/standard/img/but_newfolder.gif" width="10" height="10" />&nbsp;{CAT_NEWCAT_ALT}</p>' <!-- END CAT_NEWCAT --> <!-- BEGIN CAT_NEWSIDE -->   linkset['cat_{IDCAT}']+='      <p class="menurow" onclick="document.location.href='{CAT_NEWSIDE_URL}'" onMouseOver="on('{CAT_NEWSIDE_ALT}');" onMouseOut="off();"><img src="tpl/standard/img/but_newpage.gif" width="10" height="10" />&nbsp;{CAT_NEWSIDE_ALT}</p>' <!-- END CAT_NEWSIDE -->   linkset['cat_{IDCAT}']+='    </div>'   linkset['cat_{IDCAT}']+='    <div class="sub">'   linkset['cat_{IDCAT}']+='      <p class="menurow" onclick="window.open('{CAT_PREVIEW_URL}', '{CAT_PREVIEW_ALT}')" onMouseOver="on('{CAT_PREVIEW_ALT}');" onMouseOut="off();"><img src="tpl/standard/img/but_preview.gif" width="10" height="10" />&nbsp;{CAT_PREVIEW_ALT}</p>'   linkset['cat_{IDCAT}']+='    </div>'   linkset['cat_{IDCAT}']+='    <p class="subtitle-cat">verschieben</p>'   linkset['cat_{IDCAT}']+='    <p class="menurow" onclick="window.open('{CAT_PREVIEW_URL}', '{CAT_PREVIEW_ALT}')" onMouseOver="on('{CAT_PREVIEW_ALT}');" onMouseOut="off();"><img src="tpl/standard/img/but_movefolder.gif" width="10" height="10" />&nbsp;in anderen Ordner</p>'   linkset['cat_{IDCAT}']+='    <div class="sort">'   linkset['cat_{IDCAT}']+='      <p class="menurow" align="center" width="25%" onclick="window.open('{CAT_PREVIEW_URL}', '{CAT_PREVIEW_ALT}')" onMouseOver="on('{CAT_PREVIEW_ALT}');" onMouseOut="off();"><img src="tpl/standard/img/but_movetop.gif" width="12" height="12" /></p>'   linkset['cat_{IDCAT}']+='      <p class="menurow" align="center" width="25%" onclick="window.open('{CAT_PREVIEW_URL}', '{CAT_PREVIEW_ALT}')" onMouseOver="on('{CAT_PREVIEW_ALT}');" onMouseOut="off();"><img src="tpl/standard/img/but_moveup.gif" width="12" height="12" /></p>'   linkset['cat_{IDCAT}']+='      <p class="menurow" align="center" width="25%" onclick="window.open('{CAT_PREVIEW_URL}', '{CAT_PREVIEW_ALT}')" onMouseOver="on('{CAT_PREVIEW_ALT}');" onMouseOut="off();"><img src="tpl/standard/img/but_movedown.gif" width="12" height="12" /></p>'   linkset['cat_{IDCAT}']+='      <p class="menurow" align="center" width="25%" onclick="window.open('{CAT_PREVIEW_URL}', '{CAT_PREVIEW_ALT}')" onMouseOver="on('{CAT_PREVIEW_ALT}');" onMouseOut="off();"><img src="tpl/standard/img/but_movebottom.gif" width="12" height="12" /></p>'   linkset['cat_{IDCAT}']+='    </div></td>'   linkset['cat_{IDCAT}']+='    <td id="info"><span class="title">{LANG_CREATED}:</span> {CAT_CREATED}<br /><span class="title">{LANG_LASTMODIFIED}:</span> {CAT_LASTMODIFIED}<br /><span class="title">{LANG_TEMPLATE}:</span><span class="cat-template{CAT_TEMPLATE_STATUS}"> {ADDSLASHES_CAT_TEMPLATE}</span><br /><span class="title">{LANG_AUTHOR}:</span><span class="author{CAT_AUTHOR_STATUS}"> {ADDSLASHES_CAT_AUTHOR}</span>' <!-- BEGIN CAT_DESCRIPTION -->   linkset['cat_{IDCAT}']+='    <br /><span class="title">{LANG_DESCRIPTION}:</span><br />{ADDSLASHES_CAT_DESCRIPTION}' <!-- END CAT_DESCRIPTION -->   linkset['cat_{IDCAT}']+='    </td>'   linkset['cat_{IDCAT}']+='  </tr>'   linkset['cat_{IDCAT}']+='</table>' </script>

      Augferufen wird das Script hier:

      <html> <head> <script src="tpl/standard/js/standard.js" type="text/javascript"></script> </head> <body onload="recharge({ID});"> {RECHARGE} </body> </html>

      Zur Informtion: Diese Datei hier erzeugt die Layer, in denen dann die dynamischen Links stehen sollen:

      <!-- var regExpPict = /.(gif|jpeg|jpg|png)$/i

      var messages        = new Array();

      function con_layer(task) {  for (j=1; j<=max_subs; j++) con_hide(eval('"' + "menu_layer" + j +'"'));  con_show(eval('"' + "menu_layer" + task +'"')); }

      function con_hide(layer) {  if (document.layers) document.layers[''+layer].visibility = 'hide';  if (document.all) document.all[''+layer].style.visibility = 'hidden';  if (!document.all && document.getElementById) {           task = document.getElementById(''+layer);   task.style.visibility = 'hidden';  } }

      function con_show(layer) {  if (document.layers) document.layers[''+layer].visibility = 'show';  if (document.all) document.all[''+layer].style.visibility = 'visible';  if (!document.all && document.getElementById) {           task = document.getElementById(''+layer);   task.style.visibility = 'visible';          } }

      function on(message) {  window.status = message;  window.defaultStatus = window.status; return true; }

      function on_func(message_id) {  if (messages.length > message_id) {   window.status = messages[message_id];   window.defaultStatus = window.status;  } return true; }

      function on_func_add_message(message_id, message_text) {  if (!messages[message_id]) {   messages[message_id] = message_text;  } }

      function off() {  window.status = "der-dirigent";  window.defaultStatus = window.status; }

      function imgon(img,src) {  document[img].src = 'images/menu_'+img+src+'.gif'; }

      function new_window(theURL,winName,features,myWidth,myHeight,isCenter) {  if (window.screen) if (isCenter) if (isCenter=="true") {   var myLeft = (screen.width-myWidth)/2;   var myTop = (screen.height-myHeight)/2;   features+=(features!='')?',':'';   features+=',left='+myLeft+',top='+myTop;  }  window.open(theURL,winName,features+((features!='')?',':'')+'width='+myWidth+',height='+myHeight); }

      function con_window(theURL,name,myWidth,myHeight,path) {  con_popup(theURL,'', myWidth, myHeight, name, name, '#000000', '#5A7BAD', '#5A7BAD', '#A8BADE', 'Verdana, Arial, Helvetica', '1', '#000000', path); }

      function new_imagepopup(theURL,winName,altName,features,myWidth,myHeight,isCenter) {  if (regExpPict.test(theURL)) {   // Bildformate   if(window.screen)if(isCenter)if(isCenter=="true") {           var myLeft = (screen.width-myWidth)/2;    var myTop = (screen.height-myHeight)/2;    features+=(features!='')?',':'';    features+=',left='+myLeft+',top='+myTop;         }   imagepopup = window.open('','',features+((features!='')?',':'')+'width='+myWidth+',height='+myHeight);   with (imagepopup.document) {          open();    write('<title>'+winName+'</title>');    write('<meta http-equiv="imagetoolbar" content="no">');    write('<body leftmargin="0" topmargin="0" marginwidth="0" marginheight="0" scroll="no">')    write('<a href="javascript:self.close()">');    write('<img src="'+theURL+'" border="0" alt="'+altName+'" title="'+altName+'">')    close();      }  } else {   // andere Dateiformate   new_window(theURL,name,features,myWidth,myHeight,false);  } }

      function previewPict(adresse, breite, hoehe, created, modified, redakteur, thumbnail, filename) {  previewPict2(adresse, breite, hoehe, created, modified, redakteur, thumbnail, filename, "") }

      function previewPict2(adresse, breite, hoehe, created, modified, redakteur, thumbnail, filename, sizeinfo) {  text = "";  titel = pp_title;  if (adresse != "") {   if (regExpPict.test(filename)) {    text += "<img src="" + adresse + "" border="0"";    text += (breite != "") ? " width="" + breite + """: "";    text += (hoehe  != "") ? " height="" + hoehe + """: "";    text += "><br>";    titel = (thumbnail) ? pp_header_bild: pp_header_datei;   }  }  text += (created   != "") ? pp_created  + created   + "<br>": "";  text += (modified  != "") ? pp_modified + modified  + "<br>": "";  text += (redakteur != "") ? pp_author   + redakteur + "<br>": "";  text += (sizeinfo  != "") ? pp_size     + sizeinfo          : "";

      overlib(text, titel, '', 'sideinfo'); }

      function confirm_to_url(msg,url,to) {   var confirm_to = false;   var string_url = '';   if(confirm(msg)) confirm_to = true;   string_url = url+'&'+to+'='+confirm_to;   window.location.href = string_url;   return !confirm_to; }

      function recharge(id) {  parent.document.getElementById('tree_'+id).innerHTML = document.body.innerHTML; }

      function load(id) {  thisTree = document.getElementById('tree_'+id);  if (thisTree) {   if (thisTree.style.display == 'none') {    document.getElementById('recharge').src = "main.php?area=con&action=expand&idcat="+id+"&expanded=0";    document.getElementById('expand_'+id).src = 'tpl/standard/img/but_expand0.gif';    thisTree.style.display = 'block';   } else {    document.getElementById('recharge').src = "main.php?area=con&action=expand&idcat="+id+"&expanded=1";    document.getElementById('expand_'+id).src = 'tpl/standard/img/but_expand1.gif';    thisTree.style.display = 'none';   }          } } //-->

      Alles,w as jetzt in den geschweiften Klammern steht, wird von der DB vorgegeben...

      1. In diesem Teil wird das Script erzeugt:

        Was mir auffällt, in dem Skript wird nichts mit dem von dir erzeugten Object geatn, oder hab ich was übersehen? Wäre aber auch kein Wunder bei sowviel Code.

        und dann dies hier (was ncihts mit deinem Problem zu tun hat):
        var messages        = new Array();

        function con_layer(task) {
         for (j=1; j<=max_subs; j++) con_hide(eval('"' + "menu_layer" + j +'"'));
         con_show(eval('"' + "menu_layer" + task +'"'));

        hier ist eval absolut unnötig und du solltest es wegmachen, denn es macht dein Programm langsamer und fals hier ein Fehler ist findest du ihn nur schwer, da du nicht mehr an eine vernünftige Fehlermeldung kommst, zudem birgt das die Gefahr das sowieso was anderes passiert als du erwartest.

        Wenn ich das richtig verknüpst du nur einen string, also:
        con_show('menu_layer' + task);

        sollte absolut ausreichen.

        }

        function con_hide(layer) {
         if (document.layers) document.layers[''+layer].visibility = 'hide';
         if (document.all) document.all[''+layer].style.visibility = 'hidden';
         if (!document.all && document.getElementById) {
                  task = document.getElementById(''+layer);

        hier sind die String Verknüpfungen unnötig.

        if (document.layers) document.layers[layer].visibility = 'hide';
         else if (document.all) document.all[layer].style.visibility = 'hidden';
         else if (document.getElementById)  document.getElementById(layer).style.visibility = 'hidden'

        Struppi.

        1. Hallo,

          ich fasse das jetzt nochmal zusammen, denn es geht immer noch nicht :-/ ich habe eine datei die erzeugt mir diesen content:

          &nbsp;<a href="javascript:void(0)" onMouseOver="showmenu(event,linkset['cat_53']);off();" onMouseOut="delayhidemenu();"><img src="tpl/standard/img/but_folderinfo1.gif" width="15" height="12" /></a>
          <script language="JavaScript1.2">
            linkset['cat_53']='Testinhalt """''''
          </script>
          &nbsp;Empfang</label></p><div id="tree_53" style="display:none;">Laden...</div>
          <iframe src="tpl/standard/empty.html" name="recharge" id="recharge"></iframe>

          beim drüberfahren wird mir durch diese function der inhalt in einem layer angezeigt:
          function showmenu() {
           if (!blnPopup) return;
           // get arguments
           objEvent    = (arguments.length >= 1) ? arguments[0]: event;
           varMenu     = (arguments.length >= 2) ? arguments[1]: null;
           strMenuName = (arguments.length >= 3) ? ((arguments[2].length > 0) ? arguments[2]: "popmenu"): "popmenu";
           intMenuType = (arguments.length >= 4) ? arguments[3]: 0;
           // check requirements
           // hide old menu and set global vars menuobj and menuobj.thestyle
           clearhidemenu();
           objPopup.callByClick = (objEvent.type.toLowerCase() == "click")
           if (objPopup.callByClick && objPopup.visible) {
            objPopup.hide()
           } else {
            objPopup.name = strMenuName
            objPopup.createMenuObject();
            // create menutext from parameter
            // if parameter is instanceof Array then create new menutext
            // else if parameter is a string, then take it for the menu
            if (varMenu.sort) objPopup.createMenu(varMenu, (intMenuType == 1));
            else objPopup.stroutput = varMenu;
               // if ns4 create a layer-tag
               if (ns4) objPopup.createNS4Layer();
            // write menu into html
            objPopup.writeHTML()
            // get size and menu position
            objPopup.adjustPosition(objEvent)
            // show menu
            objPopup.show()
           }
           return false;
          }
          das funktioniert auch :-) jetzt habe ich davor allerdings einen anderen link der mir genau den gleichen inhalt nur nicht mit id53 sondern z.b. 54 in das iframe läd. der inhalt des iframes sieht dann so aus:

          <html>
          <head>
            <script src="tpl/standard/js/standard.js" type="text/javascript"></script>
          </head>
          <body onload="recharge(54);">
          &nbsp;<a href="javascript:void(0)" onMouseOver="showmenu(event,linkset['cat_54']);off();" onMouseOut="delayhidemenu();"><img src="tpl/standard/img/but_folderinfo1.gif" width="15" height="12" /></a>
          <script language="JavaScript1.2">
            linkset['cat_54']='Testinhalt """''''
          </script>
          &nbsp;Empfang</label></p>
          </body>
          </html>

          hier wird die funktion recharge aufgerufen, die so aussieht:

          function recharge(id) {
           parent.document.getElementById('tree_'+id).innerHTML = document.body.innerHTML;
          }

          nun wird also in diesem div der nächste content angezeigt nur hier erkennt er den array nicht, obwohl er genau so aufgerufen wird wie die anderen. der 1. fehler ist linkset ist undefiniert, meine lösung war darauf vor linkset var linkset = new Array(); zu schreiben. nun kommt dieser fehler nicht mehr, allerdings ist trotzdem linkset leer. wenn ich in der funktion showmenu mir mit alert varMenu ausgeben lasse steht da undefiniert. wenn ich bei der übergabe nicht versuche den array zu übergeben sondern direkt den inhalt des arrays kommt was an. das problem ist aber das der inhalt des arrays " und ' enthält. " kann ich einfach nicht verwenden. außerdem stehen noch links und vieles mehr da drinnen. also ist meine aktuelle idee das irgendwie zu verschlüsseln. da ich aber eine variable mit content nicht verschlüsseln kann, die wäre genau so leer hab ich mir überlegt den content per php zu verschlüsseln direkt in den link einzutragen und dann per js wieder zu entschlüsseln, das ist mir bis jetzt aber noch nicht gelungen, da ich keine variante gefunden habe die ich mit php ver und mit js entschlüsseln kann. die andere idee ist den array im frame anzusprechen da ich vermute das er da ansprechbar ist. wenn mir nun jemand helfen kann wäre ich demjenigen riesen dankbar! ich kann mit demjenigen auch gerne telefonisch das ganze näher erleutern.

          gruß, paul

  3. <script language="JavaScript1.2">
      linkset['cat_69']='<table border="0" cellspacing="1" cellpadding="0">'
      linkset['cat_69']+='  <tr>'
      linkset['cat_69']+='    <td colspan="2" id="title-cat"><span>Id: 69</span>Ordner: Leistungskurs-Englisch</td>'
      linkset['cat_69']+='  </tr>'
      linkset['cat_69']+='  <tr>'
      linkset['cat_69']+='    <td id="navi">'
    </script>

    Da ist kein Array. Du weist der Objekt Eigenschaft 'cat_69' einen string zu.

    var linkset = new Object();
    linkset['cat_69'] ='<table border="0" cellspacing="1" cellpadding="0">'

    • '  <tr>'
    • '    <td colspan="2" id="title-cat"><span>Id: 69</span>Ordner: Leistungskurs-Englisch</td>'
    • '  </tr>'
    • '  <tr>'
    • '    <td id="navi">'

    ist weniger zu tippen.

    deine nachfolgenden Fehler liegen aber nicht an diesem Teil des Skriptes.

    Ok, ich weiß das da type="text/javascript" fehlt, aber daran kanne s nun irklich nicht liegen... ;-)

    Stimmt.

    Struppi.

  4. Hallo,

    Das Problem ist jetzt, das, dass er immer sagt "linkset" sei undefiniert, wobei, wenn man var linkset = new array() hinschreibt,es auch nicht funktioniert...

    Es funktioniert doch, natuerlich mit new Array() statt new array():

    var linkset=new Array();

    linkset['cat_69']='<table border="0" cellspacing="1" cellpadding="0">'
      linkset['cat_69']+='  <tr>'
      linkset['cat_69']+='    <td colspan="2" id="title-cat"><span>Id: 69</span>Ordner: Leistungskurs-Englisch</td>'
      linkset['cat_69']+='  </tr>'
      linkset['cat_69']+='  <tr>'
      linkset['cat_69']+='    <td id="navi">'

    alert(linkset['cat_69']);

    MfG, Thomas

    1. Es funktioniert doch, natuerlich mit new Array() statt new array():

      wobei es aber kein Array ist (zumindest in dem vorgestellten Code).
      Es ist ein Objekt mit der Eigenschaft 'cat_69'.

      var linkset=new Object();

      linkset['cat_69']='<table border="0" cellspacing="1" cellpadding="0">'
        linkset['cat_69']+='  <tr>'
        linkset['cat_69']+='    <td colspan="2" id="title-cat"><span>Id: 69</span>Ordner: Leistungskurs-Englisch</td>'
        linkset['cat_69']+='  </tr>'
        linkset['cat_69']+='  <tr>'
        linkset['cat_69']+='    <td id="navi">'

      alert(linkset['cat_69']);

      Struppi.

      1. Hallo Struppi,

        wo ist der Unterschied, zwischen einem assoziativem Array und einem Objekt; bzw. was mach dies zu einem Objekt?

        Gruß aus Berlin!
        eddi

        1. gruss eddi,

          wo ist der Unterschied, zwischen einem assoziativem Array und
          einem Objekt;

          den unterschied machen die jeweiligen kontruktoren -
             "Array" zum einen sowie "Object" zum anderen;

          bzw. was mach dies zu einem Objekt?

          <spitzfindisch>
               _in_javascript_ist_schlussendlich_alles_objekt_
             </spitzfindisch>

          wie Thomas Meinike schon ausfuehrte:

          [pref:t=85970&m=507426]

          Es ist ein assoziatives Array, welches implizit in ein Objekt
          konvertiert wird und eben auch wie ein Objekt angesprochen
          werden kann. Spezielle Array-Eigenschaften und -Methoden
          stehen aber nicht zur Verfuegung.

          Umgekehrt lassen sich bekanntlich Objekte wie assoziative
          Arrays behandeln, also object.property korrespondiert mit
          object["property"].

          MfG, Thomas

          es liegt also am programmierer, fuer welchen konstruktor
             er sich entscheidet, wobei ich behaupten moechte, dass
             in den meisten faellen gedankenlos gehandelt wurde, wo
             es zur anwendung von sogenannten "assoziativen arrays"
             gekommen ist - warum:

          moechte ich indizierte daten in einer struktur speichern,
             dann entscheide ich mich fuer ein array, denn hier stehen
             mir sowohl die eigenschaft "length" als auch alle moeglichen
             methoden zum manipulieren dieser struktur zur verfuegung;

          bin ich jedoch gezwungen, daten ueber schluesselwoerter
             abzulegen/abzufragen, dann genuegt mir hingegen voellig
             der "Object"-konstruktor, denn obwohl ich auch ein array
             um die vielzitierten "assoziativen" eigenschaften erweitern
             kann, erschliessen sich mir diese daten weder ueber die
             veraenderte length-eigenschaft bzw. einen index, noch werden
             sie von einer der array-methoden erfasst;

          collections sind die einzigen konstrukte, die auch keyvalues
             indizieren - leider sind sie nicht bestandteil des javascript-
             kerns sondern nur moderner DOMs und auch dort wieder hoechst
             unterschiedlich implementiert;

          zu "assoziativen arrays" habe ich mich auch schon mal polemischer
             ausgelassen: http://forum.de.selfhtml.org/archiv/2004/7/84257/#m493695

          by(t)e by(t)e - peterS. - pseliger@gmx.net

          --
          sh:| fo:) ch:? rl:| br:& n3:} n4:# ie:| mo:{ va:| de:[ zu:] fl:) ss:) ls:& js:)
          1. Hallo Peter,

            [...]
            +
            http://forum.de.selfhtml.org/archiv/2004/7/84257/#m493695

            vielen Dank für so viel neues Wissen :)

            Gruß aus Berlin!
            eddi

      2. Ok, dann wird halt der string nicht vom Iframe übergeben...
        Was kann man da machen?

        David

        1. Hallo,

          Ok, dann wird halt der string nicht vom Iframe übergeben...
          Was kann man da machen?

          Auf parent.frames["iframename"].variable oder parent.frames["iframename"].funktion() zugreifen.

          MfG, Thomas

      3. Hallo,

        Es funktioniert doch, natuerlich mit new Array() statt new array():

        wobei es aber kein Array ist (zumindest in dem vorgestellten Code).
        Es ist ein Objekt mit der Eigenschaft 'cat_69'.

        Es ist ein assoziatives Array, welches implizit in ein Objekt konvertiert wird und eben auch wie ein Objekt angesprochen werden kann. Spezielle Array-Eigenschaften und -Methoden stehen aber nicht zur Verfuegung.

        Umgekehrt lassen sich bekanntlich Objekte wie assoziative Arrays behandeln, also object.property korrespondiert mit object["property"].

        MfG, Thomas

        1. Hallo Thomas Meinike

          Hallo,

          Es funktioniert doch, natuerlich mit new Array() statt new array():

          wobei es aber kein Array ist (zumindest in dem vorgestellten Code).
          Es ist ein Objekt mit der Eigenschaft 'cat_69'.

          Es ist ein assoziatives Array, welches implizit in ein Objekt konvertiert wird und eben auch wie ein Objekt angesprochen werden kann. Spezielle Array-Eigenschaften und -Methoden stehen aber nicht zur Verfuegung.

          Es ist kein assoziatives Array, die gibt es in JS nicht.
          Es ist ein Object, deshalb...

          Umgekehrt lassen sich bekanntlich Objekte wie assoziative Arrays behandeln, also object.property korrespondiert mit object["property"].

          Genau.
          Daher wird genau umgekehrt ein Schuh draus.

          Man kann Objekte wie assoziative Arrays verwenden. Da assoziative Arrays nicht die Punktschreibweise kennen und man auch keine Funktionen als Eigenschaft hinzufügen kann.

          Struppi.

          1. Hallo Struppi

            Es ist kein assoziatives Array, die gibt es in JS nicht.
            Es ist ein Object, deshalb...

            Ich bitte um eine Quellenangabe.

            Gruß aus Berlin!
            eddi

            1. Es ist kein assoziatives Array, die gibt es in JS nicht.
              Es ist ein Object, deshalb...

              Ich bitte um eine Quellenangabe.

              Ein Array ist so ein Konstrukt arrayName[index]. Folglich ist ein assoziatives Array so aufgebaut arrayName['key'] soweit so gut.
              Aber ansonsten hat das Beipiel keinerlei Merkmale eines Arrays, im gegenteil es hat nicht die Eigenschaft length und hat auch keine Methode pop/push usw.

              Im Falle eines echten Arrays funktioniert auch arrName.0 nicht, man kann in einem Array nur mit den [] operator auf die Elemente zugreifen.

              Im gegensatz dazu ist ist die Methode mit dem Object die anscheinend durch irgendeine Quelle (selfhtml?) als Namenskonvention assoziatives Array genannt wird in der Lage dem Objekt Methoden zu zufügen und mit dem Punkt auf die einzelnen Attribute zu zugreifen.

              Ein deutlicher Unterschied, der aber in der Praxis wenig Bedeutung hat ;-)

              Struppi.

              1. Hallo Struppi,

                da will ich mich um Gottes Willen nicht streiten. Um es kurz abzureißen: Ich sitze grade breitbeinig in einem Neuland, kenne verschiedene Eigenschaften, Methoden und Objekte von JS, aber mir fehlen schlichtweg die elementaren Grundlagen.

                Das Geschenk meines Chefs "C++" (Buch) steht auch halb angefangen, mahnend im Regal über mir ;)
                Mir fehlt ganz einfach das Verständnis für Typen an der Basis.

                Daher wollte ich um eine Quellenangabe bitte, denn das würde mich weiterbringen. Peter hat mir auch schon neues gezeigt, wo ich doch schier baff bin, wie simpel maches sein kann, wenn man weiß wie (sein Verweis ins Archiv).

                Gruß aus Berlin!
                eddi

          2. Hallo,

            Hallo Thomas Meinike

            Warum _so_ foermlich?

            Es ist kein assoziatives Array, die gibt es in JS nicht.

            Sagt wer? Ich habe mal im "Flanagan"-Referenzwerk von O'REILLY nachgesehen und dort kommt der Begriff vor.

            Unter http://de.selfhtml.org/javascript/objekte/array.htm#assoziative_arrays ist zu lesen:

            "Assoziative Arrays sind besonders in Verbindung mit mehrdimensionalen Arrays sinnvoll. Sie ermöglichen unabhängig von der Position, den Wert eines Elements zu ermitteln. Nachteil ist, dass die Methoden des Array-Objekts nicht anwendbar sind. Auch kennen assoziative Arrays keine Eigenschaft length. Elemente eines assoziativen Arrays können stets nur mit dem Namen oder über eine  for-in-Schleife angesprochen werden."

            BTW: Auch "normale" Arrays werden beim Abfragen mittels typeof() als object behandelt:

            var x=new Array();
            x[0]=123;
            alert(x[0]); // 123
            alert(typeof(x)); // object

            var y=new Array();
            y[0]=new Array();
            y[0]["bla"]=321;
            alert(y[0]["bla"]); // 321;
            alert(typeof(y)); // object

            Außerdem schrieb ich etwas von impliziter Konvertierung in ein Objekt.

            MfG, Thomas

            1. Hallo Thomas Meinike

              Warum _so_ foermlich?

              *g* das macht dieses Forum von alleine, normalerweise erspare ich mir die anreden.

              Es ist kein assoziatives Array, die gibt es in JS nicht.

              Sagt wer? Ich habe mal im "Flanagan"-Referenzwerk von O'REILLY nachgesehen und dort kommt der Begriff vor.

              Unter http://de.selfhtml.org/javascript/objekte/array.htm#assoziative_arrays ist zu lesen:

              "Assoziative Arrays sind besonders in Verbindung mit mehrdimensionalen Arrays sinnvoll. Sie ermöglichen unabhängig von der Position, den Wert eines Elements zu ermitteln. Nachteil ist, dass die Methoden des Array-Objekts nicht anwendbar sind. Auch kennen assoziative Arrays keine Eigenschaft length. Elemente eines assoziativen Arrays können stets nur mit dem Namen oder über eine  for-in-Schleife angesprochen werden."

              Tja, es sind Arrays aber doch nicht? Ja was denn nun?

              Ich bin auf diese diskrepanz auch erst durch die freundlichen Bemerkungen des Herrn Lahn gestossen (der eine oder andere wird ihn kennen)
              hier die Diskussion:
              http://groups.google.de/groups?hl=de&lr=&ie=UTF-8&frame=right&th=a20ad17bc176642f&seekm=3F940F9C.6060206%40PointedEars.de#link10

              und so sehr er menschlich seltsam ist, fachlich läßt er sich meist schwer widerlegen.

              BTW: Auch "normale" Arrays werden beim Abfragen mittels typeof() als object behandelt:

              Bestreitet ja auch niemand. Du kannst dem Array ja auch Methoden und Eigenschaften zufügen und diese benutzen.

              Ein Array ist ein erweitertes Object und wenn du ein assoziatives Array brauchst reicht das einfache Objekt in der Praxis aus, da du in Javascript die Eigenschaften auch mit dem [] Oprator benutzen kannst.
              Aber du kannst, wenn du ein Array (du köntest auch ein Date Object benutzen) verwendest, nicht die array Funktionen auf dieses anwenden. also ist es kein Array, oder?

              Struppi.

              1. gruss Struppi,

                http://groups.google.de/groups?hl=de&lr=&ie=UTF-8&frame=right&th=a20ad17bc176642f&seekm=3F940F9C.6060206%40PointedEars.de#link10

                und so sehr er menschlich seltsam ist, fachlich läßt er sich meist schwer widerlegen.

                danke fuer den link - peterS. - pseliger@gmx.net

                --
                sh:| fo:) ch:? rl:| br:& n3:} n4:# ie:| mo:{ va:| de:[ zu:] fl:) ss:) ls:& js:)
              2. Hallo,

                Tja, es sind Arrays aber doch nicht? Ja was denn nun?

                Das ist schon ein Definitionsproblem. Vielleicht sollte man von AA-like sprechen, wenn man wie im obigen Fall auf x["y"] ausgehend von einer vorherigen Array-Zuweisung zugreift?

                Oder sollte man diesen Begriff bei JS gaenzlich vermeiden? -- Dann vielleicht auch hier: http://home.arcor.de/struebig/computer/javascript/source/cookie.html.

                "getCookie() liest die Cookies der Seite aus. Ohne Paramter gibt die Funktion ein Assoziatives Array mit allen Cookies zurück."

                MfG, Thomas

                1. Hallo,

                  Vielleicht sollte man von AA-like sprechen, wenn man wie im obigen Fall auf x["y"] ausgehend von einer vorherigen Array-Zuweisung zugreift?

                  Es ist insofern problematisch, weil Leute denken, dass der Array-Konstruktor nötig sei, um Unterobjekte zu einem Objekt hinzuzufügen.

                  Wenn man sich z.B. Beispiele aus dem Netz ansieht:

                  var links = new Array(4);
                  links["Netscape"] = "http://developer.netscape.com";
                  links["Mozilla"] = "http://www.mozilla.org";
                  links["Microsoft"] = "http://msdn.microsoft.com/scripting";
                  links["ECMA"] = "http://www.ecma.ch";

                  Das suggeriert, dass zwischen Array(4) und den vier Unterobjekten irgendeine Verbindung bestünde (»der assoziativer Array hat ja vier Elemente«). Stimmt aber wie gesagt nicht, es ist egal, ob man dort Array(), Array(12345), Object(), Function(), Number(), Boolean(), String(), Date(), Image() oder wasweißich hinschreibt.

                  Oder sollte man diesen Begriff bei JS gaenzlich vermeiden?

                  Ich finde ja. Meines Erachtens schafft der Begriff nur Verwirrung, weil das Konzept so in JavaScript nicht existiert. Eine Übertragung auf JavaScript führt also zu Missverständnissen wie den obigen. Außerdem ist es zuträglich für das Gesamtverständnis, zu wissen, dass Unterobjekte (Eigenschaften/Methoden) im Allgemeinen über bla.blub und bla['blub'] angesprochen werden können (ohne dass explizit oder impliziert konvertiert wird, sondern weil es ein grundlegendes Merkmal von ECMAScript ist).

                  Mathias

                2. Hallo,

                  Vielleicht sollte man von AA-like sprechen, wenn man wie im obigen Fall auf x["y"] ausgehend von einer vorherigen Array-Zuweisung zugreift?

                  man spricht von Objekte als assoziative Arrays nutzen, auch wenn es in JavaScript keine assoziativen Arrays als solche gibt. Dennoch finde ich es völlig OK, wenn man "assoziatives Array" sagt, da weiß man wenigsten gleich, was los ist bzw. was derjenige meint/will.

                  bernd

                3. Das ist schon ein Definitionsproblem. Vielleicht sollte man von AA-like sprechen, wenn man wie im obigen Fall auf x["y"] ausgehend von einer vorherigen Array-Zuweisung zugreift?

                  Wie gesagt, ist das letztlich nur ein Mißbrauch des Array Objektes.

                  Oder sollte man diesen Begriff bei JS gaenzlich vermeiden? -- Dann vielleicht auch hier: http://home.arcor.de/struebig/computer/javascript/source/cookie.html.

                  "getCookie() liest die Cookies der Seite aus. Ohne Paramter gibt die Funktion ein Assoziatives Array mit allen Cookies zurück."

                  Jaja, wie gesagt der Begriff hat sich so eingebürgert.

                  Der Punkt ist, das Objekt wird in solchen Fällen wie ein AA benutzt, also folglich genau wie du oben sagst es ist "AA-like".
                  aber in dem Text behaupte ich nicht nur Mist (es gibt ja kein AA in JS) sondern schreib dan auch noch die [object].attribute Form im Beispiel, also völlig falsch und zusätzlich Mißverständlich. Ich werd es ändern.

                  Struppi.

    2. Hallo Thomas!

      Das klappt leider nicht, weil das Script in einem Iframe liegt. Da erkennt er aus irgendeinem Grund den Arary nicht mehr... Wahrscheinlich gibt es da bei der Übergabe irgdenweclhe Probleme...
      Kann man evtl. diesen Array auch zwischenspeichern (ich erinnere mich z.B. da an eine Möglichkeit mit Frames, vielleicht kann man so etwas Ähnliches auch hier machen...)

      Gruß David!