2014-05-22 8 views
9

Sto tentando di creare un mini editor WYSIWYG per un CMS personalizzato. Ha la possibilità di aggiungere e rimuovere collegamenti. Aggiunge collegamenti fini, ma vorrebbe avere la possibilità di aggiungere target="_blank" al collegamento ipertestuale. Inoltre, se possibile, mi piacerebbe poter aggiungere alt="" e title="".Aggiunta di una destinazione = "_ blank" con execCommand 'createlink'

Al momento questo è il mio codice:

function addLink() { 
    var linkURL = prompt('Enter a URL:', 'http://'); 
    editorWindow.document.execCommand('createlink', false, linkURL); 
} 

cercato in giro, e non riesco a trovare una soluzione. La maggior parte delle soluzioni che ho visto dicono di aggiungere:

function addLink() { 
    var linkURL = prompt('Enter a URL:', 'http://'); 
    var newLink = editorWindow.document.execCommand('createlink', false, linkURL); 
    newLink.target = "_blank"; 
} 

Ma questo non sembra funzionare. Eventuali suggerimenti?

+0

Vuoi veramente usare la funzionalità execCommand? Perché non creare semplicemente un nuovo elemento di collegamento e aggiungerlo alla dom, o ancora meglio, usare jQuery? => Inoltre, non dimenticare di sfuggire l'url che l'utente può inserire per evitare possibili XSS –

+0

Grazie per la risposta. Non so esattamente come andare su questo. So che aggiungete create un nuovo elemento con 'document.createElement ('a');' e quindi aggiungendo 'setAttribute ('target', '_blank');'. L'unica cosa che non vedo è come applicare il link al testo che è stato evidenziato. – thelos999

risposta

12

Sono stato in grado di trovare una soluzione. Non so se questa è la strada giusta da percorrere, ma funziona. A seguito di https://stackoverflow.com/a/5605841/997632, questo è quello che ho usato per il mio codice funzioni:

function addLink() { 
    var linkURL = prompt('Enter a URL:', 'http://'); 
    var sText = editorWindow.document.getSelection(); 

    editorWindow.document.execCommand('insertHTML', false, '<a href="' + linkURL + '" target="_blank">' + sText + '</a>'); 
} 

Solo nel caso qualcun altro sta cercando e si imbatte in questo ...

+2

"In IE 11, documentation.selection non funziona e insertHTML non è ancora supportato" http://stackoverflow.com/questions/3398378/execcommand-inserthtml-in-internet-explorer – Jim

+0

È possibile utilizzare jQuery come $ ("a") attr ("target", "_ blank").; dopo il normale execCommand. Semplicemente aggiunge l'attributo a ogni ancora - o potresti provare a mirare l'ancora specifico ... è brutto, ma funziona. – Edd

3

insertHTML può essere vanificato se si dispone di un grassetto o corsivo prima. Io uso il seguente approccio:

var url = 'example.com'; 
 
var selection = document.getSelection(); 
 
document.execCommand('createLink', true, url); 
 
selection.anchorNode.parentElement.target = '_blank';

2

Dal momento che, non esiste una soluzione semplice cross-browser, una soluzione cross-browser potrebbe essere programatically allegando un gestore di eventi per a all'interno del vostro editor di:

1

So che questo thread è piuttosto vecchio, ma mi permetta di lanciare i miei 2 centesimi, e forse qualcuno troverà questo utile;) Sto lavorando anche su un editor WYSIWYG Come ho trovato la soluzione accettata non funziona per me quando provo a creare un collegamento da un'immagine selezionata in FF (il getSelection(). GetRangeAt (0) restituisce il div padre dell'immagine e tratta il immagine come mai non c'era (è così che la vedo)), ecco un'idea (ma penso che sia turbo-cross-browser) che mi è venuta in mente (jQuery):

//somewhere before losing the focus: 
sel = window.getSelection().getRangeAt(0); 

//reselecting: 
window.getSelection().addRange(sel); 

//link: 
document.execCommand('createLink', false, 'LINK_TO_CHANGE'); 
$('a[href="LINK_TO_CHANGE"').attr('target', '_blank'); 
//any other attr changes here 
$('a[href="LINK_TO_CHANGE"').attr('href', theRealHref); 

È una buona idea? Funziona come un fascino. E questa semplicità ^^

Problemi correlati