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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Использую focus(), пропадает содержимое. 
:(
    Опции темы
Alexbutav
Дата 19.6.2013, 22:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Есть div, у него стоит contenteditable="true", ondblclick стоит div.focus(), начинаю сразу вводить текст - пропадает содержимое, нажму третий раз - все нормально... Что делать?
PM MAIL   Вверх
Arantir
Дата 19.6.2013, 23:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Рыбак без удочки
**


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

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



А зачем Вам div.focus()?
Элементы с contenteditable="true" и без этого нормально выделяются и редактируются. При наведении мыши у них псевдокласс :hover, при вводе теста - : focus

http://jsfiddle.net/qnXnb/

Это сообщение отредактировал(а) Arantir - 19.6.2013, 23:11


--------------------
interface Жопа {
    // ATTENTION: has to be implemented by every class of the project for proper project work
}
PM   Вверх
Alexbutav
Дата 19.6.2013, 23:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



проблема в том, что, изначально блок стотит с contenteditable=false, а точнее без него, он получает true при дабл клике но, если ему не передать фокус, то придется сделать еще один клик, 3ий клик фигня, поэтому я передаю ему фокус и можно сразу вводить текст, но если сразу, после получения фокуса начать вводить текст, то он удалит содержимое, поэтому все равно требуется 3ий клик, что меня не устаивает, яподозреваю, что мне нужно поместить указатель на тексте после фокуса, в конце напимер и тогда, по идеи, все будет ок
PM MAIL   Вверх
Arantir
Дата 19.6.2013, 23:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Рыбак без удочки
**


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

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



Вы хотите, чтобы редактирование активировалось только при даблклике?
Можно оставить contenteditable=true и просто отменять фокус по одному клику и, как Вы сделали, повесить на двойной.

Вроде бы работает без глюков: http://jsfiddle.net/qnXnb/2/

Добавлено @ 23:30
P.S.: Если у Вас иногда не получается с onclick отменять стандартные действия (preventDefault), то пробуйте с onmousedown.  Просто браузер некоторые действия именно на нем делает, а не на клике.

Это сообщение отредактировал(а) Arantir - 19.6.2013, 23:31


--------------------
interface Жопа {
    // ATTENTION: has to be implemented by every class of the project for proper project work
}
PM   Вверх
Alexbutav
Дата 19.6.2013, 23:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Объект вляется передвигаемым, поэтому прои одном клике он выделяется и ему можно изменять размер, и двигать, в при двойном он должен стать изменяемым.
PM MAIL   Вверх
Arantir
Дата 19.6.2013, 23:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Рыбак без удочки
**


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

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



Можете привести свой код? Можно только тот, который связан с этим передвигаем изменяемым элементом.
Быстрее будет, если сразу в нем разбираться. А то еще какие подробности всплывут, вроде drag-n-drop, так никогда тема не кончится =)

Добавлено через 11 минут и 56 секунд
Если пользуетесь jQuery, то там для draggable есть параметр cancel, в котором можно указать селектор фокуса. Тогда в фокусе элемент не перетаскивается. При этом нет проблем с "третьим кликом".
http://jsfiddle.net/qnXnb/3/

Это сообщение отредактировал(а) Arantir - 19.6.2013, 23:42


--------------------
interface Жопа {
    // ATTENTION: has to be implemented by every class of the project for proper project work
}
PM   Вверх
Alexbutav
Дата 20.6.2013, 00:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



