Войти

Показать полную графическую версию : [решено] Помогите с соединением двух функцией на JavaScript


Igor_I
13-09-2006, 21:31
Вопрос доволно специфичный, не знаю даже реализуемо это. Предисловие довольно длинное :)
Есть вики-движок -DokuWiki. http://wiki.splitbrain.org/wiki:ru:syntax образец страницы. Нажимаем кнопку Edit page и видим тулбар с иконками. результат использования некоторых из них аналогично здешним иконкам - обрамление некоего текста тегами. Функция вставки смайликов работает по другому, щелкаем по кнопке-смайлик, вылезает окошко и уже в нем выбираем смайлик, который потом вставляется в текст. Также в движке реализованна подсветка синтаксиса. http://animesarov.net.ru/wiki:syntax#подсветка синтаксиса, только вот кнопки такой нет. Хочу сделать.
Я так думаю, что все функции тулбара завязанны на этой функции. И мне думается так, что нужно соединить каким-то образом два действия данной функции - format & picker
function initToolbar(tbid,edid,tb){
if(!document.getElementById){ return; }
var toolbar = document.getElementById(tbid);
var cnt = tb.length;
for(var i=0; i<cnt; i++){
// create new button
btn = createToolButton(tb[i]['icon'],
tb[i]['title'],
tb[i]['key']);
// add button action dependend on type

switch(tb[i]['type']){
case 'format':
var sample = tb[i]['title'];
if(tb[i]['sample']){ sample = tb[i]['sample']; }
eval("btn.onclick = function(){insertTags('"+
jsEscape(edid)+"','"+
jsEscape(tb[i]['open'])+"','"+
jsEscape(tb[i]['close'])+"','"+
jsEscape(sample)+
"');return false;}");
toolbar.appendChild(btn);
break;
case 'insert':
eval("btn.onclick = function(){insertAtCarret('"+
jsEscape(edid)+"','"+
jsEscape(tb[i]['insert'])+
"');return false;}");
toolbar.appendChild(btn);
break;
case 'signature':
if(typeof(SIG) != 'undefined' && SIG != ''){
eval("btn.onclick = function(){insertAtCarret('"+
jsEscape(edid)+"','"+
jsEscape(SIG)+
"');return false;}");
toolbar.appendChild(btn); }
break;
case 'picker':
createPicker('picker'+i,
tb[i]['list'],
tb[i]['icobase'],
edid);
eval("btn.onclick = function(){showPicker('picker"+i+
"',this);return false;}");
toolbar.appendChild(btn);
break;
case 'mediapopup':
eval("btn.onclick = function(){window.open('"+
jsEscape(tb[i]['url']+NS)+"','"+
jsEscape(tb[i]['name'])+"','"+
jsEscape(tb[i]['options'])+
"');return false;}");
toolbar.appendChild(btn);
break;
} // end switch
} // end for }

Если есть желание помочь :) уточните , может какие-то моменты упустил по незнанию.

VeshchiyOleg
15-09-2006, 12:53
что-то я не въехал, чего же ты хочешь???
подсветку символа включать или новый тип кнопки???

приведенный кусок кода создает кнопки на тулбаре
а что делает функция showPicker???

Igor_I
16-09-2006, 16:19
а что делает функция showPicker???
Эта функция показывает окошко, со смайликами.
В общем-то получилось где-то наполовину. Тег вставляется, но вот если есть выделенный текст, то он не обрамляется тегами, как надо, а просто стирается. К сожалению негде показать, что получилось.
Функции, мною добавленные, находятся в пркрепленном файле в самом конце файла.

что-то я не въехал, чего же ты хочешь???
подсветку символа включать или новый тип кнопки???
Новый тип кнопки, который вставляет тег
<code css> </code>
А поскольку на месте css может оказаться любое другое слово, то их надо бы выбирать во всплывающем окошке.

Igor_I
16-09-2006, 16:32
Вот, что получилось. Кнопки были найдены :)
На втором скрине результат и кнопки "php" и кнопки побольше.

Prisoner
16-09-2006, 16:44
Т.е. они там заложены были, их только активировать надо было, так?

Igor_I
16-09-2006, 17:00
Нет. Имелось ввиду, что кнопки какие были, такие и запихнул, ну лень было рисовать специально кнопки. :)

VeshchiyOleg
18-09-2006, 18:08
вот это место поподробнее: case 'picker':
createPicker('picker'+i,
tb[i]['list'],
tb[i]['icobase'],
edid);
eval("btn.onclick = function(){showPicker('picker"+i+
"',this);return false;}");
toolbar.appendChild(btn);
break; либо в createPicker либо в showPicker (хотя скорее всего в первом) заполняется то, что будет в окошке - туда и надо список всех слов, которые могут оказаться вместо css (напр. параметр tb[i]['list'])

а вот чтобы текст между тэгами сохранялся... посмотри функцию insertTags
если сможешь, выложи сюда код

Igor_I
18-09-2006, 20:14
Все функции в прикрепленном файле edit.rar. Последние две функции мои, исправленные.
проблема заключается в этом участке кода.

eval("btn.onclick = function(){pickerInsertCode('"+id+"','"+
jsEscape(list[key])+"','"+
jsEscape(edid)+"');return false;}");

При клике по кнопке вызывается функция pickerInsertCode, которая и рисует слова из массива list[key]. Вернее в эту функцию передаются три параметра.
.............

VeshchiyOleg
19-09-2006, 10:00
итак, тебе вместо text="<code "+text+"></code>";
insertAtCarret(edid,text); строка 500
надо использоватьinsertTags(edid,'<code '+text+'>', '</code>', ''); тогда текст внутри тэгов останется (должен остаться)

а что за проблема??? слова не рисуются??? или окошко не показывается???

Igor_I
19-09-2006, 20:18
Спасибо. Держи первое сообщение. :)
Нечто подобное уже делал, но я сначала определял переменные tagclose & tagopen, а потом их уже подставлял. И 4 переменную не убирал - поэтому наверно не работало. А может еще какая мелочь.
А зачем убирать функцию insertAtCarret?
Осталаль проблема, но это уже дело в Опере. Во всплывающем окошке практически нет пробелов, а если их добавляешь, то в ИЕ пробелы получаются большими.
Ладно, это мелочи :)

VeshchiyOleg
20-09-2006, 09:13
зачем убирать функцию insertAtCarret? насколько я понял, ф-я insertAtCarret вставляет указанный тобой текст в позицию курсора, а insertTags обрамляет выделенный текст указанными откр и закр тэгами
т.о. если ничего не выделено, то при помощи insertTags пустоту обрамляем тэгами и получаем результат, схожий с insertAtCarret, с той лишь разницей, что в случае с insertAtCarret курсор находится после текста, а с insertTags между тэгами (это по идее)
а если выделен текст, то insertTags обрамляет текст тэгами, а insertAtCarret заменяет его на предложенный тобой.

в ИЕ пробелы получаются большими попробуй везде использовать обычный (не неразрывный '&nbsp;') пробел до и после текстов ибо любому браузеру пофиг, сколько обычных пробелов будет находиться подряд - отображаться будет только один, а вот если обычные пробелы и неразравные чередуются, то в разных браузерах выглядит по-разному




© OSzone.net 2001-2012