molily: IE-DOM vs. Moz-DOM: Property "specified"

Beitrag lesen

Hallo,

Der IE zeigt als Länge mindestens den Zahlenwert 83 an - er hat sämtliche möglichen Attribute drin, z.B. alle Javascript-Eventhandler. Damit die nicht alle bearbeitet werden, wird die IE-proprietäre Eigenschaft "specified" abgefragt. Die ist angeblich dann true, wenn das Attribut tatsächlich im Dokument angegeben wurde, false dann, wenn Default-Angaben wirksam werden, und kann auch ganz fehlen.

http://www.w3.org/TR/DOM-Level-2-Core/core.html#ID-862529273

Frage an die Experten: Wie kann ich dem IE beibringen, dass ALLE meine im Quelltext definierten Attribute diesen Text mit "true" bestehen und dadurch in meinem Editorquelltext bestehen bleiben?

Die Funktion fängt so an:

function TinyMCE__cleanupAttribute(valid_attributes, element_name, attribute_node, element_node) {
 var attribName = attribute_node.nodeName.toLowerCase();
 var attribValue = attribute_node.nodeValue;
 ...

Damit ist das ganze Unternehmen schon zum Scheitern verurteilt, weil nodeValue bei (gesetzen!) name- und value-Attributen im MSIE 5.0 null ist (denke mal, es ist im 5.5 und 6 genauso oder String('')). Glücklicherweise funktioniert getAttribute:

var elementValidAttribs = ["type", "name", "id", "value", "size"];
Array.prototype.contains = function (str) { // siehe Archiv...
 str = str.toLowerCase();
  var i, exists = false;
 for (i = 0; i < this.length; i++) {
  if (this[i] === str) {
          exists = true;
          break;
  }
 }
 return exists;
};

var elem = document.createElement("input");
elem.setAttribute("type", "text");
elem.setAttribute("name", "search2");
elem.setAttribute("size", "6");
elem.setAttribute("value", "bla");

var i, attrName, attrValue, elementAttribs = new String();

for (i = 0; i < elem.attributes.length; i++) {
 attrName = elem.attributes[i].nodeName;
 attrValue = elem.getAttribute(attrName);
 document.write("<p>Attribut: " + attrName + "<br>" +
  "specified: " + elem.attributes[i].specified + "<br>" +
  "nodeValue: '" + elem.attributes[i].nodeValue + "'<br>" +
  "nodeValue: '" + elem.attributes[i].nodeValue + "'<br>" +
  "contains: " + elementValidAttribs.contains(attrName) + "<br>" +
  "getAttribute: '" + attrValue + "'</p>");
        if (attrValue !== null && attrValue !== "" && elementValidAttribs.contains(attrName)) {
  elementAttribs += " " + attrName + '="' + attrValue + '"';
 }
}

document.write("<p>&lt;" + elem.nodeName + elementAttribs + "&gt;</p>")

Alle Attribute mit null und '' kannst du einfach überspringen, oder sehe ich das falsch? Ansonsten einfach die Bedingungen !==null und !=='' löschen.

Mathias