Модераторы: Sardar, Aliance

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сборная солянка-3 (текст под курсором, псевдотеги, коды смайликов, быстрая цитата, BB-code) 
:(
    Опции темы
12345c
Дата 6.8.2006, 00:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Круглый
****


Профиль
Группа: Vingrad developer
Сообщений: 2018
Регистрация: 26.12.2005
Где: наша не пропадала ?

Репутация: 2
Всего: 101



Функция работает в IE6, FF1.07, NN8.1, Opera8.01, 9.01 (частично Opera 7.54, в том числе быстрая цитата). Все названные функции обычно требуются вместе, поэтому сделаны с общим корнем и разными входами. Добавлена функция insTagSel ("B+,I+") с сохранением выделения ранее выделенного участка, которая может быть полезна при каскадном выделении тегами.

Пример позволяет проверить работу вставки кодов как в textarea, так и в input. Переключение - чекбоксом. Адрес демонстрации - http://js2.ru/example/JsPrimeryCode-90.htm
Код
<body> <!--Описание-->
<h4 style=margin:2px>Вставка тегов, кодов рисунков, цитат. Правила действий:</h4>
<li>Если нет курсора в поле или старый браузер, теги ставятся в конец; если есть
  (или был для не-IE), теги - в точку курсора, а курсор - между тегами (функция insTag(тег)),
  в конец одиночного тега (insPic(тег)) или на место аргумента тега (insTagArg).
<li>Выделение обрамляется тегами или ставится на место аргумента. Одиночный тег -
  в конец выделения. Курсор - после тега, но для функции insTagSel выделение сохраняется.
<li>Вызовы функций вставки тегов - по клику на кнопке, как в примере ниже.
<li>Кнопки привязаны к целевому полю ввода в переменной insField.
<li>функция цитаты insCapt(тег) копирует любое выделение в документе в позицию
  курсора и обрамляет тегами.
<li>Функция обращения к автору insTag('B','Автор') вставляет заданное имя, обрамлённое тегом, после курсора, но до выделения, если оно есть.
<li>Проверено в IE6,NN8.1,FF1.07,Op7.54,Op8.01,Op9.01.<br>
<!--Externals: d,brkL,brkR,insPic(),insTag(),insTagArg(), insBack(),insCapt(),insField,insTagSel(),insBeg, defa,selted.-->

Код
<script>/* Обрамление тегами BB-code, текст под курсором, коды смайликов, захват выделения (быстрая цитата).
Author: 12345с, isvetlov/at/hotmail_com */
brkL="[";brkR="]";selted='';
function insPic(s1,s2,s3){if(!d.all&&selted==''&&s3==3){s1=s2;s2=brkL+'/'+s2+brkR;s3='';}
if(s3==3){s1+=s2;s2='';}
s1=brkL+s1+(s2==brkR?'=':brkR); //'' or '[b='
if(s3==2){s1+=s2;s2='';}
var isPic=s2==null;  //insert picture: cursor to end
var s=insField.value;var insPosL,insPosR;
var scrl=insField.scrollTop;
if(insField.selectionEnd==null){var ch=0;
    if(d.selection&&d.selection.createRange)
      {var tR=d.selection.createRange();var ch='character';var tR1=d.body.createTextRange();}
  if(!ch||tR.parentElement&&tR.parentElement()!=insField){insPosL=insPosR=s.length;}
  else{    insPosL=tR.text.length;
    if(insField.type=='textarea'){tR1.moveToElementText(insField);
      tR.setEndPoint('StartToStart',tR1);insPosR=tR.text.length;
    }else{tR.moveStart('textedit',-1);insPosR=tR.text.length;}
    insPosL=insPosR-insPosL;  //-чрезвычайно хитрое поведение textRange в textarea
}}else{  insPosL=insField.selectionStart;  insPosR=insField.selectionEnd;
  if(insBeg&&self.opera&&!insPosL&&!insPosR){insPosL=insPosR=s.length;insBeg=0;}
}var insText=s.substring(insPosL,insPosR);
if((isInSel=selted==insText)&&s3==3){isInSel=insText.length;insText='';}
if(d.all)insField.defaultValue=s;else defa=s;
if(isPic&&!(s3==2&&insText!='')){s2=s1;s1='';} //for addressing&picture code
insField.value=s.substring(0,insPosL)+s1+insText+s2+s.substring(insPosR,s.length);
if(isInSel&&s3==3)insPosR-=isInSel;
var insCursor=insPosR+s1.length+(isPic||insPosL!=insPosR?s2.length:0);
/*for selectional cursor*/var insCursorL=insCursor;
if(s3==1){insCursorL=insPosL+s1.length;insCursor=s1.length+insPosR;}//end "for"
var a1=s.substr(0,s3!=3?insPosR:insPosR+isInSel).match(/\r\n/g);
if(d.body.createTextRange){setTimeout("var t=insField.createTextRange();t.collapse();t.moveEnd('"
  +ch+"',"+(insCursor-(a1?a1.length:0))+");t.moveStart('"+ch+"',"
  +(insCursorL-((a1=s3!=3?s.substr(0,s3==1?insPosL:insPosR).match(/\r\n/g):a1)?a1.length:0))
  +");t.select();",1); //-ещё более хитрые поправки последующего выделения текста в IE
}else{  if(d.all)insField.focus();
  if(insField.selectionEnd!=null){
    insField.selectionStart=insCursorL;insField.selectionEnd=insCursor+(d.all?1:0);
    setTimeout("insField.focus();if(d.all)insField.selectionEnd--",50);
      //задержки нужны для нормальной визуализации курсора (обход багов)
  if(d.all){var tR=d.selection.createRange();
    if(insCursorL==insCursor)tR.collapse();tR.select();}
  else if(scrl>0)insField.scrollTop=scrl;
}}}
function insTag(s,c){insPic(s,(c?c:'')+brkL+'/'+s+brkR+(c?', ':''),c?2:null);}   //'b','
' | 'c[/b], '
function insTagSel(s){insPic(s,brkL+'/'+s+brkR,1);}   //'b','[/b]',1
function insTagArg(s){insPic(s,brkR);}  //'b',']'
function insBack(){with(insField)
  {var s=d.all?value:defa;value=d.all?defaultValue:defa;if(d.all)defaultValue=s;else defa=s;}}
d=document;
/*для цитаты*/d.onmouseup=function(){if(self.opera)str=d.getSelection();}
  //--for selection capture in old Opera (>7,<8) only
function insCapt(s){insPic(s+brkR
  +(selted=(d.getSelection?(self.str?str:(d.all?(d.getSelection()
    ?d.getSelection():d.selection.createRange().text):getSelection()))
    :(d.selection?d.selection.createRange().text:'')))
  +brkL+'/',s,3);}  //'b]selection[/',b,3 /*конец функций для цитаты*/
onload=function(){insField=d.getElementById('t1');insBeg=1;}
</script>

Код
   <!--Пример использования-->
<textarea id=t1 cols=100 rows=35 wrap=physical>12345</textarea><br>
<input type=checkbox
  onclick=insField=this.checked?d.getElementById('t2'):d.getElementById('t1');
  title="переключение полей ввода">
<input id=t2 value=12345 size=110><br>
<style>span{border:1px solid gray;padding:0 4px}</style>
<span onmousedown=insTag('testTag')>TestTag</span>
<span onmousedown=insTagArg('URL')>URL</span>
<span onmousedown=insPic('smile')>Pic-smile</span>
<span onmousedown=insCapt('quote');return!1>Fast quote</span>
<span onclick=insBack()>Back</span> &nbsp;
<span onmousedown=insTagSel('B') title="с сохранением выделения">B+</span>
<span onmousedown=insTagSel('I')><i title="с сохранением выделения">I+</i></span><br>
<span onmousedown=insTag('B','Автор')>Автор!</span><br>
(Some text for quote)

Замечены 2 желательных улучшения (оба - для IE).
1)  Есть тонкое различие в несфокусированных полях ввода - в которых нет фокуса и в которых его нет, но есть по умолчанию. В первом случае позиция курсора принята в конце текста, а во втором она оказывается в начале. После перезапуска страницы это наблюдается во всех не-Gecko-браузерах, во время работы - только в IE, потому что он не сохраняет позицию курсора и выделения при потере фокуса. В начале работы курсор надо ставить в конец текста, если по умолчанию в поле есть текст. Для Оперы в скрипте сделана правка начальной позиции, для IE она не имеет смысла, если не выполнено запоминание позиции курсора.
2) IE, чтобы быть похожим на всех, требует программной поддержки сохранения позиций выделения при потере фокуса. Это поможет, например, выйти из поля ввода, выделить текст в другом месте и сделать быструю цитату. Сейчас с этой функцией легко справляются остальные бр-ры. В них можно сохранить выделение или положение курсора, возвращаясь в поле ввода комбинацией "правый клик;Esc".

