Avatar billede zacho112 Nybegynder
22. juni 2006 - 20:13 Der er 3 kommentarer og
1 løsning

Fejl i Firefox: uncaught exception: null

Hej, får denne fejl i min WYSIWYG editor i FF, men ikke i IE.
Kan ikke selv finde ud af hvor fejlen sidder, så håber i kan hjælp!

Koden:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title></title>
<script type="text/javascript">
function RichEdit(sEditor)
{
    // For at editoren skal virke, er det nødvendigt at document.designMode
    // og document.getElementById er tilgængelige
    if(document.designMode && document.getElementById)
        this.bEditable = true;
    else
        this.bEditable = false;

    // Hvis vi alligevel ikke kan redigere dokumentet, kan resten af koden
    // være ligegyldig.
    if(!this.bEditable)
    {
        alert('Din browser understøtter ikke WYSIWYG-editoren!');
        return false;
    }

    // Opret en variabel til at håndtere iframet, via ID'et angivet i sEditor
    this.richEdit = document.getElementById(sEditor).contentWindow;
    this.richEdit.document.write("Standard tekst!");

    // Line tilbage til dette objekt
    document.getElementById(sEditor).oEditor = this;

    // Tjek browser-typen
    if(navigator.userAgent.toLowerCase().indexOf("msie") != -1)
    {
        // Skift designMode til on (i IE)
        this.richEdit.document.designMode = "on";
    }
    else
    {
        // I FF bruger vi en lidt anderledes fremgangsmåde
        document.getElementById(sEditor).contentDocument.designMode = "on";
    }

    // Tilføj events
    if(document.attachEvent)
    {
        this.richEdit.document.attachEvent('onclick', function(){RichEdit.prototype.indicateStyle(sEditor);});
        this.richEdit.document.attachEvent('onkeydown', function(){RichEdit.prototype.indicateStyle(sEditor);});
    }
    else if(document.addEventListener)
    {
        this.richEdit.document.addEventListener('click', function(){RichEdit.prototype.indicateStyle(sEditor);}, false);
        this.richEdit.document.addEventListener('keydown', function(){RichEdit.prototype.indicateStyle(sEditor);}, false);
    }

    // Vis menuen
    this.richEdit.document.oMenu = new Menu("EditorMenu", sEditor, [["bold.gif", "Bold"], ["italic.gif", "Italic"], ["underline.gif", "Underline"]]);
}

RichEdit.prototype.applyStyle = function(sEditor, sCommand, sOption) {
    // Vi sikrer os, at editoren er i fokus, når vi tilføjer layoutet,
    // da browseren ellers kan blive forvirret over hvor den skal tilføje
    // layoutet.
    this.richEdit.focus();

    // Tilføj det ønskede layout
    this.richEdit.document.execCommand(sCommand, false, sOption);

    // Og slut af med igen at fokusere editoren, så brugeren kan
    // skrive uforstyrret videre.
    this.richEdit.focus();
    RichEdit.prototype.indicateStyle(sEditor);
}

RichEdit.prototype.indicateStyle = function(sEditor)
{
    // Lav en variabel, som kan håndtere editoren
    var oEditor = document.getElementById(sEditor).contentWindow.document;

    // Lav et array, som indeholder de former for formatering, som editoren understøtter
    // Denne gang laver vi det to-dimensionelt. Det første felt angiver hvilken
    // Formateringstype vi snakker om (Bold, Italic, Underline osv.), og den
    // Næste angiver hvilket nummer i rækken af knapper, den pågældende
    // knap er (starter med 0!).
    var aStyles = [["Bold", 0], ["Italic", 1], ["Underline", 2]];

    // Løb arrayet igennem, og find ud af hvilke af formateringerne der er hhv. til/fra.
    var sRes = "";

    for(var i = 0; i < aStyles.length; i++)
    {
        if(oEditor.queryCommandState(aStyles[i][0]))
        {
            // Den pågældende formatering er slået til
            oEditor.oMenu.aButtons[aStyles[i][1]].aStandard = oEditor.oMenu.oActive;
            oEditor.oMenu.aButtons[aStyles[i][1]].aOver = oEditor.oMenu.oDown;
            oEditor.oMenu.aButtons[aStyles[i][1]].aDown = oEditor.oMenu.oDown;
        }
        else
        {
            // Den pågældende formatering er ikke slået til
            oEditor.oMenu.aButtons[aStyles[i][1]].aStandard = oEditor.oMenu.oStandard;
            oEditor.oMenu.aButtons[aStyles[i][1]].aOver = oEditor.oMenu.oOver;
            oEditor.oMenu.aButtons[aStyles[i][1]].aDown = oEditor.oMenu.oDown;
        }
    }
}

