cloneNode erzeugt keine onclick-Handler Kopie
Skeeve
- javascript
Moin!
Standard Vorbemerkung:
Es geht hier um eine Applikation die nur für Gecko Browser gedacht ist und nur mit aktiviertem JavaScript funktionieren soll.
Aufgrund der Tipps, die ich hier bisher bekommen habe, habe ich einen großen Teil der Applikation nun umgestellt, bin aber jetzt an einem Punkt, an dem ich nochmal Hilfestellung gebrauchen könnte.
Runtergebrochen auf ein Beispiel sieht das ganze so aus:
<html>
<head>
<script>
function doLink() {
alert("Hier bin ich");
return false;
}
function init() {
var a= document.getElementsByTagName( 'a' );
a[0].onclick=doLink;
var body= document.getElementsByTagName( 'body' ).item(0);
body.appendChild( a[0].cloneNode( true ) );
}
</script>
</head>
<body onload="init()">
<a href="http://www.google.de/">a[0].onclick=doLink;</a>
</body>
</html>
Ich kopiere den einen link mit cloneNode( true ). Zuvor habe ich dem Original einen onclick Handler verpaßt.
Nun gibt es 2 Probleme:
1. Der Clone hat keinen onclick handler
2. Das Original liefert mir im FireFox eine Fehlermeldung:
Error: [Exception... "'Permission denied to set property XULElement.selectedIndex' when calling method: [nsIAutoCompletePopup::selectedIndex]" nsresult: "0x8057001e (NS_ERROR_XPC_JS_THREW_STRING)" location: "JS frame :: file:///Users/me/Desktop/links.html :: doLink :: line 5" data: no]
Source File: file:///Users/me/Desktop/links.html
Line: 5
Hat jemand eine Idee, warum der Handler im Clone fehlt? Darf ich eventuell so gar nicht Teile eines Dokuments kopieren?
Was will mir die Fehlermeldung (die in mozilla nicht auftritt) sagen und was kann ich dagegen unternehmen?
Vielen Dank schonmal,
-- Skeeve
Hell-O!
- Hat jemand eine Idee, warum der Handler im Clone fehlt? Darf ich eventuell so gar nicht Teile eines Dokuments kopieren?
Weil du ihn via JS hinzugefügt hast, cloneNode erstellt eine identische Kopie des Original-HTML, ohne die Änderungen, die du via Javascript daran vorgenommen hast. Notierst du den Eventhandler nebst JS-Code direkt im HTML, wird er auch mitkopiert.
- Was will mir die Fehlermeldung (die in mozilla nicht auftritt) sagen und was kann ich dagegen unternehmen?
Das scheint ein Mozilla-Bug zu sein, siehe auch MozillaZine.
Siechfred
Moin!
Weil du ihn via JS hinzugefügt hast, cloneNode erstellt eine identische Kopie des Original-HTML,
:-( Sehr blöde... Denn nun darf ich alle Änderungen, die ich vorgenommen habe, wieder zurücknehmen. Also bleibe ich bei meinem (in diesem Fall) <code lang=javascript]a[0].setAttribute( 'onclick', 'doLink(this)' );[/code]
Das funktioniert wenigstens.
Das scheint ein Mozilla-Bug zu sein, siehe auch MozillaZine.
Dankeschön! Jetzt weiß ich auch, wo ich künftig suchen kann, wenn solche abstrusen Fehlermeldungen auftreten.
-- Skeeve
Weil du ihn via JS hinzugefügt hast, cloneNode erstellt eine identische Kopie des Original-HTML,
:-( Sehr blöde... Denn nun darf ich alle Änderungen, die ich vorgenommen habe, wieder zurücknehmen. Also bleibe ich bei meinem (in diesem Fall) <code lang=javascript]a[0].setAttribute( 'onclick', 'doLink(this)' );[/code]
Das funktioniert wenigstens.
Ich denke es ging um HTML code den du dir per AJAX (?) holst?
Warum fügst du dann dem Orginalcode den Handler zu, den benötigst du doch gar nicht.
Struppi.
Moin!
Ich denke es ging um HTML code den du dir per AJAX (?) holst?
Jep.
Warum fügst du dann dem Orginalcode den Handler zu, den benötigst du doch gar nicht.
Ich brauche den Code an 2 Stellen. Hier mal ein Ausschnitt aus dem Index:
<body>
<div id="Index" class="main-headline">Index</div>
<a name="A" class="kapitaelchen">A</a>
<div id="A" class="alphabet">
<a href="addanewproject.html" >Add a new project</a>
<a href="addmembers.html" >Add members</a>
<a href="print.html" >Add pagebreak</a>
<a href="assignatask.html" >Assign a task</a>
</div>
Das ist der HTML Code, den ich von den Hilfeschreibern bekomme.
Für den Menübereich benötige ich nun nur die einzelnen divs. Wenn also jemand alle Stichworte zum Buchstaben "A" sehen möchte, dann wird nur das obige div eingeblendet.
Im Content Bereich soll aber der gesamte Index angezeigt werden, wenn ihn jemand anfordert.
Darum hatte ich die Datei per AJAX geholt, in einem <div id="menu"> dem innerHTML zugewiesen und dann den onclick Handler aller <a> tags auf doLink gestzt. Mit cloneNode(true) habe ich dann alle Kinder des <div id="menu"> kopiert und, wenn der Index angezeigt werden sollte, ins <div id="content"> eingehängt.
Da das ja nun kläglich gescheitert ist, packe ich doch wieder das onclick Attribut hinein und arbeite wieder mit innerHTML. Das klappt wenigstens.
-- Skeeve