теги в выделенном фрагменте
приветствую!!!
у меня задача, обернуть выделенный текст спецтегом но есть проблема, если выделение будет начинаться и заканчиваться внутри какого то тега, тогда надо чтобы открывающийся спецтег устанавливался между тегами в выделенном фрагмента пример::: выделение начинается после "текст2" и заканчивается после "текст6" <p>текст1 <span>текст2 {spec} </span> <p>текст3</p> <p>текст4</p> <p>текст5</p> <span>текст6 {/spec} </span> текст7 </p>вот так вот не надо что бы было надо что бы было так::: <p>текст1 <span>текст2</span> {spec} <p>текст3</p> <p>текст4</p> <p>текст5</p> {/spec} <span>текст6</span> текст7 </p> и по этому поводу вопрос::: как сделать так что бы скрипт обработал текст как во втором примере извините но я не знаю вообще как это сделать так что думаю что вы предложите какой то вариант заранее спасибо:thanks: P.S. теги могут быть абсолютно разными, не обязательно SPAN и P |
Цитата:
|
нужно что бы скрипт срабатывал как в примере 2 и при этом ничего из DOM не надо
просто если получится как в примере 1 то поле отображения такой страницы на экране (всё между тегами {spec} заменяется на другой блок) может получится глюк а HTML структуре страницы так и нужно чтобы была правильная вставка, которая в последствии не будет портить DOM |
забыл написать, обёртывание делаю вот такой функцией:::
(function($) { $.fn.wrapSelected = function(open, close) { return this.each(function() { var textarea = $(this); var value = textarea.val(); var start = textarea[0].selectionStart; var end = textarea[0].selectionEnd; textarea.val( value.substr(0, start) + open + value.substring(start, end) + close + value.substring(end, value.length) ); }); }; })(jQuery); |
вот что выдал этот пример:::
<p>текст1 <span>текст2 </span> {spec} </p><p>текст3</p> <p>текст4</p> <p>текст5</p> <span>текст6 </span> {/spec} текст7 <p></p> перенос сработал отлично почти так как и хотелось, если бы не закрывающий </p> после открывающего {spec} и не открывающий <p> после "текст7" может поможете исправить эту ошибку, я в рег.експах вообще ни фига не понимаю(((( |
извините что непонятно, объяснил, попробую ещё раз:::
нужно чтобы выделенный текст оборачивался неким спец тегом ({spec}и{/spec}), но таким образом что бы открывающий и закрывающий спец теги не находились внутри других тегов, т.е. чтобы они к примеру не резали теги <div>, <p>, <span>, <ul> и т.д. это нужно сделать для того чтобы в последствии обёрнутый участок текста то же был заменён, на некоторый текст (но это уже при отображении самой страницы) в то же время {spec}и{/spec} могут находиться внутри <div>, <p>, <span>, <ul> и т.д. так понятно? |
Цитата:
|
Дзен-трансгуманист,
Туть при данной постановке задачи - рекурсия не слабая - Воть мой предыдущий код <script type="text/javascript" src="http://yandex.st/jquery/1.4.4/jquery.min.js"></script> <div id=div></div> <script type="text/javascript"> var str='\ <div>текст1\n\ <span>текст2\n\ {spec}\n\ </span>\n\ <p>текст3</p>\n\ <p>текст4</p>\n\ <p>текст5</p>\n\ <span>текст6\n\ {/spec}\n\ </span>\n\ текст7\n\ </div>'; alert(str) function Replac(str) { var a = document.getElementById( 'div' ); $(a).append(str); var c=$(a).find("span").each(function() { var b = $(this).html();//alert('b='+b) if(b.indexOf('spec}')!=-1){ //alert(b) b = b.replace(/\s*(\{\/?spec\})\s*/ig,' '); $(this).text(b); $(this).after('\n'+RegExp["$1"]); alert($(a).html()) } }); return $(a).html()} alert(Replac(str)) </script> Вынимал из span и переставлял за ним А тут нужно смотреть оба тега - в одном ли теге - если нет то.... Вдобавок обёртка тегов <p> в теги <p> (в исходной строке) - некоректна - при любой перестановке - Dom нарушается <p - теги абзацев - они не могут перекрывать иные теги абзацов А как получается при обрамлении <p> (а не div, как Выше <script type="text/javascript" src="http://yandex.st/jquery/1.4.4/jquery.min.js"></script> <div id=div></div> <script type="text/javascript"> var str='\ <p>текст1\n\ <span>текст2\n\ {spec}\n\ </span>\n\ <p>текст3</p>\n\ <p>текст4</p>\n\ <p>текст5</p>\n\ <span>текст6\n\ {/spec}\n\ </span>\n\ текст7\n\ </p>'; alert(str) function Replac(str) { var a = document.getElementById( 'div' ); $(a).append(str); var c=$(a).find("span").each(function() { var b = $(this).html();//alert('b='+b) if(b.indexOf('spec}')!=-1){ //alert(b) b = b.replace(/\s*(\{\/?spec\})\s*/ig,' '); $(this).text(b); $(this).after('\n'+RegExp["$1"]); alert($(a).html()) } }); return $(a).html()} alert(Replac(str)) </script>(Причём в Опере и Мозилле - траблы слегка разняться |
Тк
Цитата:
var str='\ <div>текст1\n\ <span>текст2\n\ {spec}\n\ </span>\n\ <p>текст3</p>\n\ <p>текст4</p>\n\ <p>текст5</p>\n\ <span>текст6\n\ {/spec}\n\ </span>\n\ текст7\n\ </div>'; alert(str) function spec( str ){ str = str.split(/\{\/?spec\}/); str[1] = str[1] .replace(/[^<>]+(?=<|$)/g,'') .replace(/<(\w+)[^>]*>[\s\S]*<\/\1>/g,'') split = str[1].search(/<\w+[^>]*>/) return [ str[0] + str[1].substring(0,split), str[1].substring(split) + str[2] ] } result = spec(str); alert(result[0] + '\n{spec}\n{/spec}\n'+result[1]) |
последний пример вот что выдал
<p>текст1 <span>текст2 </span> {spec} {/spec} <span> </span> текст7 </p> исчезли <p> и </p> которые были между {spec} и {/spec} может быть поможет ещё одно пояснение::: эта штука должны срабатывать в редакторе текста в админке сайта и просто оборачивать какой то выделенный фрагмент затем когда страница во фронт енде отображается, то плагин производит подмену текста между спец тегами это получается типа блокировки контента до авторизации пользователя, конечно можно всё сделать и на PHP но тогда потребуется перазгрузка страницы, что не приемлимо хочется чтоб контент разблокировался сразу, без перезагрузки |
ещё пример, в редакторе есть текст:::
<p><strong>Позиционные селекторы</strong><br /> Эти селекторы используются для выборки объектов на основе их положения по отношению к другим элементам, например на основе вложенности или наличия вложенных объектов, порядка следования в очереди (парные, не парные, первый элемент, последний элемент).</p> <p>Выбор первого элемента:<br /> <span style="color: #333399;">$(«li:first»)</span> // здесь выбирается первый элемент <li></p> <p>Выбор последнего элемента:<br /> <span style="color: #333399;">$(«p:last»)</span> // здесь выбирается последний элемент p</p> <p>Выбор каждого второго элемента начиная с 0 (индексация эллементов с нуля):<br /> <span style="color: #333399;">$(«p:even»)</span> // каждый второй параграф начиная с нулевого</p> <p>Выбор каждого второго элемента начиная с первого:<br /> <span style="color: #333399;">$(«.mega-div:odd»)</span> // выбор каждого второго элемента с классом .mega-div начиная с первого (индексация с нуля)</p> после выделения текста (к примеру от "элемент).</p>" и до "<p>Выбор каждого") и нажатия на кнопку добавления моих тегов, в редакторе текст должен выглядеть так::: <p><strong>Позиционные селекторы</strong><br /> Эти селекторы используются для выборки объектов на основе их положения по отношению к другим элементам, например на основе вложенности или наличия вложенных объектов, порядка следования в очереди (парные, не парные, первый элемент, последний элемент).</p> {spec} <p>Выбор первого элемента:<br /> <span style="color: #333399;">$(«li:first»)</span> // здесь выбирается первый элемент <li></p> <p>Выбор последнего элемента:<br /> <span style="color: #333399;">$(«p:last»)</span> // здесь выбирается последний элемент p</p> <p>Выбор каждого второго элемента начиная с 0 (индексация эллементов с нуля):<br /> <span style="color: #333399;">$(«p:even»)</span> // каждый второй параграф начиная с нулевого</p> {/spec} <p>Выбор каждого второго элемента начиная с первого:<br /> <span style="color: #333399;">$(«.mega-div:odd»)</span> // выбор каждого второго элемента с классом .mega-div начиная с первого (индексация с нуля)</p> т.е. получается что скрипт перенёс начло выделения после закрывающегося </p> и перед открывающимся <p>? но не факто что там будут именно "P" там (в редакторе) могут быть и другие теги а когда этот текст уже будет на странице сайта, то он будет выглядить вот так::: <p><strong>Позиционные селекторы</strong><br /> Эти селекторы используются для выборки объектов на основе их положения по отношению к другим элементам, например на основе вложенности или наличия вложенных объектов, порядка следования в очереди (парные, не парные, первый элемент, последний элемент).</p> <div> для разблокировки и просмотра скрытого текста, пожалуйста авторизуйтесь </div> <p>Выбор каждого второго элемента начиная с первого:<br /> <span style="color: #333399;">$(«.mega-div:odd»)</span> // выбор каждого второго элемента с классом .mega-div начиная с первого (индексация с нуля)</p> надеюсь так совсем понятно объяснил)))) |
если уж не получается сделать так как мне нужно, то хотя бы можете дать примерчик, как определить есть ли в выделенном фрагменте не открытые и не закрытые стандартные теги и соответственно поставить после и перед ними мои спец. теги
|
Так вы ничего не меняйте. Пусть люди вставляют {spec} теги как им вздумается, а правьте уже перед выводом(мой скрипт это подразумевал).
И вообще, не надо думать за пользователья - он всё равно сделает по своему.) |
дык как бы хочется чтобы пользователь, вообще сильно не думал
|
woojin,
Собственно идея обрамлений несколько не так сформулированa: Имхо так: 1. Выделенную подстроку считываем и ставим спецВыделения по началу концу выделенной строки и дополнительно и ищем теги и обрамляем все входящие в подстроку теги обратным спецвыделением Пример Выделили: Цитата:
Цитата:
Цитата:
<span style="color:red"> </span> <span style="color:red">Позиционные селекторы</span></strong><span style="color:red"></span><br /> <span style="color:red"> 2 Эти селекторы используются для выборки объектов на основе их положения по отношению к другим элементам, например на основе вложенности или налич</span> |
Цитата:
|
этот
Цитата:
т.к. должно получиться так: Позиционные селекторы</strong>{spec}<br /> 2 Эти селекторы используются для выборки объектов на основе их положения по отношению к другим элементам, например на основе вложенности или налич{/spec} вот в таком варианте будет всё верно)))) |
Цитата:
продвинутый и так поймёт что и куда ставить |
Цитата:
|
woojin,
Имхо - мой вариант правильней - тем паче можно одеть в реальные HTML теги со спец Классом для каждого выделения - тогда считывая теги с данным классом получаем полную последовательную строку |
а вот как у меня написано в 21 сообщении сделать нельзя?
|
woojin,
Мой Вариант имхо правилен и выделено всё -что выделено пользователем! Распарсить и получить строку просто - можно просто одеть выделенное в спец теги с классом ( приналежащим данному Выделению <script type="text/javascript" src="http://yandex.st/jquery/1.4.4/jquery.min.js"></script> <span class="Spec-1">Позиционные селекторы</span></strong><span class="Spec-1"></span><br /> <span class="Spec-1"> 2 Эти селекторы используются для выборки объектов на основе их положения по отношению к другим элементам, например на основе вложенности или налич</span> <script type="text/javascript"> str='' $('span.Spec-1').each(function() { str+=$(this).html() }); alert(str) </script> |
Deff, классно вы работаете.=)
Так и представляю сцену с заказчиком: - Что эта за х*ня, я же сказал, что надо то-то и то-то! - Я считаю, что так правильней. - А так, как написано в тз и неоднократно обсуждено нельзя?! - Мой вариант правильный и ниипёт. =) |
Aetae,
Мну не борется с Вашим Вариантом - Просто я реально подобные задачи делал и считаю, что чел плохо объясняет и не понимает до конца - что ему - нужно... Обычно выделяем в контенте текст курсором, как то помечаем в топике и пересылаем пост с отметками на серв - так вот пометки и обрамления - нужны только на пользователе - а серву нужен выделенный кусок текста и ID соообщения... Соль всего обсуждения - добицо правды и только правды от Автора! (А делать иль не делать - тут не работодатели и надо мной -вообще начальников нет - я сделал - показал - выдали рекомендации, что поправить |
ок, спасибо сейчас попробую)))
|
woojin,
Вы бы описали вкратце задачу - зачем/для чего - если она не секретная - наверняка путь есть короче... в лоб решать долго и не продуктивно |
Deff,
перечитай тред, а? Можжно неоднократно, до полного понимания. Чел всё расписал. |
12 и 13 мои посты
эта штука должны срабатывать в редакторе текста в админке сайта и просто оборачивать какой то выделенный фрагмент затем когда страница во фронт енде отображается, то плагин производит подмену текста между спец тегами это получается типа блокировки контента до авторизации пользователя, конечно можно всё сделать и на PHP но тогда потребуется перазгрузка страницы, что не приемлимо хочется чтоб контент разблокировался сразу, без перезагрузки а в 13 написано как бы это хотелось бы видеть в редакторе, т.к. штука для подмены во фронт енде уже есть, надо только кнопку редактора сделать |
Aetae,
Если Ответы удовлетворяют - он может - не пояснять! ================================================== === Итогового ответа - зачем нет. Цитата:
Цитата:
Как хочет ТС осуществлять блокировку? И как это всё будет выглядить для пользователя? Почему не накрыть выделенный текст (к примеру) прозрачкой ? - Перекрыв доступ |
Потому, что он так хочет?
Я тоже предложил своё видение. Не хочет - не надо. Так как хочет он - сделать можно, но мне уже лень. Смысла усердно настаивать не вижу. Что именно он хочет, он расписал достаточно подробно, а зачем - его личное дело. |
Цитата:
и после разблокировки (к примеру регистрации) этот блокированный текст и так с сервера будет возвращаться аяксом пользователю в браузер а как это всё будет выглядеть на стороне пользователя описано в 13 посте или есть ещё пост 14 |
woojin,
А чем плохо моё предложение - обертывать включенные теги в выделенной подстроке обратным cпец выделением - тогда , по идее всё выделенное пользователем скрыто ? Т.е от начала выделения до первого любого тега - одна скрытая подстрока - после тега - вторая скрытая подстрока - после следующего(и так до конца) N-я скрытая подстрока - скрываете все подстроки в спец тегаx - чем не устраивает ? и разбор прост до офигения (Хотя забил на тему - пофег! Посколь ТС поддержки не вижу |
Цитата:
|
Deff,
да тем плохо что у тебя получатся по два спец тега, а требуется только один (один откр. и один закр.) прочитай 13-й поста, там даже написано как оно выглядеть должно на сайте а если сделать, как у тебя в примере, то тогда получится два раза "для разблокировки зарегистрируйтесь", это не правильный вариант |
Цитата:
|
Некрасиво это, блджад.
|
Aetae,
Поправьте Вашим кодом красиво ! Цитата:
|
Deff,
в общем тогда придётся переписывать логику php скрипта который производит подмену, а она уже работает на УРА |
Цитата:
|
woojin - Ну ждите - любой результ - вряд ли Вас удовлетворит в итоге
Цитата:
|
Часовой пояс GMT +3, время: 03:26. |