2010-02-10 15 views
6

Mam funkcję, która pobiera zaznaczony tekst, tekst jest wybierany myszą i dodaje go do zmiennej. Chcę dodać znaczniki wokół tej zmiennej w zaznaczonym tekście - w tym akapicie.jQuery zaznacz tekst i dodaj do niego span w akapicie

$("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; 
    } 
} 

mogę zmiennej wyboru tekstu, ale zamiast umieszczania <span></span> wokół zaznaczonego tekstu z ust <p>, moja funkcja zawija to na zewnątrz.

Jak mogę go wymienić w akapicie? Dziękuję.

+3

Zwykle bardzo trudno jest zrobić to, o co prosisz. Czy na pewno nie ma zagnieżdżonych tagów pod akapitem? Jeśli tak, to może być bardzo trudne bez przerywania obecnej architektury. – glmxndr

+0

Pod paragrafem nie powinny znajdować się żadne inne znaczniki oprócz nowo utworzonych przęseł. – Mircea

Odpowiedz

5

To gdzie to idzie źle:

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

Oznacza to jesteś owijania span wokół ust.

Chyba masz na myśli coś takiego:

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

$ spn to jQuery, a nie ciąg znaków. – tvanfosson

+0

Mój tekst zostanie zamieniony na [obiekt obiektu], bez . Czy coś jest nie tak z moją zmienną? – Mircea

+0

działa lepiej, teraz mam: klasa < rozpiętość = „wybrany” > wybrany </span > Rozpiętość nie analizuje rację, ja się > a następnie <> – Mircea

0

Nietestowane, ale powinno działać:

$("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 to jQuery, a nie ciąg. – tvanfosson

+0

Używam tego: $ (dokument) .ready (function() { $ ("p").live ("mouseup", function() { selection = getSelectedText(); if (selection.length> = 3) { var $ spn = $ ("") .html (wybór) .addClass ("wybrane "); $ (this) .html ($ (this) .html(). Replace (selection, $ spn)); } }); Wydaje się, że zgubiłem variabile, wybór w pracach ustęp ale jest ona zastąpiona [object Object] tekst - bez rozpiętości – Mircea

+0

Och, mój zły ... po prostu spojrzał na części zamiennej, mam resztę już pracował . – Daan

0

Chyba trzeba zastąpić tekst w akapicie, nie używać owinąć.

$("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); 
    } 
}); 

Należy pamiętać, że działa to niezawodnie, jeśli akapit zawiera tylko tekst i nie zawiera znaczników.

+0

Nie zadziałałoby to, gdy na przykład wybrałem tekst w kilku tagach. Jeśli p jest tak: '

Niektóre tekst

' i wybierz „OME tex”, metoda nie zastąpi nic. – glmxndr

+0

@subtenante - Wiem - zauważyłem to na końcu odpowiedzi, chociaż mogło by działać, gdyby algorytm wyboru został zmodyfikowany, aby znaleźć pasującą sekcję DOM i wybrać cały html (nie tekst). Dla prostego akapitu zawierającego tylko tekst zadziałałby (raz). – tvanfosson

+0

Tak, właśnie wyjaśniłem powód, dla którego to nie zadziała. :) – glmxndr

1

Zastosowanie .wrapInner() zamiast .wrap()

1

spróbuj przyciąć wybrany fragment i zastąpić podziały wiersza HTML wewnętrzny. To bardzo pomaga:

$('#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)); 
    } 
}); 
Powiązane problemy