<style>
    /*Квадраты изменени размера*/
    .l_r_rsz,.t_b_rsz,.r_b_rsz{width:10px;height:10px;background:#fff;position:absolute;display:none;border:1px solid #bbb;}
    .l_r_rsz{left:100%;margin-left:-6px;top:50%;margin-top:-6px;cursor :e-resize;}
    .t_b_rsz{top:100%;margin-top:-6px;left:50%;margin-left:-6px;cursor: s-resize;}
    .r_b_rsz{top:100%;left:100%;margin-top:-6px;margin-left:-6px;cursor: se-resize;}
</style>
<script>
    var drag = new Object();
    drag.selected = false;
    drag.editing = false;
    drag.obj = new Object();
    drag.startX = 0;
    drag.startY = 0;
    drag.curX = 0;
    drag.curY = 0;
    drag.top = 0;
    drag.left = 0;
    
    window.onload = function()
    {
        var block = document.createElement('div');
        block.className = 'block e1';
        block.style.position = 'absolute';
        block.style.top = '0px';
        block.style.left = '0px';
        block.style.width = '200px';
        block.style.height = '200px';
        block.style.cursor = 'pointer';
        block.style.background = '#000';
        document.body.appendChild(block);
        var t = document.createElement('div');
        t.className = 'l_r_rsz';
        block.appendChild(t);
        var t = document.createElement('div');
        t.className = 't_b_rsz';
        block.appendChild(t);
        var t = document.createElement('div');
        t.className = 'r_b_rsz';
        block.appendChild(t);
        
        document.onmousedown = select;
        document.onmouseup = up;
    }
    
    function select(event)//кликаем по чему-либо
    {
    
        //event.which - какая кнопка нажата, средняя, правая или левая
        
        var target = event.target;
        var clas = target.getAttribute('class');
        if(clas == 'l_r_rsz')
        {
            // <- -> иизменение размеров
            document.onmousemove = l_r_r;
        }else if(clas == 't_b_rsz')
        {
            // \/ /\ размеров
            document.onmousemove = t_b_r;
        }else if(clas == 'r_b_rsz')
        {
            // диагональное изменение
            document.onmousemove = b_r_r;
        }
        else
        {
            var is_clas = false;//переменная, которая говорит о наличии выделенного элемента с классом блок
            if(drag.editing == false)
            {
                if(clas!=null)
                    var clas = clas.split(" ");
                for(var a in clas)
                    if(clas[a] == 'block')
                    {
                        if(event.which == 1)
                        {
                        if(drag.selected == true && target !== drag.obj)//убираем селекторы т.к. нажат другой блок
                        {
                            clear_ob()
                        }
                            drag.selected = true;
                            drag.obj = target;
                            drag.startX = event.pageX;
                            drag.startY = event.pageY;
                            drag.top = target.offsetTop;
                            drag.left = target.offsetLeft;
                            drag.s_w = target.offsetWidth;
                            drag.s_h = target.offsetHeight;
                            target.getElementsByClassName('l_r_rsz')[0].style.display = 'block';
                            target.getElementsByClassName('t_b_rsz')[0].style.display = 'block';
                            target.getElementsByClassName('r_b_rsz')[0].style.display = 'block';
                            
                            document.ondragstart = function() { return false }
                            document.body.onselectstart = function() { return false }
                            
                            target.style.background = '#0f0';
                            document.onmousemove = move_obj;
                            target.ondblclick = makeEdit;
                            
                            // 1)добавить выделение
                            // 2) сделать передвижение
                        }
                        is_clas = true;
                        break;
                    }
            }
            else
            {
                if(target === drag.obj)
                    return;
                else//снимаем выделение т.к. во время редактирования блока был нажат не блочный элемент
                {
                    clear_ob();
                }
            }
            
            if(is_clas == false&&drag.selected ==true)//убираем селекторы т.к. нажат другой элемент, не блок
            {
                clear_ob();
            }
        }
    }
    
    function move_obj(event)//двигаем блок
    {
        drag.obj.style.top = drag.top - drag.startY + event.pageY +'px';
        drag.obj.style.left = drag.left - drag.startX + event.pageX +'px';
    }
    
    function up(event) //отпускаем мышку
    {
        document.onmousemove = function(){return false;};
        if(event.which == 1)
        {
            var target = event.target;
            if(target === drag.obj)
            {
                ;
            }
        }
    }
    
    function l_r_r(event)//горизонталное изменение
    {
        drag.obj.style.width = event.pageX  - drag.obj.offsetLeft +'px';
    }
    
    function t_b_r(event)//вертикальное изменение
    {
        drag.obj.style.height = event.pageY  - drag.obj.offsetTop +'px';
    }
    
    function b_r_r(event)//диагональное изменение
    {
        drag.obj.style.width = event.pageX  - drag.obj.offsetLeft +'px';
        drag.obj.style.height = event.pageY  - drag.obj.offsetTop +'px';
    }
    
    function clear_ob()//снимаем выделение
    {
        drag.editing = false;
        drag.obj.style.cursor = 'pointer';
        drag.obj.contentEditable =false;
        drag.obj.ondblclick = function(){};
        drag.obj.style.background = '#000';
        drag.obj.getElementsByClassName('l_r_rsz')[0].style.display = 'none';
        drag.obj.getElementsByClassName('t_b_rsz')[0].style.display = 'none';
        drag.obj.getElementsByClassName('r_b_rsz')[0].style.display = 'none';
        
        drag.selected = false;
        drag.obj = new Object();
        drag.startX = 0;
        drag.startY = 0;
        drag.curX = 0;
        drag.curY = 0;
        drag.top = 0;
        drag.left = 0;
        
        document.ondragstart = function() {}
        document.body.onselectstart = function() {}
    }
    
    function makeEdit()//делаем блок ищменяемым
    {
        drag.editing = true;
        drag.obj.contentEditable =true;
        drag.obj.style.cursor = 'text';
        drag.obj.style.background = '#d0d0d0';
        drag.obj.getElementsByClassName('l_r_rsz')[0].style.display = 'none';
        drag.obj.getElementsByClassName('t_b_rsz')[0].style.display = 'none';
        drag.obj.getElementsByClassName('r_b_rsz')[0].style.display = 'none';
        drag.obj.focus();
        document.onmousemove = function(){};
    }
</script>
PM MAIL   Вверх
Alexbutav
Дата 20.6.2013, 01:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Кстати говоря, если вообще убрать фокус, то все будет ок, но только на 3ий клик...
PM MAIL   Вверх
Sanchezzz
Дата 20.6.2013, 10:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1670
Регистрация: 19.11.2006
Где: Voronezh

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



Ну а если при двойном клике сделать contenteditable=true следом клик программный клик заместо фокуса. drag.obj.click();


--------------------
Понравился ответ "+" по репе, не забываем закрывать тему, заказы в LS.
PM MAIL Skype GTalk   Вверх
Alexbutav
Дата 20.6.2013, 10:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Sanchezzz @ 20.6.2013,  10:45)
Ну а если при двойном клике сделать contenteditable=true следом клик программный клик заместо фокуса. drag.obj.click();

Не сработало
PM MAIL   Вверх
Arantir
Дата 20.6.2013, 10:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Рыбак без удочки
**


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

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



Забавно, что в Chrome работает слово в слово так, как Вы описывали желаемый результат.
Проблема есть в Firefox (может где-то еще, но не проверял).

По-видимому, Chrome считает только двойной клик, а Firefox берет в расчет еще и самый первый. А тройной клик — это выделение всей строки.
Надо где-то сунуть preventDefault, но чтобы не поломать то, что есть. Поэксперементирую, когда посвободней буду.


--------------------
interface Жопа {
    // ATTENTION: has to be implemented by every class of the project for proper project work
}
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Форум для вопросов, которые имеются в справочниках, но их поиск вызвал затруднения, или для разработчика требуется совет или просьба отыскать ошибку. Напоминаем: 1) чётко формулируйте вопрос, 2) приведите пример того, что уже сделано, 3) укажите явно, нужен работающий пример или подсказка о том, где найти информацию.
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: Общие вопросы | Следующая тема »


 




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


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

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