2016-02-29 26 views
5

Sto costruendo un editor di testo semplice e intuitivo in Javascript, in pratica un editor WYSIWYG. Utilizzerò l'attributo contenteditable nel wrapper principale (.wrapper). Quando premi Invio all'interno di .wrapper, un nuovo elemento <p> con un id univoco viene aggiunto al wrapper.Javascript - Ottieni elementi dietro il caret negli elementi figlio di [contenteditable]

Ho bisogno di un modo per recuperare quale elemento figlio di .wrapper che è attualmente selezionato (vale a dire, essendo messo a fuoco o con l'indicatore di inserimento/testo all'interno di esso).

Ho cercato per giorni senza risultati e ho provato a utilizzare document.elementFromPoint() ma senza risultati corretti.

Quando si utilizza $(":focus"), ottengo l'intero .wrapper e non l'elemento figlio specifico.

Edit:

Esempio HTML struttura:

<div class="container t-wrapper" contenteditable> 
</div> 

Esempio codice Javascript:

$(document).ready(function() { 
    $currentElement = $("[contenteditable]"); 

    $(".t-wrapper").each(function() { 
     var id = generateIdentifier(6); // Ignore this 

     /* This creates the initial <p> child element, where you start typing. */ 
     $(this).html('<p class="t-empty t-first" id="' + id + '"></p>'); 

     $(this).on("mouseup", function() { 
      /* $currentElement = whatever element the caret is inside. */ 
     }); 

     $(this).on("keyup", function() { 
      /* $currentElement = whatever element the caret is inside. */ 
     }); 
    )); 
}); 

Edit 2:

sono riuscito a ge Funziona in modo equo con l'evento mouseup, poiché in realtà stai facendo clic su qualcosa. Ma ho bisogno che funzioni per spostare il cursore usando la tastiera . In alternativa, ho bisogno di un modo per ottenere la posizione del cursore in pixel, e quindi utilizzare document.elementFromPoint() per ottenere l'elemento specifico.

+0

Hai provato a usare contenteditable solo sul nodo selezionato? Ad esempio, puoi impostare il nuovo 'p' a' contenteditable = "true" 'mentre disabilitarlo per tutti gli altri elementi. Durante la navigazione dell'albero dei nodi (clic o tasto freccia) è possibile spostare la proprietà 'contenteditable' sull'elemento successivo. Questo sembra rendere almeno i nodi figli ricercabili con ': focus'. –

+1

un pezzo di codice, per favore? –

+0

@ freestock.tk Aggiunto codice di esempio di base. –

risposta

-1

document.activeElement restituirà l'elemento attualmente attivo.

+1

Questo è come scrivere' $ (": focus") ', questo segna l'intero' .wrapper' poiché questo è l'elemento con l'attributo 'contenteditable' che immagino. –

2

:focus non seleziona i tuoi elementi perché non sono focalizzabili.

È possibile renderli attivabili aggiungendo tabindex="-1" in HTML o in JS.

var generateIdentifier = Math.random; 
 
var currentElement = document.querySelector("[contenteditable]"); 
 
[].forEach.call(document.querySelectorAll(".t-wrapper"), function(el) { 
 
    var first = document.createElement('p'); 
 
    first.className = "t-empty t-first"; 
 
    first.id = generateIdentifier(6); 
 
    first.textContent = 'Press enter to create new paragraphs'; 
 
    first.tabIndex = -1; 
 
    el.appendChild(first); 
 
});
.container > :focus { 
 
    border: 1px solid blue; 
 
}
<div class="container t-wrapper" contenteditable></div>

Sembra che se si aggiunge al primo comma, nuovi paragrafi ottengono automaticamente. Ma se si vuole essere sicuri, penso che si potrebbe ricorrere a un osservatore di mutazione o di un listener di eventi keyup per rilevare paragrafi senza tabindex, e aggiungerlo:

el.addEventListener("keyup", function(e) { 
    var newChild = el.querySelector('p:not([tabindex])'); 
    if(newChild) newChild.tabIndex = -1; 
}); 
+0

Grazie per la risposta! Sarò sicuro di testarlo. Prima hai menzionato 'tabindex =" 1 "', ma nel codice hai specificato l'indice come '-1'. Perché? Errore di battitura? –

+0

@DanielPox intendevo "-1". Quando premi il tasto Tab, il focus passa al prossimo elemento focalizzabile in base al 'tabindex'. 'tabindex = -1' rende un elemento focalizzabile ma non iterable dal tasto tab. Utilizzare un numero positivo se si desidera che sia iterable. – Oriol

+0

Dannazione, Chrome non considera i paragrafi da mettere a fuoco quando ci stai scrivendo, anche se sono focalizzabili. – Oriol