max mustermann: Plugins auslesen, doppelte entfernen und dann ausgeben

vorweg: ich hab sehr sehr wenig Ahnung von JS.

Ziel: auslesen der Installierten Plugins im Browser, und alles was doppelt ist löschen. Den Rest ausgeben.

<script type="text/javascript">

function array_unique(arr)
{
  var vic = new Object();
  for(i=0; i < arr.length; i++)
   vic[arr[i]] = "";
  arr = new Array();
  for(i in vic)
    arr[arr.length] = i;
  return arr;
}

plugins = array_unique(navigator.plugins);

for(i=0;i<plugins.length;++i){
plugins2 = plugins2 + '<br />' + plugins[i];
}

document.write(plugins2);

</script>

Funktioniert leider nicht, aber warum ?

  1. Hallo,

    Funktioniert leider nicht, aber warum ?

    Dazu musst du verstehen, wie array_unique funktioniert. Diese Funktion legt ein Object an und legt darin Eigenschaften an, die als Namen den Wert des Array-Elements haben.

    Nun, was hat navigator.plugins für Elemente? Spezielle Objects. Die werden nun, um sie als Eigenschaftsnamen zu verwenden, in Strings umgewandelt. Bei diesem Umwandlungen kommt bei allen dasselbe heraus: »[object Plugin]« (oder ähnliches).

    Es wird also für jedes Element in navigator.plugins aufgerufen:
    vic["[object Plugin]"] = "";

    Klar, dass vic am Ende nur eine Eigenschaft hat mit dem Namen »[object Plugin]«. Anschließend wird diese Eigenschaft wieder in einen neuen Array kopiert. Im neuen Array gibt es dann entsprechend nur ein Element - und zwar einen String. Damit kannst du nichts anfangen und das ist auch kein Plugin-Objekt, was du ja haben willst.

    Kurz gesagt, diese array_unique-Funktion ist nur für Arrays zu gebrauchen, die Strings enthalten. Das ist bei navigator.plugins nicht der Fall.

    Jetzt ist die Frage: Was sind doppelte Plugins? Man könnte eine Unique-Funktion schreiben, die nach doppelten Objekten sucht. Die gibts aber prinzipiell nicht, kein Objekt ist mit einem anderen gleich (es sei denn, es ist mit ihm identisch, also ein und dasselbe, aber das ist bei den Elementen von navigator.plugins nicht der Fall).

    Also musst du eine Funktion schreiben, die die Eigenschaften name und ggf. Description als Indikator nimmt. Vom Schema her kann es dann ähnlich funktionieren:

    var obj = new Object();
    for (var i = 0, name, plugin; i < navigator.plugins.length; i++) {
       plugin = navigator.plugins[i];
       name = navigator.plugins[i].name;
       obj[name] = plugin;
    }

    Jetzt hast du in obj alle Plugin-Objekte (nicht irgendwelche Strings!) außer solchen, die sich in der name-Eigenschaft gleichen; von den doppelten ist halt das jeweils letzte gespeichert.

    Jetzt durchläufst du einfach obj:
    var plugin;
    for (var name in obj) {
       plugin = obj[name];
       document.write(plugin.name + " / " + plugin.description + "<br>");
    }

    Mathias

    1. zumindest Teilweise habe ich es verstanden.

      danke dir

  2. Hi!

    Funktioniert leider nicht, aber warum ?

    Du meinst nicht navigator.plugins, sondern navigator.plugins[i].name.

    Außerdem noch ein Fehler in deiner Schleife.
    Du willst nicht ++i, sondern i++.

    Schöner Gruß,
    rob

  3. Daß das im MSIE nicht funktioniert, weißt Du?

    Gruß
    Reiner