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><" + elem.nodeName + elementAttribs + "></p>")
Alle Attribute mit null und '' kannst du einfach überspringen, oder sehe ich das falsch? Ansonsten einfach die Bedingungen !==null und !=='' löschen.
Mathias