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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сборная солянка-3 (текст под курсором, псевдотеги, коды смайликов, быстрая цитата, BB-code) 
:(
    Опции темы
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   Вверх
Ответ в темуСоздание новой темы Создание опроса
Здесь публикуют скрипты, которые уже проверены в обсуждениях других тем (при этом полезно поставить ссылки на все смежные обсуждения) или переносятся кем-либо из модераторов по просьбе участников, если видно, что в результате обсуждения темы был написан полезный или интересный скрипт. Третий возможный вариант - участник форума публикует скрипт, заведомо известный как полезный и эффективный, для, возможно, небольшой доработки и обсуждения.
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: Наши скрипты | Следующая тема »


 




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


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

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