Интересна необходимость применения setTimeout при установлении курсора в поле ввода (строки 26, 31).
20.08 - поправлена функция цитирования так, чтобы правильно понималось выделение в рабочем поле ввода (insField). FF не понимает выделение в других полях ввода (он этого никогда не умел).

Это сообщение отредактировал(а) 12345c - 3.3.2008, 12:39


--------------------
Google Code Playground - онлайн-отладка своих примеров HTML+JS без регистрации, с сохранением по URL, без кириллицы. Go
PM WWW   Вверх
12345c
Дата 6.8.2006, 01:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Круглый
****


Профиль
Группа: Vingrad developer
Сообщений: 2018
Регистрация: 26.12.2005
Где: наша не пропадала ?

Репутация: 2
Всего: 101



Ссылки на другие похожие темы:
index.php?showtopic=35775 - функция (Sardar) вставки BB-кодов;
index.php?showtopic=94640 - другие 2 варианта;
index.php?showtopic=55935 - 3-й вариант (автор Black);
index.php?showtopic=75913 - 4-й;
index.php?showtopic=76915 - 5-й;
index.php?showtopic=71824 - ссылка;
index.php?showtopic=69531 - вставка смайлов
index.php?showtopic=54474 - вставка кода картинки (нет скрипта);
index.php?showtopic=30107 - ссылки на древние решения;
index.php?showtopic=24028 - для IE;
index.php?showtopic=18322 - для IE;
PM WWW   Вверх
12345c
Дата 18.8.2006, 04:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Круглый
****


