2010-02-10 11 views
6

Tengo una función que obtiene el texto seleccionado, el texto se selecciona con el mouse y lo agrega a una variable. Quiero agregar etiquetas alrededor de esa variable en el texto seleccionado, en ese párrafo.jQuery seleccione texto y añádalo en un párrafo

$("p").live("mouseup",function() { 
    selection = getSelectedText(); 
    if(selection.length >= 3) { 
     var $spn = $("<span></span>").html(selection).addClass("selected"); 
     $("p").wrap($spn); 
    } 
}); 

//Grab selected text 
function getSelectedText(){ 
    if(window.getSelection){ 
     return window.getSelection().toString(); 
    } 
    else if(document.getSelection){ 
     return document.getSelection(); 
    } 
    else if(document.selection){ 
     return document.selection.createRange().text; 
    } 
} 

puedo conseguir la variable de selección de texto, pero en lugar de colocar el <span></span> alrededor del texto seleccionado a partir del párrafo <p>, mi función envuelve esta afuera.

¿Cómo puedo reemplazarlo en el párrafo? Gracias.

+3

En general es muy difícil hacer lo que pide. ¿Estás seguro de que no hay etiquetas anidadas debajo del párrafo? Si los hay, puede ser muy difícil hacerlo sin romper la arquitectura actual. – glmxndr

+0

No debe haber ninguna otra etiqueta debajo del párrafo, excepto los tramos recientemente creados. – Mircea

Respuesta

5

Aquí es donde las cosas van mal:

var $spn = $("<span></span>").html(selection).addClass("selected"); 
$("p").wrap($spn); 

Esto significa que está envolviendo el span todo el párrafo.

Creo que te refieres a hacer algo como esto:

var spn = '<span class="selected">' + selection + '</span>'; 
$(this).html($(this).html().replace(selection, spn)); 
+1

$ spn es jQuery, no una cadena. – tvanfosson

+0

Mi texto se reemplaza por [object Object], sin . ¿Hay algo mal con mi variable? – Mircea

+0

funciona mejor, ahora lo entiendo: clase < lapso = "seleccionado" > seleccionado </span > El lapso no analiza bien, me sale > en lugar de <> – Mircea

0

no probado, pero debería funcionar:

$("p").live("mouseup",function() { 
selection = getSelectedText(); 
if(selection.length >= 3) { 
var $spn = $("<span></span>").html(selection).addClass("selected"); 
$(this).html($(this).html().replace(selection, $spn); 
} 
}); 
+0

$ spn es jQuery, no una cadena. – tvanfosson

+0

Yo uso esto: $ (document) .ready (function() { $ ("p").vivir ("mouseup", function() { selección = getSelectedText(); si (selection.length> = 3) {var $ spn = $ (" ") .html (selección) .addClass (" seleccionado "); $ (this) .html ($ (this) .html(). Replace (selection, $ spn)); } }); Parece que he perdido mi variabile, la selección en el párrafo funciona pero se reemplaza por el texto [object Object] - sin span – Mircea

+0

Oh, mi mal ... Acabo de examinar la pieza de repuesto, supongo que el resto ya funcionó . – Daan

0

creo que tendrá que sustituir el texto del párrafo, no utilizar envolver.

$("p").live("mouseup",function() { 
    selection = getSelectedText(); 
    if(selection.length >= 3) { 
     var spn = "<span class='selected'>" + selection + "</span>"); 
     var html = $(this).html().replace(selection,spn); 
     $(this).html(html); 
    } 
}); 

Tenga en cuenta que esto solo funcionará de forma fiable si el párrafo solo contiene texto y no contiene marcas.

+0

Esto no funcionaría si, por ejemplo, seleccioné el texto entre varias etiquetas. Si el p es así: '

Algunos texto

' y selecciono 'ome tex', su método no reemplazará nada. – glmxndr

+0

@subtenante - Lo sé - Anoté esto al final de la respuesta, aunque podría funcionar si el algoritmo de selección se modificó para encontrar la sección coincidente del DOM y seleccionar todo el html (no el texto). Para un párrafo simple que contenga solo texto, funcionaría (una vez). – tvanfosson

+0

Sí, expliqué el motivo por el que no funcionaría. :) – glmxndr

1

Uso .wrapInner() en lugar de .wrap()

1

Trate de recortar la selección y sustituyen a los saltos de línea HTML-interno. Esto ayuda mucho:

$('#tweet_contents').live("mouseup",function() { 
    selection = getSelectedText().replace(/^\s+|\s+$/g,""); 

    if(selection.length >= 4) { 
     var spn = '<span id=\"selected\" class=\"polarite\" selcount=\"'+selcounter+'\" >'+selection+'<span id=\"superscript\">'+selcounter+'<\/span>'+'<\/span>'; 

    $(this).html($(this).html().replace(/(\r\n|\n|\r)/gm," ").replace(selection, spn)); 
    } 
}); 
Cuestiones relacionadas