2012-10-19 17 views
7

Io uso Google Chrome.Contenuto HTML5 paragrafo modificabile dopo la lista

Ho bisogno di avere un editor HTML molto piccolo e ho trovato Simple Edit. Editor molto piccolo, solo per le mie esigenze. Tuttavia ... Questo e molti altri editor che usano Content Editable hanno un problema comune.

Problema

Dopo la creazione di un elenco (premere invio due volte sulla voce ultimo elenco), si crea un nuovo div. Mi aspettavo di creare un nuovo tag di paragrafo.

Link

Domanda

Qual è il modo corretto di impedire i div e invece aggiungere tag di paragrafo dopo un elenco?

+2

Questo pubblicherà un problema sai. Se si sostituisce il proprio elemento contenitore con i tag di paragrafo anziché con le div, gli elenchi successivi saranno figli di paragrafi che, non è html valido. –

risposta

5

La risposta inviata da Bryan Allo non ha tenuto conto del fatto che è necessario posizionare il cursore alla fine del div. Altrimenti su ogni azione di sostituzione l'utente dovrebbe premere CTRL-Fine.

Questa è la soluzione che propongo, anche per essere visto in azione a http://jsfiddle.net/82dS6/:

function setEndOfContenteditable(contentEditableElement){ 
    // Taken from http://stackoverflow.com/a/3866442/1601088 
    var range,selection; 
    if(document.createRange){//Firefox, Chrome, Opera, Safari, IE 9+ 
     range = document.createRange(); 
     range.selectNodeContents(contentEditableElement); 
     range.collapse(false); 
     selection = window.getSelection(); 
     selection.removeAllRanges(); 
     selection.addRange(range); 
    } 
    else if(document.selection){//IE 8 and lower 
     range = document.body.createTextRange(); 
     range.moveToElementText(contentEditableElement); 
     range.collapse(false); 
     range.select(); 
    } 
} 

function replaceDivWithP(el){ 

    $(el).find('div').each(function(){ 
     $(this).replaceWith($('<p>' + $(this).html() + '</p>')); 
    }); 
} 

$(function(){ 
    $(".text").simpleEdit(); 
}); 

$('.textarea').bind('keyup', function(){ 
    replaceDivWithP(this); 
    setEndOfContenteditable(this); 
}); 


​ 
+1

Questa soluzione è la migliore finora. Vota finora. Tuttavia, quando faccio clic sull'icona dell'elenco, aggiungo l'elenco all'interno di un paragrafo. –

+1

Sembra che non ci sia un modo semplice per aggirare questo perché la libreria che stai utilizzando utilizza ExecCommand per sostituire il contenuto in cui non è facile collegarsi. – maurits

0

Una soluzione rapida è semplicemente sostituire qualsiasi DIV con Ps. Inseriscilo nel tuo DIV modificabile del contenuto.

onkeyup="this.innerHTML=this.innerHTML.replace('div','p')" 

Spero che sia d'aiuto. In bocca al lupo.

+0

puoi sostituire i tag attuali se vuoi essere specifico ed evitare potenziali conflitti con contenuti validi. Non dimenticare di sostituire anche i tag di chiusura. :-) –

1

Invece di elaborazione on-the-vola con ogni evento keyup, si potrebbe prendere in considerazione di post-elaborazione:

$('.textarea').bind('blur', function(){ 
    $('.textarea div').contents().unwrap().wrap('<p/>'); 
}); 

Fiddle: http://jsfiddle.net/thNUS/4/

0

Il meglio che ho potuto venire con era di usare formatblock which has compatibility issues. In sostanza si potrebbe aggiungere un altro link in questo modo:

textcontainer.prepend("<button class='paragraph'>p</button>"); 

...

$(".paragraph").live("click", function(){ 
    document.execCommand('formatblock', false, "p"); 
}); 

Questo offre agli utenti la possibilità di inserire un tag di paragrafo. Uscire da quel tag è un po 'complicato, quindi ha anche alcuni problemi di usabilità.Si può giocare con essa sul demo fornito:

Demo: http://jsbin.com/ovexiz/1
Fonte: http://jsbin.com/ovexiz/1/edit

* notare che i paragrafi sono arredate con testo di colore verde.

0

Le risposte precedenti hanno proposto una soluzione basata su keyup o blur. Questo si usa l'evento click del pulsante lista di ridurre al minimo la quantità di chiamate di funzione:

http://jsfiddle.net/9ZAL7/:

function replaceDivWithP(el){ 

    $(el).find('div').each(function(){ 
     $(this).replaceWith($('<p>' + $(this).html() + '</p>')); 
    }); 
} 

$(function(){ 
    $(".text").simpleEdit(); 
}); 

$('button.list').bind('click', function(){ 
    replaceDivWithP($('.textarea')); 
}); 
​ 
Problemi correlati