Профиль
Группа: Vingrad developer
Сообщений: 2018
Регистрация: 26.12.2005
Где: наша не пропадала ?

Репутация: 2
Всего: 101



Добавлена в исходный код 1-го сообщения функция обращения к автору (кнопка "Автор!") - insTag('тег','имя_автора'), вставляет после курсора, но перед выделением. Такая кнопка нужна в форумах для быстрого копирования имени автора в поле. (Есть мысль, что её можно выполнять как выделение имени автора с последующим кликом по кнопке типа "Быстрая цитата" -  интуитивно понятно, но непривычно.)

В Гекко обнаружено, что на более сложной странице, чем демонстрационная, возникают сильные глюки поля ввода по причине резервного копирования текста в defaultValue. Пришлось отказаться и ввести переменную defa.

(Код скрипта в первом посте и в демо-примере исправлен.)

В Опере 9.01 открылся свежий баг, связанный с невыполнением "Back" в поле INPUT. Не исправлял. Посмотрим, что будет с ней в следующих версиях.

Не совсем корректно работает "Цитата", если выделение - в поле ввода. Функция цитирует выделение, вместо того, чтобы, интуитивно, обрамить выделение тегами. Не изменял, так как требует глубокой переработки функции (выделение сложной процедуры обнаружения места выделения), а цитирование не обязательно востребовано.

Остаётся пожеланием сделать поведение выделения в IE, как в FF/Опере - чтобы не терялось при потере фокуса.

Интересно, а что, если клик кнопки при внешнем выделении тоже будет что-то значить? Копирование выделенного в поле ввода с обрамлением тегами. Практически, то же, что цитата. Особо полезно было бы для ссылок, но в ссылке надо ещё вытащить УРЛ, что сильно усложняет скрипт. Не просто брать выделение, а проверять, нет ли пересечения со ссылкой.
PM WWW   Вверх
12345c
Дата 19.8.2006, 23:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Круглый
****


Профиль
Группа: Vingrad developer
Сообщений: 2018
Регистрация: 26.12.2005
Где: наша не пропадала ?

Репутация: 2
Всего: 101



Решил проблему с "Цитатой", если выделение в поле ввода. Оказывается, решается просто, без переработки алгоритма. Если выделенный в поле ввода текст совпал с "выделенным вообще, по .getSelection()", то обрамляем этот текст тегом цитаты. Иначе дописываем цитату после курсора.
=============================
Кто подскажет, что за странный баг в Gecko, появляющийся в текущей версии примера? Появляется только при такой комбинации:

1) выделить участок в  textarea;
2) выделить участок в INPUT;
3) чекбокс выключен, т.е. рабочая область - textarea ;
4) когда выделение на Input-е, кликаем по "Fast quote".