function Menu(sParent, sEditor, aButtons)
{
    // Lav en variabel til at håndtere det div-tag, som knapperne skal "puttes ind i"
    var oParent = document.getElementById(sParent);

    // Opret et array, som senere kan bruges til at håndtere knapperne med
    this.aButtons = new Array();

    // De styles, som knapperne skal have ved de forskellige stadier
    this.aStandard = {"background":"none"}
    this.aOver = {"backgroundColor":"#0000FF"}
    this.aDown = {"backgroundColor":"#00FF00"}
    this.aActive = {"backgroundColor":"#FF0000"}

    // Lav en knap for hvert felt i aButtons arrayet
    for(var i = 0; i < aButtons.length; i++)
    {
        // Lav knappen
        var oBtn = document.createElement('img');
        oBtn.src = aButtons[i][0];

        // Gem den handling, som knappen skal udføre
        oBtn.sAction = aButtons[i][1];

        // Tilføj styles, som knappen benytter ved de forskellige stadier
        // - Hvis denne aktiveres, så bliver aActive sat som aStandard og
        // aDown sat som aOver & aDown.
        oBtn.aStandard = this.aStandard;
        oBtn.aOver = this.aOver;
        oBtn.aDown = this.aDown;

        // Indiker det aktive stadie (aStandard)
        oBtn.sActive = "aStandard";

        // Line-back til denne klasse, så vi kan kontakte den igen,
        // når knappen aktiveres, og kan hente de nye styles
        oBtn.oOwner = this;

        // Tilføj events
        if(document.attachEvent)
        {
            oBtn.attachEvent('onmouseover', Menu.prototype.mouseOver);
            oBtn.attachEvent('onmouseout', Menu.prototype.mouseOut);
            oBtn.attachEvent('onmousedown', Menu.prototype.mouseDown);
            oBtn.attachEvent('onmouseup', Menu.prototype.mouseUp);
            oBtn.attachEvent('onclick', function(e){Menu.prototype.click(e, sEditor);});
        }
        else if(document.addEventListener)
        {
            oBtn.addEventListener('onmouseover', Menu.prototype.mouseOver);
            oBtn.addEventListener('onmouseout', Menu.prototype.mouseOut);
            oBtn.addEventListener('onmousedown', Menu.prototype.mouseDown);
            oBtn.addEventListener('onmouseup', Menu.prototype.mouseUp);
            oBtn.addEventListener('onclick', function(e){Menu.prototype.click(e, sEditor);});
        }

        // Tilføj en variabel til at håndtere knappen med i this.aButtons
        this.aButtons.push(oBtn);

        // Vis knappen
        oParent.appendChild(oBtn);
    }
}

Menu.prototype.mouseOver = function(e)
{
    // Sørg for at e (event) er defineret
    if(!e) var e = window.event;

    // Lav en variabel, som kan håndtere den knap, som udløste eventet
    if(e.srcElement) var oSrc = e.srcElement;
    else if(e.target) var oSrc = e.target;

    // Opdater layoutet af knappen
    for(var s in oSrc.aOver) oSrc.style[s] = oSrc.aOver[s];
}

Menu.prototype.mouseOut = function(e) {
    // Sørg for at e (event) er defineret
    if(!e) var e = window.event;

    // Lav en variabel, som kan håndtere den knap, som udløste eventet
    if(e.srcElement) var oSrc = e.srcElement;
    else if(e.target) var oSrc = e.target;

    // Opdater layoutet af knappen
    for(var s in oSrc.aStandard) oSrc.style[s] = oSrc.aStandard[s];
}

Menu.prototype.mouseDown = function(e) {
    // Sørg for at e (event) er defineret
    if(!e) var e = window.event;

    // Lav en variabel, som kan håndtere den knap, som udløste eventet
    if(e.srcElement) var oSrc = e.srcElement;
    else if(e.target) var oSrc = e.target;

    // Opdater layoutet af knappen
    for(var s in oSrc.aDown) oSrc.style[s] = oSrc.aDown[s];
}

Menu.prototype.mouseUp = function(e) {
    // Sørg for at e (event) er defineret
    if(!e) var e = window.event;

    // Lav en variabel, som kan håndtere den knap, som udløste eventet
    if(e.srcElement) var oSrc = e.srcElement;
    else if(e.target) var oSrc = e.target;

    // Opdater layoutet af knappen
    for(var s in oSrc.aOver) oSrc.style[s] = oSrc.aOver[s];
}

Menu.prototype.click = function(e, sEditor) {
    // Sørg for at e (event) er defineret
    if(!e) var e = window.event;

    // Lav en variabel, som kan håndtere den knap, som udløste eventet
    if(e.srcElement) var oSrc = e.srcElement;
    else if(e.target) var oSrc = e.target;

    // Kald funktionen til at opdatere layoutet af teksten
    document.getElementById(sEditor).oEditor.applyStyle(sEditor, oSrc.sAction, null);
}

function initialize() {
    // Husk at angive ID'et på den iframe, som skal indeholde editoren her
    richEdit = new RichEdit('Editor');
}
</script>
</head>
<body onload="initialize();">

    <div id="EditorMenu"></div>
    <iframe id="Editor"></iframe>

</body>
</html>


På forhånd tak!
Avatar billede nyp Nybegynder
23. juni 2006 - 09:47 #1
Rettelser til et par fingerfejl, men det er ikke sikkert det er dem der giver fejlen.

        else if(document.addEventListener)
        {
            oBtn.addEventListener('mouseover', Menu.prototype.mouseOver);
            oBtn.addEventListener('mouseout', Menu.prototype.mouseOut);
            oBtn.addEventListener('mousedown', Menu.prototype.mouseDown);
            oBtn.addEventListener('mouseup', Menu.prototype.mouseUp);
            oBtn.addEventListener('click', function(e){Menu.prototype.click(e, sEditor);});
        }

    this.aStandard = {"backgroundColor":"none"}
Avatar billede nyp Nybegynder
23. juni 2006 - 09:51 #2
oBtn.addEventListener('onmouseover', Menu.prototype.mouseOver);
Kna man kalde functionen med Menu.prototype.mouseOver skal det ikke være this.mouseOver?
Avatar billede zacho112 Nybegynder
23. juni 2006 - 10:49 #3
Det ved jeg ikke, er ikke så god til javascript endnu, og har fået lidt hjælp af en ven til at bixe den der kode sammen, men han er på ferie nu, så han kan ikke hjælpe mig mere. Men kan da prøve at rette det og se hvad der sker. Vender tilbage senere!
Avatar billede zacho112 Nybegynder
29. juni 2006 - 10:29 #4
lala
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester