Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Вебмастеру (http://forum.oszone.net/forumdisplay.php?f=22)
-   -   [решено] Помогите с соединением двух функцией на JavaScript (http://forum.oszone.net/showthread.php?t=71277)

Igor_I 13-09-2006 21:31 484573

Помогите с соединением двух функцией на JavaScript (DokuWiki)
 
Вопрос доволно специфичный, не знаю даже реализуемо это. Предисловие довольно длинное :)
Есть вики-движок -DokuWiki. http://wiki.splitbrain.org/wiki:ru:syntax образец страницы. Нажимаем кнопку Edit page и видим тулбар с иконками. результат использования некоторых из них аналогично здешним иконкам - обрамление некоего текста тегами. Функция вставки смайликов работает по другому, щелкаем по кнопке-смайлик, вылезает окошко и уже в нем выбираем смайлик, который потом вставляется в текст. Также в движке реализованна подсветка синтаксиса. http://animesarov.net.ru/wiki:syntax...тка синтаксиса, только вот кнопки такой нет. Хочу сделать.
Я так думаю, что все функции тулбара завязанны на этой функции. И мне думается так, что нужно соединить каким-то образом два действия данной функции - format & picker
PHP код:

function initToolbar(tbid,edid,tb){    
 if(!
document.getElementById){ return; }     
var 
toolbar document.getElementById(tbid);     
var 
cnt tb.length;     
for(var 
i=0i<cnti++){         
// 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 485219

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

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

Igor_I 16-09-2006 16:19 485628

Вложений: 1
Цитата:

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

Цитата:

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

Igor_I 16-09-2006 16:32 485630

Вложений: 2
Вот, что получилось. Кнопки были найдены :)
На втором скрине результат и кнопки "php" и кнопки побольше.

Prisoner 16-09-2006 16:44 485636

Т.е. они там заложены были, их только активировать надо было, так?

Igor_I 16-09-2006 17:00 485645

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

VeshchiyOleg 18-09-2006 18:08 486373

вот это место поподробнее:
Код:

        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 486422

Все функции в прикрепленном файле edit.rar. Последние две функции мои, исправленные.
проблема заключается в этом участке кода.

PHP код:

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

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

VeshchiyOleg 19-09-2006 10:00 486609

итак, тебе вместо
Код:

        text="<code "+text+"></code>";
    insertAtCarret(edid,text);

строка 500
надо использовать
Код:

insertTags(edid,'<code '+text+'>', '</code>', '');
тогда текст внутри тэгов останется (должен остаться)

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

Igor_I 19-09-2006 20:18 486910

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

VeshchiyOleg 20-09-2006 09:13 487039

Цитата:

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

Цитата:

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


Время: 05:33.

Время: 05:33.
© OSzone.net 2001-