Вылетает на функции (textarea).focus() такая ошибка (FF!.07, NN8.1):

Цитата
Error: [Exception... "'Permission denied to get property XULElement.selectedIndex' when calling method: [nsIAutoCompletePopup::selectedIndex]"  nsresult: "0x8057001e (NS_ERROR_XPC_JS_THREW_STRING)"  location: "JS frame :: file:///C:/B/javascript/example/JsPrimeryCode-90.htm :: <TOP_LEVEL> :: line 43"  data: no]
Source File: file:///C:/B/javascript/example/JsPrimeryCode-90.htm
Line: 43

Line 43:
Код
    setTimeout("insField.focus();",111);

Задержка не влияет - если бы не в 40-й строке 
Код
if(d.all)insField.focus();
, ошибка вылетала бы и здесь. При http-адресе ошибка та же.
============================
Ответ от Sardar-a:
Цитата
Это баг: https://bugzilla.mozilla.org/show_bug.cgi?id=236791
Его пофиксили, но похожие появляються вновь и вновь, например: https://bugzilla.mozilla.org/show_bug.cgi?id=261423 - все завязанны на кривом ACL.


Это сообщение отредактировал(а) 12345c - 21.8.2006, 16:39
PM WWW   Вверх
F13
Дата 30.8.2006, 23:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 30.8.2006

Репутация: нет
Всего: нет



12345c, мне очень понравился скрипт, но есть один небольшой ляп - при вставке автора в поле ввода скобка вместе с курсором перескакивает в конец:
Код

[BДима[/B], ]
[BВася[/B], ]
[BПетя[/B], ]

Помогите исправить эту досадную ошибку...

P.S. Кстати, в демонстрашке такая же ерунда... smile 

Это сообщение отредактировал(а) F13 - 30.8.2006, 23:13
PM MAIL   Вверх
12345c
Дата 31.8.2006, 02:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Круглый
****


Профиль
Группа: Vingrad developer
Сообщений: 2018
Регистрация: 26.12.2005
Где: наша не пропадала ?

Репутация: 2
Всего: 101



Исправил (в демо и в коде первого сообщения), спасибо за подсказку.
PM WWW   Вверх
F13
Дата 31.8.2006, 23:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 30.8.2006

Репутация: нет
Всего: нет



12345c, спасибо за отклик - все работает... smile 

Есть пожелания:
  • Добавить закрывающий тэг для URL => [/url]
  • Добавить в цитату НИК цитируемого автора => [quote = "Steeler"] ...Текст... [/quote]
  • Чтобы при клике на "Быструю цитату", без выделения текста на странице, в поле ввода пустые тэги не вставлялись(как у вас на этом форуме)...
Возможно это реализовать? Если ДА, то буду весьма признателен...Больше и желать нечего... smile 

Это сообщение отредактировал(а) F13 - 1.9.2006, 00:03
PM MAIL   Вверх
12345c
Дата 1.9.2006, 13:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Круглый
****


Профиль
Группа: Vingrad developer
Сообщений: 2018
Регистрация: 26.12.2005
Где: наша не пропадала ?

Репутация: 2
Всего: 101



1) уже реализовано - достаточно написать insTag('URL');
2) это сильно зависит от структуры страницы, от того, где расположен в коде HTML ник цитируемого автора. Можно разве что подробно описать методику того, как написать доступ к нику автора (и дате сообщения). Если кратко, то создаёте на выделении TextRange (для FF что-то иное), рекурсивно проходите по узлам нод в поиске строки таблицы, например, с классом message (если сообщение лежит в <tr class=message>). Затем спускаетесь по дереву нод в то место, где у Вас дата и автор и достаёте их. Если такой класс не найден, выделение было вне сообщения. (Всё это делать в insCapt(), но для Оперы, может быть, раньше. )
3)  я это сделал как более содержательное действие - ставите пустые скобки цитаты, потом вписываете цитату. Но если надо не ставить - нет проблем, переписываете
Код
function insCapt(s){
selted=d.getSelection?(self.str?str:(d.all?(d.getSelection()
    ?d.getSelection():d.selection.createRange().text):getSelection()))
    :(d.selection?d.selection.createRange().text:'');
if(selted!='')insPic(s+brkR+selted+brkL+'/',s,3);}

PM WWW   Вверх
F13
Дата 4.9.2006, 12:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 30.8.2006

Репутация: нет
Всего: нет



