Visualizzazione dei risultati da 1 a 9 su 9
  1. #1

    Formattazione CSS con Javascript

    L'utilizzo di IFRAME con modalità DesignMode ad On è ormai il sistema più diffuso nel web per permettere agli utenti di editare e formattare testo.
    Vedi un esempio concreto e molto efficace su http://pro.html.it/esempio/357/

    Ma è un sistema graficamente limitato in quanto, sia con MSIE, sia con Mozilla, formatta il testo generando semplici tag HTML, del tipo:
    <FONT FACE="Arial" SIZE="2">testo</FONT>

    Qualora si volesse formattare il testo con CSS in linea si potrebbero creare funzioni più o meno complesse per generare tag come:
    <DIV STYLE="font: 12pt 'Arial'; background: #FFAA11">testo</DIV>

    La cosa più semplice sarebbe però assegnare all'IFRAME delle classi (con fogli CSS collegati o incorporati), generando tag che formattino il testo selezionato con la classe scelta.
    Supponiamo di avere due classi CSS, titolo e corpo, il cui valore è prelevato da un semplice input di tipo select:
    <SELECT NAME="classe">
    <OPTION VALUE="titolo">titolo</OPTION>
    <OPTION VALUE="corpo">corpo</OPTION>
    </SELECT>


    Una semplice funzione di formattazione potrebbe essere:

    <SCRIPT Language="Javascript">
    function class_format(a) {

    var a = selectedtext;
    var classe = document.form.classe.value;

    open_tag = "<DIV CLASS=\"" + classe + "\">";
    close_tag = "</DIV>";

    formatted_text = open_tag + a + close_tag;
    return formatted_text;
    }
    </SCRIPT>


    La domanda del thread è questa:
    come eseguire la funzione sul testo selezionato, nello script è indicato come variabile a?
    Emanuele DG
    <?php echo "Proverbio zen(d): vivi ogni giorno come se fosse il ".date('d M Y', time()); ?>
    Intellectual property

  2. #2
    Up
    Emanuele DG
    <?php echo "Proverbio zen(d): vivi ogni giorno come se fosse il ".date('d M Y', time()); ?>
    Intellectual property

  3. #3
    Utente di HTML.it
    Registrato dal
    Sep 2001
    Messaggi
    21,188
    Mi sa che c'e` un po' di confusione.

    Intanto usare il nome "classe" per un nome di un campo mi sembra che crei piu` confusione che altro.
    Inoltre usi la variabile classe per tre usi diversi: qualche browser potrebbe non capire, e francamente anch'io non capisco (anche se sono convinto di essere piu` intelligente di un browser).
    Nuova politica di maggiore severita` sui titoli delle discussioni: (ri)leggete il regolamento
    No domande tecniche in messaggi privati

  4. #4

    Non ci sono errori

    Mich_, non dovrebbero esserci errori.
    Nello script JS ho assegnato alla variabile classe il valore del select input. Nel mio script reale e più complesso hanno nomi differenti, ma qui li ho scelti identici per far capire da dove provenga il contenuto di quella variabile.
    In quanto alla semantica, attribuisco alla parola classe solo il significato di classe di un elemento HTML la cui formattazione è assegnata ad un foglio di stile CSS (non ho inventato nulla, vedi qui).

    E chiarisco subito il perché: nell'esempio citato lo script, prima di impostare il designMode ad On, assegna il valore HTML di default all'IFRAME:
    FrameDoc.open();
    iFrameDoc.write("<HTML><HEAD></HEAD><BODY MONOSPACE STYLE='font: 10pt arial'></BODY></HTML>"); // default
    iFrameDoc.close();
    iFrameDoc.designMode = "On";


    Ma è possibile inserire tranquillamente anche un tag LINK per collegare un foglio di stile esterno:
    iFrameDoc.write("<HTML><HEAD><LINK href=\"style.css\" TYPE=\"text/css\" REL=\"stylesheet\"></HEAD><BODY></BODY></HTML>"); // default

    In questo modo tutto il contenuto dell'IFRAME rispetterà le regole del foglio di stile CSS caricato nell'HEAD.
    Di qui la mia necessità di usufruire di queste classi del foglio collegato (anche di questa terminologia non ho inventato niente, infatti vedi qui) con la formattazione del mio script (illustrato in apertura) sul testo selezionato.

    Se qualcosa è ancora oscuro o errato indicami tranquillamente quel che hai riscontrato.
    Emanuele DG
    <?php echo "Proverbio zen(d): vivi ogni giorno come se fosse il ".date('d M Y', time()); ?>
    Intellectual property

  5. #5
    Utente di HTML.it
    Registrato dal
    Sep 2001
    Messaggi
    21,188
    Questo ultimo post e` tutto corretto, e` l'applicazione di questo nel codice riportato piu` sopra che non funziona.

    var classe = document.form.classe.value;
    Qui definisci una variabile "classe", pero` classe era gia` un nome usato nel form, per cui c'e` un conflitto (qualche browser lo rileva, altri no).
    Anche il nome del form: form e` un nome riservato dal DOM, e non puo` essere usato come nome.

    Poi non capisco perche` vuoi aprire un nuovo oggetto (creato al volo da JS) solo per assegnare una classe:
    Da JS si assegna una classe ad un oggetto semplicemente con:
    document.getElementById('ID_OGGETTO').className = "nomeclasse";

    Per leggere il valore e il testo di un campo select da JS:
    var ss = document.NOMEFORM.NOMESELECT;
    var valore = ss.options[ss.selectedIndex].value;
    var testo = ss.options[ss.selectedIndex].text;

    Nota: se classe e` il nome della select, non e` opportuno che sia anche il nome di una classe.
    Nuova politica di maggiore severita` sui titoli delle discussioni: (ri)leggete il regolamento
    No domande tecniche in messaggi privati

  6. #6

    L'obiettivo è un altro

    Capisco, ma il mio problema non è individuare quel testo.
    Quella di seguito è una pagina semplificata contenente le normali funzioni di formattazione.
    Se la apri capisci a cosa si riferisce il mio topic.
    Non pretendo che mi risponda, ma almeno non mi considererai più ignorante di un browser!
    Ciao!

    codice:
    <HTML>
    <TITLE>Editor di testo in JavaScript</TITLE>
    <HEAD>
    
    <SCRIPT Language="JavaScript">
    var bHtmlMode = false;
    var str_iFrameDoc = (document.all)? "document.frames(\"html_text\").document\;": "document.getElementById(\"html_text\").contentDocument\;";
    
    // Inizializzazione
    onload = initialize;
    function initialize() {
    	iFrameDoc = eval(str_iFrameDoc);
    
    	iFrameDoc.open();
    	iFrameDoc.write("<HTML><HEAD></HEAD><BODY MONOSPACE STYLE=\"Font:12px Arial\"></BODY></HTML>");
    	iFrameDoc.close();
    	iFrameDoc.designMode = "On";
    
    	document.getElementById("switchMode").checked = false;
    
    	if (!document.all) {
    	    document.getElementById("taglia").style.visibility = "hidden";
    	    document.getElementById("copia").style.visibility = "hidden";
    	    document.getElementById("incolla").style.visibility = "hidden";
    	}
    }
    
    // Porta il focus al riquadro di testo
    function setFocus() {
    if (document.all) { document.frames("html_text").focus(); } else { document.getElementById('html_text').contentWindow.focus(); return; }
    }
    
    // Controlla se la toolbar è abilitata nella modalità testo
    function validateMode() {
    	if (! bHtmlMode)
    		return true;
    	alert("Deselezionare \"Visualizza HTML\" per utilizzare le barre degli strumenti");
    
    	setFocus();
    	return false;
    }
    
    // Formatta il testo
    function formatC(what,opt) {
    	if (!validateMode())
    		return;
    	iFrameDoc = eval(str_iFrameDoc);
    	iFrameDoc.execCommand(what,false,opt);
    	setFocus();
    }
    
    //Scambia tra la modalità testo e la modalità HTML.
    function setMode(newMode) {
    	var testo;
    
    	bHtmlMode = newMode;
    
    	iFrameDoc = eval(str_iFrameDoc);
    	riquadro = iFrameDoc.body;
    
    	if (document.all) {
    		if (bHtmlMode) {
    			testo = riquadro.innerHTML;
    			riquadro.innerText = testo; 
    		} else {
    			testo = riquadro.innerText;
    			riquadro.innerHTML = testo;
    		}
    
    	} else if(document.getElementById && document.createTextNode) {
    		if (bHtmlMode) {
    			testo = document.createTextNode(riquadro.innerHTML);
    			riquadro.innerHTML = "";
    			riquadro.appendChild(testo);
    		} else {
    			testo = document.createRange();
    			testo.selectNodeContents(riquadro);
    			riquadro.innerHTML = testo.toString();
    		}
    	}
    
    	setFocus();
    }
    </SCRIPT>
    </HEAD>
    
    <BODY>
    <DIV STYLE="Font: 18pt 'Arial'; color: #0066CC; font weight: bold">Editor di testo CSS con JavaScript</DIV>
    <FORM NAME="save" STYLE="margin: 0 0 0 0">
    
    <DIV>
    <INPUT TYPE="CHECKBOX" NAME="switchMode" ID="switchMode" onclick="setMode(switchMode.checked)">
    <LABEL FOR="switchMode"><SPAN STYLE="Font: 9pt Lucida sans, Arial">Visualizza HTML</SPAN></LABEL> |
    <INPUT TYPE="BUTTON" onClick="javascript:if ( confirm('Confermi l\'eliminazione della formattazione del carattere?') ) { formatC('removeFormat') }" VALUE="Rimuovi Formattazione Carattere">
    </DIV>
    
    <SELECT ID="FontColor" onchange="formatC('forecolor',this[this.selectedIndex].value);this.selectedIndex=0">
    <OPTION SELECTED>Colore testo</OPTION>
    <OPTION VALUE="#000000" >nero</OPTION>
    <OPTION VALUE="#0000FF" STYLE="color: #0000FF">blu</OPTION>
    <OPTION VALUE="#FF0000" STYLE="color: #FF0000">rosso</OPTION>
    <OPTION VALUE="#009900" STYLE="color: #009900">verde</OPTION>
    <OPTION VALUE="#EE9900" STYLE="color: #EE9900">arancione</OPTION>
    </SELECT>
    
    <INPUT TYPE="BUTTON" onClick="formatC('bold')" VALUE="B">
    <INPUT TYPE="BUTTON" onclick="formatC('italic')" VALUE="I">
    <INPUT TYPE="BUTTON" onclick="formatC('underline')" VALUE="U">
    <INPUT TYPE="BUTTON" onclick="formatC('justifyleft');" VALUE="allinea a sx">
    <INPUT TYPE="BUTTON" onclick="formatC('justifycenter')" VALUE="centra">
    <INPUT TYPE="BUTTON" onclick="formatC('justifyright')" VALUE="allinea a dx">
    <INPUT TYPE="BUTTON" onclick="formatC('insertorderedlist')" VALUE="elenco numerato">
    <INPUT TYPE="BUTTON" onclick="formatC('insertunorderedlist')" VALUE="elenco puntato"> 
    
    <INPUT TYPE="BUTTON" onclick="formatC('indent')" VALUE="inserisci tabulazione">
    <INPUT TYPE="BUTTON" onclick="formatC('outdent')" VALUE="elimina tabulazione">
    <INPUT TYPE="BUTTON" onclick="formatC('cut')" VALUE="taglia">
    <INPUT TYPE="BUTTON" onclick="formatC('copy')" VALUE="copia">
    <INPUT TYPE="BUTTON" onclick="formatC('paste')" VALUE="incolla">
    
    <BLOCKQUOTE>
    <SELECT NAME="cstyle">
    <OPTION VALUE="" SELECTED>Classe del testo</OPTION>
    <OPTION VALUE="titolo">titolo</OPTION>
    <OPTION VALUE="corpo">corpo</OPTION>
    </SELECT> !!!
    </BLOCKQUOTE>
    
    <IFRAME WIDTH="700" NAME="html_text" ID="html_text" HEIGHT="200" Frameborder="no" Style="Border: 1px solid #0066cc">
    </IFRAME>
    
    <SCRIPT Language="JavaScript">
    // Funzione di verifica del contenuto dell'input preso dall'iframe:
    function controlla_testo() {
    document.save.testo.value = html_text.document.body.innerHTML;
    a = document.save.testo.value;
    alert('il codice HTML prodotto dall\'iframe è: \n' + a );
    }
    function frame_reset() {
    html_text.document.body.innerHTML = "";
    }
    </SCRIPT>
    
    <DIV ALIGN="CENTER">
    <INPUT TYPE="BUTTON" onClick="controlla_testo()" VALUE="Verifica">
    <INPUT TYPE="BUTTON" onClick="if (confirm('Sei sicuro di voler eliminare il testo digitato?')) { frame_reset(); }" VALUE="Pulisci">
    <INPUT TYPE="HIDDEN" NAME="testo" VALUE="">
    </DIV>
    
    
    <DIV STYLE="Font: 10pt Tahoma">
    Sto cercando di fare in modo che il <U>testo selezionato nell'IFRAME</U>, (non quello associato al valore del select input!) venga formattato con il tag
    
    <BLOCKQUOTE>
    <FONT COLOR="purple">&lt;DIV CLASS="titolo"&gt;</FONT>testo selezionato da trasformare in titolo...<FONT COLOR="purple">&lt;/DIV&gt;</FONT>
    
    oppure
    
    <FONT COLOR="#0066cc">&lt;DIV CLASS="corpo"&gt;</FONT>testo selezionato...<FONT COLOR="#0066cc">&lt;/DIV&gt;</FONT>
    </FONT>
    </BLOCKQUOTE>
    a seconda della option selezionata nel menu a tendina di nome cstyle.
    
    E comprensibile il mio tentativo?
    </DIV>
    
    </FORM>
    
    </BODY>
    </HTML>
    Emanuele DG
    <?php echo "Proverbio zen(d): vivi ogni giorno come se fosse il ".date('d M Y', time()); ?>
    Intellectual property

  7. #7
    Utente di HTML.it L'avatar di Xinod
    Registrato dal
    Sep 2000
    Messaggi
    13,649
    emanuele,
    il metodo pasteHTML x il solo IE ti permette di incollare qualsiasi codice html nella selezione (approfondisci presso http://www.msdn.com di microsoft)

    con mozilla & Co. si ricostruisce una cosa del genere, ma a farla bene ti assicuro che sono dolori...
    se riesci dai un occhio ai sorgenti di htmlarea3
    dove si incolla qualsiasi codice quando questo non rientra tra gli elementari output producibili via execCommand

  8. #8

    Due possibili soluzioni

    Per ora ho trovato 2 soluzioni parzialmente adatte al quesito.
    (Le posto solo nella remota e disattesa possibilità che torni utile a qualcuno, in futuro).
    1. Prima soluzione, un prompt:

    codice:
    <SCRIPT Language="Javascript">
    function addtitle() {
    a = html_text.document.body.innerHTML;
    b = prompt('Inserisci il titolo del paragrafo', 'Titolo');
    c = a + "<DIV CLASS=\"titolo\">" + b + "</DIV>Scrivi qui il testo";
    html_text.document.body.innerHTML = c;
    }
    </SCRIPT>
    Associato all'input HTML:
    <INPUT TYPE="BUTTON" onclick="addtitle()" VALUE="titolo">

    Questa soluzione chiede in un prompt il titolo cui associare la classe CSS "titolo", lo formatta con i layer DIV e lo attacca in fondo al testo già inserito dell'IFRAME.
    Carenza: l'inserimento del titolo non viene effettuato nella parte selezionata del testo dell'IFRAME, ma in fondo. Però è spostabile in una riga vuota superiore con il copia/incolla.

    2. Seconda soluzione, utilizzo di reg exp:

    codice:
    <SCRIPT Language="Javascript">
    function preclass() {
    var n_reg = html_text.document.body.innerHTML;
    
    if (document.all)
    { re=/<FONT color=#090909>/;
    n_reg = n_reg.replace(re,"<DIV CLASS=\"titolo\">");
    re=/<\/FONT>/;
    n_reg = n_reg.replace(re,"</DIV>");
    
    re=/<FONT color=#080808>/;
    n_reg = n_reg.replace(re,"<DIV CLASS=\"corpo\">");
    re=/<\/FONT>/;
    n_reg = n_reg.replace(re,"</DIV>");
    
    html_text.document.body.innerHTML = n_reg;
    return;
    }
    /* Con lo stesso criterio si può fare un replace del contenuto
    dell'IFRAME anche per FireFox e altri browser */
    }
    </SCRIPT>
    Controllato dal select box
    <SELECT ID="FontColor" onchange="formatC('forecolor',this[this.selectedIndex].value);this.selectedIndex=0;preclass();">
    <OPTION SELECTED>Classe</OPTION>
    <OPTION VALUE="#080808">titolo</OPTION>
    <OPTION VALUE="#090909">corpo</OPTION>
    </SELECT>


    Questa soluzione formatta normalmente il testo selezionato attraverso la funzione FormatC con il metodo execCommand con 2 colori improbabili, 080808 e 090909 a cui sono associate due classi CSS, rispettivamente titolo e corpo.
    Le regular expression che seguono sostituiscono il formatting del primo colore 080808 con il layer di classe "titolo" e il secondo colore 090909 con il layer di classe "corpo".
    In questo caso è stata scritta solo per MSIE, ma basta ampliare la funzione con la condizione if (!(document.all)) per fare il replace dell'IFRAME su tag color di altri browser.
    Ovviamente questa soluzione va bene nel mio caso dove l'editor non deve avere possibilità di formattazione FONT, pertanto il replace non globale del tag </FONT> non crea problemi di chiusure indesiderate di altre sintassi.

    Carenze: soluzione strettamente dipendente dall'output dell'execCommand del browser e alla sintassi di formattazione del browser sul colore.
    Il replace delle RegExp deve prevedere tutte le possibili sintassi di formattazione del colore dei browser.
    Obsolescenza in caso di upgrade dei browser.


    Per Xinod, grazie dei consigli su htmlarea3, proverò a visionarli.
    Per Mich_: le tue più che critiche costruttive sono critiche (e mi riferisco anche ad altri thread).
    Emanuele DG
    <?php echo "Proverbio zen(d): vivi ogni giorno come se fosse il ".date('d M Y', time()); ?>
    Intellectual property

  9. #9

    HTMLarea

    Ho provato a vedere su http://www.dynarch.com/projects/htmlarea/, anche il solo core di htmlarea è favoloso.
    Il problema è che il codice è caricato dallo script esterno htmlarea.js che contiene tutte le funzioni di tutte le versioni grafiche, ed è abbastanza pesante. Devo scremarlo dalle funzioni inutilizzate.

    Comunque anche quei geni usano un prompt per effettuare inserimenti HTML.
    Emanuele DG
    <?php echo "Proverbio zen(d): vivi ogni giorno come se fosse il ".date('d M Y', time()); ?>
    Intellectual property

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.