Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > JavaScript: Общие вопросы > Возврат фокуса в iframe


Автор: voronov 17.3.2007, 13:22
проблема в следующем:
есть iframe с designMode='on'...при вызове формы выбора файла, данный iframe терает фокус ввода(курсор)...как сделать чтобы при закрытии формы выбора файла ....курсор возврашался на прежнее место 

Можно конечно  сохранить позицию курсора...а потом ее востановить...но можно ли как то проще?

Заранее спасибо за ответы

Автор: JSman 18.3.2007, 00:12
 .focus не помогает?

Автор: paralmix 18.3.2007, 10:26
Цитата

focus не помогает? 


Нет...фокус устанавливает курсов в начало текста...мне же надо вернуть кусрор в ту позицию где он был до потери фокуса

Автор: JSman 18.3.2007, 17:45
ну тогда точно придется заморачиваться с textrange.

вот и исходник. найдешь много полезных функций. писал для ие.
Код


// filename TextObject.js

// JSman

window.attachEvent("onload", TextObject);

function TextObject() {
    var _ = new Object(); // var _ = this;
    
    /*
    properties:
        lastElement  - last activated element
    
    methods:
        insert(text[, element]) - adding text at TextRangePos of editable element; 
        storeTextRange (element) - storing TextRange position in editable element;
        register([wnd])
        registerAll()
        getWordAtCursor()
    */

    //-property-----------------------------
    _.lastElement = null;
    
    //-methods-----------------------------
    _.insert = TextObject_insert;
    _.storeTextRange = TextObject_storeTextRange;
    _.register = TextObject_register;
    _.registerAll = TextObject_registerAll;
    _.getWordAtCursor = TextObject_getWordAtCursor;

    
    
    function constructor() {        
        _.registerAll();        
        }


    constructor();
   //---------------------------------
    function addWord () {
    var s, el=event.srcElement.innerText, e;
        s = (el.indexOf(' ') != -1)? '"' + el + '"' : el; 
         _.insert(' ' + s + ' ');
         try {
         if (_.lastElement) _.lastElement.focus(); }
         catch (e) {}
       }

    //--------------------------------
    /*function TextObject_window_frame_register_onload( _wnd, _id) {
    //_wnd.document.all(_id).attachEvent("onload", function () {_.register(_wnd.document.frames(_id));});    
        }
*/
    //--------------------------------
    function TextObject_register() {
  var i=0, el, doc, wnd;

            function getEvent() {
            
            _.storeTextRange(wnd, wnd.event.srcElement);
            //_.getWordAtCursor(wnd);
                }
            
            function anchor_click() {
            el = wnd.event.srcElement;
            //document.title = el.tagName == "A" && el.parentElement.className == "addword";
            if (el.tagName == "A" && el.parentElement.className == "addword") addWord(); 
                }



    if (arguments.length>0) 
        wnd = arguments[0]; else wnd = window;    
        
        doc = wnd.document;
//alert();
        doc.attachEvent ("onclick", anchor_click);
//alert();
        doc.attachEvent ("onselect", getEvent );

     while (i<doc.all.length)
       {  
            el = doc.all.item(i);

///*
            if (el.isContentEditable ||  el.className == "editable")
                {
                el.attachEvent('onclick', getEvent);
                el.attachEvent('onselect', getEvent);
                el.attachEvent('onkeyup', getEvent);
                }
 /*            
            if (el.tagName=="IFRAME") {
                //alert(el.id);
                if (!el.id) el.id = "ID_FRAME_"+i.toString();
                if (!el.name) el.name = "ID_FRAME_"+i.toString();
                }
            
// */        
        i++;
       }

       return;   
       }
//------------------------------------------------------------
function TextObject_registerAll() {

var wnd, frame, collection, i=0;

if (arguments.length) wnd = arguments[0]; else wnd = window;

collection = wnd.document.all.tags("IFRAME")

    _.register();

///*
    if (collection.length>0)
        {
            while (i<collection.length){
            
            frame = collection.item(i);
            _.register(frame.contentWindow);
            //_.register(wnd.frames.item(i));
            //frame.attachEvent("onload", function () {_.register(frame.contentWindow);});
            frame.attachEvent("onload", new Function ('_.register(frame.contentWindow);'));
            //TextObject_window_frame_register_onload(window, frame.id);
        
            i++;
            
            }
        
        
        }
//*/        
}
//------------------------------------------------------------         
    function TextObject_insert(){ 
       var el, txt, e;
       
       if (arguments.length==0) return;   
       if (arguments.length>0) txt = arguments[0];   
       if (arguments.length>1) el = arguments[1]; else el = _.lastElement;
       
       try {
               if (el && el.TextRangePos)           
                      { 
                //      alert(el.TextRangePos);
                      el.TextRangePos.text=txt; 
                      el.TextRangePos.collapse(false);
                      el.TextRangePos.select();
                     
                      }
    
               else if (el)
                       {el.value+=txt; 
                       }
    
       } catch(e) {}
    }

//------------------------------------------------------------
function TextObject_storeTextRange(wnd,el) 
   { var e;
           if (wnd.document.selection && wnd.document.selection.createRange) {
                    try {
                    el.TextRangePos=wnd.document.selection.createRange().duplicate();
                   _.lastElement = el;
                    } catch (e) {}
           }
   }
//------------------------------------------------------------

function TextObject_getWordAtCursor() {
///*
            var word, o;
            //word.text = '';
            if (arguments.length ==1) wnd = arguments[0];
            o = wnd.event.srcElement;
            //alert();
            try {
            word = o.TextRangePos.duplicate();
            //alert(); 
            word.moveStart('word',-1);
            word.moveEnd('word');
            }
            catch (e) {word = new Object(); word.text=''; };
            //document.title = ('\"  ' + word.text + '\"');
//*/
    return word.text;
    }

//-----------------------------------------------------------
}
    




смысл кода был в том, что я сначала активирую текстовое поле, потом кликаю на ссылку с class 
    "addword" и вставляется текст ссылки в поле ввода. легко изменить код под себя.

Автор: S.A.P. 18.3.2007, 18:13
Здесь что - то не так. Курсор по идее должен возвращаться на прежнее место (сам делал), если только ты не перезаписываешь контент через innerHTML.  Еще был подобный баг с фокусом, если с ифрейма уходишь нажатием на div или подобный элемент (уже не помню в чём точно он выражался).

У тебя есть страничка, где можно покрутить этот wysiwyg?

Автор: voronov 18.3.2007, 18:52
Цитата

перезаписываешь контент через innerHTML

нет ... для форматирования текста были спользован метод execCommand

Цитата

У тебя есть страничка, где можно покрутить этот wysiwyg? 

нет ... но за основу редактора был взят:
http://xpoint.ru/know-how/WYSIWYG/TrueJavaScriptEditor

Цитата

Курсор по идее должен возвращаться на прежнее место


по идеи и я так думал...но при возвращение из диалога открытия файла, курсор на место не возвращается( при использовании метода focus(), курсор становиться в начало

конечно можно сохранять позицию курсора перед открытия диалога...и восстановливать после закрытия...но ведь наверное можно как то проще...

Автор: JSman 18.3.2007, 19:05
смотри TextObject_storeTextRange, TextObject_insert. специально же написал

Автор: voronov 18.3.2007, 21:45
Цитата

смотри TextObject_storeTextRange, TextObject_insert. специально же написал


мда...спасибо

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)