Цитата(12345c @  1.9.2006,  13:18 Найти цитируемый пост)
1) уже реализовано - достаточно написать insTag('URL');
 Нет, это все ясно, я имею в виду именно закрывашку для тэга со знаком равенства: [url=(здесь курсор)] [/url], а не просто [url] [/url] smile 

Получится такое? smile 
PM MAIL   Вверх
12345c
Дата 4.9.2006, 14:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Круглый
****


Профиль
Группа: Vingrad developer
Сообщений: 2018
Регистрация: 26.12.2005
Где: наша не пропадала ?

Репутация: 2
Всего: 101



Заменяете строчку function insTagArg(s){insPic(s,brkR);}  //'b',']' на
Код
function insTagArg(s){insPic(s,brkR+brkL+'/'+s+brkR);}  //'b','][/b]'

и строчку s1=brkL+s1+(s2==brkR?'=':brkR); //'[b]' or '[b=' на
Код
s1=brkL+s1+(s2==brkR+brkL+'/'+s1+brkR?'=':brkR); //'[b]' or '[b='
Правда, он при выделенном участке ставит курсор в конец тегов, а не в промежуток между ними. Если ещё немного похимичить - запомнить режим, а при установке курсора вспомнить про него - курсор будет попадать в промежуток. Но, мне кажется, чаще бывает, что выделяют текст, а потом вставляют адрес на место курсора. Т.е. лучше сделать так:

Был текст: "Смотреть здесь" (слово "здесь" выделено по selection)
После клика: "Смотреть [URL=[курсор]]здесь[/URL]"

А в случае невыделенного участка или если курсора нет - так, как Вы сказали.
PM WWW   Вверх
F13
Дата 5.9.2006, 00:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 30.8.2006

Репутация: нет
Всего: нет



12345c, спасибо огромное за подсказку... smile 
PM MAIL   Вверх
12345c
Дата 13.10.2006, 04:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Круглый
****


Профиль
Группа: Vingrad developer
Сообщений: 2018
Регистрация: 26.12.2005
Где: наша не пропадала ?

Репутация: 2
Всего: 101



Сделаны 2 поправки функций скрипта, одна из который существенна, и отмечена одна особенность в IE, устранение которой привело бы к заметному увеличению кода - на 600-800 байт, поэтому оставлена как есть.

1) Поправка в IE для многострочных выделений. Было выставление курсора или выделения после операции - со сдвигом, зависящим от числа переносов строк от начала текста. 
2) В FF было перескакивание на начало прокрутки длинного текста поля ввода, теперь положение прокрутки сохраняется. 
3) Ообенность: IE по-прежнему игнорирует завершающие пустые переносы строк в выделении, но на удобстве пользования это не сказывается.  Из области выделения они исключаются, но обычно они несущественны.

Скрипт исправлен в первом сообщении темы (добавлено около 200 байт кода).
PM WWW   Вверх
Nikname
Дата 16.10.2006, 14:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 12.5.2006
Где: Санкт-Петербург

Репутация: нет
Всего: нет



Еще один вариант (работает под Mozilla & IE под другими не проверял):
Код

<script language='JavaScript1.1' type='text/javascript'>
<!--
  function tag(text1, text2)
  {
     if ((document.selection))
     {
       document.form.message.focus();
       document.form.document.selection.createRange().text = text1+document.form.document.selection.createRange().text+text2;
     } //else document.form.message.value += text1+text2;
     else {
      text = document.form.message.value.substring(document.form.message.selectionStart,document.form.message.selectionEnd);
      pre=document.form.message.value.substring(0,document.form.message.selectionStart);
      post=document.form.message.value.substring(document.form.message.selectionEnd);
      document.form.message.value=pre+text1+text+text2+post;
     }
  }
}
//-->
</script>
Жирный: <a href=# onClick="javascript:tag('[b]', '[/b]'); return false;" >[b][/b]</a><br>
Наклонный: <a href=# onClick="javascript:tag('[i]', '[/i]'); return false;">[i][/i]</a><br>



Это сообщение отредактировал(а) Nikname - 16.10.2006, 14:18
PM MAIL   Вверх
Wheels
Дата 1.2.2007, 18:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 64
Регистрация: 1.2.2007

Репутация: нет
Всего: 1



Приветствую. Не могу зарегистрироваться на форуме у автора, поэтому пишу сюда. Такой вопрос по данному скрипту:

1) Правильно ли я внес изменения в код для небольшого усовершенствования функции с цитатой?
Код
function insCapt(s,w){insPic(s+'='+w+brkR

<SPAN onmousedown="insCapt('quote','$name');return!1">Fast quote</SPAN>


2) И такой вопрос - я попробовал задать новую функцию для вставки тегов типа [параметр1=параметр2]обрамленный текст[/параметр1] с помощью выпадающего списка <select>, но, вероятно, я делаю что-то неправильно. Не хочет работать оно (.
Код
function insTagArgw(s,c,w){insPic(s+'='+w,(c?c:'')+brkL+'/'+s+brkR+(c?', ':''),c?2:null);}   //'b','[/b]' | 'c[/b], ' 

<SELECT onchange=TagArgw('SIZE','',this.options[selectedIndex].value);this.selectedIndex=0;>
<OPTION value="+1">+1</OPTION>
<OPTION value=nosize selected>Размер</OPTION>
<OPTION value="-1">-1</OPTION>
</SELECT>

Почему?

Заранее благодарен.
PM MAIL ICQ   Вверх
Wheels
Дата 1.2.2007, 19:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 64
Регистрация: 1.2.2007

Репутация: нет
Всего: 1



Оказывается название функции было неправильным ) Получилось:

Код

function insTagArgw(s,c,w){insPic(s+'='+w,(c?c:'')+brkL+'/'+s+brkR+(c?', ':''),c?2:null);}   //'b','[/b]' | 'c[/b], '

<SELECT name="SIZE" onchange="insTagArgw(this.name, '', this.options[selectedIndex].value);this.selectedIndex=0;">
<OPTION value="+3">+3</OPTION>
<OPTION value="+2">+2</OPTION>
<OPTION value="+1">+1</OPTION>
<OPTION value=nosize selected>Размер</OPTION>
<OPTION value="-1">-1</OPTION>
<OPTION value="-2">-2</OPTION>
<OPTION value="-3">-3</OPTION>
</SELECT>


Грамотно ли это?

И такое изменение будет ли грамотным?
Код
function insCapt(s,w){insPic(s+'='+w+brkR

<SPAN onmousedown="insCapt('quote','$name');return!1">Fast quote</SPAN>

PM MAIL ICQ   Вверх
12345c
Дата 4.2.2007, 11:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Круглый
****


Профиль
Группа: Vingrad developer
Сообщений: 2018
Регистрация: 26.12.2005
Где: наша не пропадала ?

Репутация: 2
Всего: 101



Доступ к форуму исправил (провайдер переносил сайт на другой сервер).

По изменениям: вообще-то грамотно всё, что работает. Глядя на приведённые примеры, приходится догадываться, для чего они. Если $name идёт из PHP, то, вероятно, Вы хотите поставить имя пользователя, читателя страницы. Если это нужно, то лучше в другом месте скрипта, в более позднем. Если предположить более логично, что Вы хотите имя автора текста вставить в цитату, то делается это заметно сложнее, но вполне выполнимо (на словах описано где-то выше в теме). Ищется в структуре документа место в сообщении, где написан автор (и дата), и копируется в цитату. Это, понятно, надо делать в insCapt(s), пока существует выделение, указывающее на сообщение, в котором оно находится. Используются функции parentNode, чтобы найти ячейку сообщения по его классу, затем childNodes.

...Вообще-то нет, селекция есть нода документа а не ячейки с сообщением. Надо другим методом искать. Сейчас неохота заморачиваться таким вопросом, может, кто-то другой подскажет.

Это сообщение отредактировал(а) 12345c - 4.2.2007, 12:13
PM WWW   Вверх
Centuriones
Дата 2.4.2007, 21:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 2.4.2007

Репутация: нет
Всего: нет



Цитата(12345c @  13.10.2006,  04:38 Найти цитируемый пост)
2) В FF было перескакивание на начало прокрутки длинного текста поля ввода, теперь положение прокрутки сохраняется. 


Почти аналогичное существует и в IE 6 - в случае, когда размер выделенного текста превосходит размер текстовой области, то вставка тегов "с сохранением выделения" приводит к тому, что происходит прокрутка текста к открывающему тегу. При этом выделение сохраняется и дальнейшая вставка работает корректно. Курсор при этом находится "внизу" выделенного текста.  Если далее применить вставку тегов "без сохранения выделения", то происходит вставка тега и прокрутка "вниз" до положения курсора.

В FF 2.0.0.3 и Opera 9.10 подобной проблемы просто не существует. Существует ли какая-нибудь возможность исправления этого бага с IE?

P.S. Извините, что приходится писать про это здесь, а не на вашем форуме, но к сожалению отправка сообщений там не работает, несмотря на то, что я зарегистрировался на сайте.
А сам скрипт по своей функциональности просто прекрасный (даже с учетом бага с IE), так что за его создание - большое спасибо!

PM MAIL WWW   Вверх
12345c
Дата 3.4.2007, 19:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Круглый
****


Профиль
Группа: Vingrad developer
Сообщений: 2018
Регистрация: 26.12.2005
Где: наша не пропадала ?

Репутация: 2
Всего: 101



Этот случай не рассматривал, с выделением в IE больше области, посмотрю, что с ним сделать. Вообще-то, то, как Вы описали, корректно для логики IE - он прокручивает поле так, чтобы был виден курсор. И для дальнейшего ввода важно видеть его. Может быть, так и нужно оставить?

На форуме том какие-то непонятности с поведением прав доступа, нужно форум и скрипт другой ставить.
PM WWW   Вверх
Centuriones
Дата 3.4.2007, 23:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 2.4.2007

Репутация: нет
Всего: нет



Так дело в том, что мы курсор не видим в IE в случае длинных выделений. Он "где-то внизу" за границами текствой области, там же, где и закрывающий тег.  Т.е. тоже самое, что было в FF, только в FF происходила прокрутка до начала текста, а в IE она происходит до начала вставленного открывающего тега (это все в режиме "с сохранением выделения").
Вот тут - иллюстрации:
1 - выделение до вставки http://neocrome.ru/datas/users/77-ie6_1.gif
2 - прокрутка выделенной области после вставки тега - http://neocrome.ru/datas/users/77-ie6_2.gif


Это сообщение отредактировал(а) Centuriones - 4.4.2007, 00:14
PM MAIL WWW   Вверх
12345c
Дата 4.4.2007, 13:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Круглый
****


Профиль
Группа: Vingrad developer
Сообщений: 2018
Регистрация: 26.12.2005
Где: наша не пропадала ?

Репутация: 2
Всего: 101



Так логику IE понять можно - выделение считается курсором ненулевой длины. Начало курсора - начало выделения. Так как есть правило - делать видимым мигающий курсор после операции, возникает вопрос, что считать курсором. Решили, что начало выделения должно попадать в видимую область.

Но, допустим, что это надо обойти. Используем тот же insField.scrollTop для того, чтобы прокрутка осталась на месте. Вставить восстановление прокрутки, с учётом всяких хитростей браузеров, надо здесь (в setTimeout):

было - 
Код
if(d.body.createTextRange){setTimeout("var t=insField.createTextRange();t.collapse();t.moveEnd('"
  +ch+"',"+(insCursor-(a1?a1.length:0))+");t.moveStart('"+ch+"',"
  +(insCursorL-((a1=s3!=3?s.substr(0,s3==1?insPosL:insPosR).match(/\r\n/g):a1)?a1.length:0))
  +");t.select();",1); //-ещё более хитрые поправки последующего выделения текста в IE
}else{...

; делаем - 
Код
if(d.body.createTextRange){setTimeout("var t=insField.createTextRange();t.collapse();t.moveEnd('"
  +ch+"',"+(insCursor-(a1?a1.length:0))+");t.moveStart('"+ch+"',"
  +(insCursorL-((a1=s3!=3?s.substr(0,s3==1?insPosL:insPosR).match(/\r\n/g):a1)?a1.length:0))
  +");t.select();if(scrl>0)insField.scrollTop=scrl;",1); //-ещё более хитрые поправки последующего выделения текста в IE
}else{...

И, соответственно, переменную scrl делаем глобальной:

было - 
Код

var scrl=insField.scrollTop;

; делаем - 
Код

scrl=insField.scrollTop;


Ещё надо заметить, что в скрипте остался баг, присущий IE, относящийся к выделению последних переносов строки. Но его обход требует 1.5 КБа кода, и потому он имеется во всех (существующих в природе) скриптах вставки ББ-кодов. Я тоже не стал его исправлять, хотя решение его (функция) на форуме есть ( http://forum.vingrad.ru/topic-115734.html ). (Её прикрутить - неочевидное дело, но возможное.)
PM WWW   Вверх
F13
Дата 20.4.2010, 02:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 30.8.2006

Репутация: нет
Всего: нет



12345c, подскажите, пожалуйста, как убрать скобки у смайлика, чтобы вставлялся код :smile: а не [:smile:]?
Т.е. по бокам скобки лишние, ведь в основном код смайла всегда имеет по бокам только двоеточие... smile

Это сообщение отредактировал(а) F13 - 20.4.2010, 22:48
PM MAIL   Вверх
12345c
Дата 1.5.2010, 16:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Круглый
****


Профиль
Группа: Vingrad developer
Сообщений: 2018
Регистрация: 26.12.2005
Где: наша не пропадала ?

Репутация: 2
Всего: 101



F13, просто напишите свою функцию, заменяющую insPic (она там со строки 4 в первом сообщении) и вместо скобок brkL, brkR ставьте свои.
Код

function insPic(s1,s2,s3,brkL,brkR){
if(brkL==null)brkL='[';
if(brkR==null)brkR=']';
далее по тексту

Тогда смайл вызывается по insPic('smileText', null, null, ':','') или сделайте более короткую оболочку вызова вместо этой: smle=function(s){insPic(s, null, null, ':','')} .

Заодно, проверил работу в браузерах: FF3.6, IE8, Opera 10.51, Opera 10.1 - работает. Баг с пустыми Enter в конце для IE8 сохранился. (Возможно, часть специфического кода для багов Оперы 8-9 и FF1.07 уже не нужна, но остаётся как дополнительный бонус.)




--------------------
Google Code Playground - онлайн-отладка своих примеров HTML+JS без регистрации, с сохранением по URL, без кириллицы. Go
PM WWW   Вверх
F13
Дата 4.5.2010, 02:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 30.8.2006

Репутация: нет
Всего: нет



12345c, спасибо большое, работает! smile 
Единственное не вкурил, как это должно работать:
Цитата(12345c @  1.5.2010,  16:55 Найти цитируемый пост)
smle=function(s){insPic(s, null, null, ':','')}

Скорее всего имелось ввиду создание ещё одной функции, я правильно понял? - function insSmile(s){insPic(s, null, null, ':','')}
По крайней мере так тоже работает: onmousedown="insSmile('кодСмайла')"

Это сообщение отредактировал(а) F13 - 4.5.2010, 02:14
PM MAIL   Вверх
12345c
Дата 8.5.2010, 15:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Круглый
****


Профиль
Группа: Vingrad developer
Сообщений: 2018
Регистрация: 26.12.2005
Где: наша не пропадала ?

Репутация: 2
Всего: 101



F13, после того дополнения кода в insPic (if(brkL==null)brkL='['; if(brkR==null)brkR=']';) 4-й и 5-й параметры - это подмена скобок, заданных по умолчанию в глобальных переменных. Если не пишете этих параметров, ставятся brkL, brkR - квадратные скобки как имена параметров внутри этой функции (insPic). Теперь, если обращаетесь к ней и хотите поменять скобки на одиночное двоеточие слева, вызываем insPic через обёртку 
Код

smle=function(s){insPic(s, null, null, ':','')}
Если надо двоеточия по обеим сторонам, делаем smle2=function(s){insPic(s, null, null, ':',':')} . Все остальные упоминания brkL, brkR вне insPic - это глобальные переменные (квадратные скобки).


--------------------
Google Code Playground - онлайн-отладка своих примеров HTML+JS без регистрации, с сохранением по URL, без кириллицы. Go
PM WWW   Вверх
F13
Дата 8.5.2010, 15:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 30.8.2006

Репутация: нет
Всего: нет



12345c, а в HTML функция будет так вызываться:
Код

onmousedown="smle('кодСмайла')"

Правильно?

Спасибо ещё раз, разобрался... Всё работает прекрасно... smile 
Ваш скрипт - лучший в своём роде... И это факт! smile 

Это сообщение отредактировал(а) F13 - 8.5.2010, 16:17
PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Здесь публикуют скрипты, которые уже проверены в обсуждениях других тем (при этом полезно поставить ссылки на все смежные обсуждения) или переносятся кем-либо из модераторов по просьбе участников, если видно, что в результате обсуждения темы был написан полезный или интересный скрипт. Третий возможный вариант - участник форума публикует скрипт, заведомо известный как полезный и эффективный, для, возможно, небольшой доработки и обсуждения.
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: Наши скрипты | Следующая тема »


 




[ Время генерации скрипта: 0.2143 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.