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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> removeEventListener 
:(
    Опции темы
bars80080
Дата 14.12.2009, 14:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

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



понравился ползунок здесь, который форму расширяет, а т.к. недолюбливаю библиотеки, написал своё:

Код

<html>
<body>
<style>
body { height: 100%; }
.area { width: 600px; }
.area textarea { width: 100%; height: 75px; }
.area div { width: 100%; height: 8px; background: #f8f8ee; cursor: n-resize; }
</style>
<script>
var dropNS = false;
var ua = navigator.userAgent.toLowerCase();
var isOpera = (ua.indexOf('opera')  > -1);
var isIE = (!isOpera && ua.indexOf('msie') > -1);
function ymouse(e) { if(isIE) { return event.clientY; } else { return e.pageY; }}
function getElementPosition(elemId, pos, ts) {
    if(ts) { var elem = elemId; }
    else { var elem = document.getElementById(elemId); }
    var w = elem.offsetWidth; var h = elem.offsetHeight;
    if(pos) { return {"width": w, "height":h}; }
    var l = 0, t = 0;
    while(elem) { l += elem.offsetLeft; t += elem.offsetTop; elem = elem.offsetParent; }
    return {"left":l, "top":t, "width": w, "height":h};
}
function startDrop(el, e) { 
    var bk = el.parentNode.getElementsByTagName('textarea'); if(!bk[0]) { return false; }
    bk[0].id = 'RND' + Math.floor(Math.random()*1000000);
    var p = getElementPosition(bk[0], true, true);
    dropNS = true; var dc = ymouse(e) - p.height;
    if(document.body.addEventListener) {
        document.body.addEventListener("mousemove", function(e){ dropENS(bk[0].id, e, dc) }, false);
        document.body.addEventListener("mouseup", function(){ endDrop() }, false);
    } else {
        document.body.attachEvent("onmousemove", function(e){ dropENS(bk[0].id, e, dc) });
        document.body.attachEvent("onmouseup", function(){ endDrop() });
    }
    return true;
}
function endDrop() { dropNS = false; 
    if(document.body.addEventListener) {
        document.body.removeEventListener("mousemove", function(e){ dropENS() }, false);
        document.body.removeEventListener("mouseup", function(){ endDrop() }, false);
    } else {
        document.body.detachEvent("onmousemove", function(e){ dropENS() });
        document.body.detachEvent("onmouseup", function(){ endDrop() });
    }
    document.body.focus();
    return true; }
function dropENS(el, e, dc) {
    if(!dropNS) { return false; }
    bk = document.getElementById(el); if(!bk) { return false; }
    var fy = ymouse(e) - dc;
    bk.style.height = fy + 'px';
    return true;
}
</script>

<div class="area"><textarea>{V}</textarea><div onmousedown="startDrop(this, event);"></div></div>

</body>
</html>

не так уж и сложно оказалось. 

однако, возник вопрос. вот эта переменная в коде dropNS явно лишняя, если бы работали методы removeEventListener и detachEvent. но они не работают. (если убрать переменную, то листенеры останутся)

здесь проблема так и не решена. ведь обработчики не явные, должны же они как-то сниматься.
PM MAIL WWW   Вверх
diadiavova
Дата 14.12.2009, 14:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

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



bars80080, а почему так не сделать
Код

document.body.onmousemove = null;
Или я что-то не так понял?


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
bars80080
Дата 14.12.2009, 15:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

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



так, не работает так
PM MAIL WWW   Вверх
diadiavova
Дата 14.12.2009, 15:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

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



Цитата(bars80080 @  14.12.2009,  15:08 Найти цитируемый пост)
так, не работает так 

Странно, возможно это зависит от того, как на события подписываешься.Сейчас попробую чонить наваять.

Добавлено через 11 минут и 7 секунд
Ну вот в примере всё работает
Код

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
    <title></title>
</head>
<body>
    <input type="button" id="b1" value="b1" onclick="alert(this.id);" />
    <input type="button" id="b2" value="b2" />
<input type="button" id="btnRemoveHandler" value="Remove handler" onclick="RemoveEventHandlers();" />
    <script type="text/javascript">
        var b1 = document.getElementById("b1");
        var b2 = document.getElementById("b2");
        b2.onclick = function() { alert("Preved"); }
        function RemoveEventHandlers()
        {
            b1.onclick = null;
            b2.onclick = null;
        }
    </script>

</body>
</html>




--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
bars80080
Дата 14.12.2009, 15:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

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



ну, пример, примеру рознь. 

хендлеры навешиваются автоматом и именно через addListener и attachEvent, т.к. нужно событие event, а прописать в разметке заранее нельзя, они навешиваются потом

то бишь разделяем html и js
PM MAIL WWW   Вверх
diadiavova
Дата 14.12.2009, 15:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

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



bars80080, на счёт навешивания вышеозначенными методами не знаю, надо пробовать, но в моём примере если ты обратил внимание, первой кнопке обработчик приписывается в html-коде, а второй из скрипта. И кстати в в лисе в осле работает один и тот же код.

Добавлено через 31 секунду
На 13-ю строку обрати внимание.


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
Amphiluke
Дата 14.12.2009, 16:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


   ☽
***


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

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



bars80080, это бесполезно, ИМХО. Вот таким вот образом:
Цитата(bars80080)

Код

        document.body.removeEventListener("mousemove", function(e){ dropENS() }, false);
        document.body.removeEventListener("mouseup", function(){ endDrop() }, false);


вы не воспроизведете те «явные» (анонимные) обработчики, которые передали в метод addEventListener. Здесь это уже совершенно другие функции, не имеющие отношения к ранее зарегистрированным слушателям. Поэтому метод removeEventListener не дает эффекта — ему передали функцию, не являющуюся зарегистрированным слушателем.

Если вы не рассматриваете вариант с передачей функции в метод addEventListener «неявно», т.е. по ссылке на полноценную ранее подготовленную функцию-слушатель, то есть компромиссный вариант (но мне он не нравится):
Код

    if(document.body.addEventListener) {
        document.body.addEventListener("mousemove", f1 = function(e){ dropENS(bk[0].id, e, dc) }, false);
        document.body.addEventListener("mouseup", f2 = function(){ endDrop() }, false);
    } else {
        document.body.attachEvent("onmousemove", f1 = function(e){ dropENS(bk[0].id, e, dc) });
        document.body.attachEvent("onmouseup", f2 = function(){ endDrop() });
    }

Код

    if(document.body.addEventListener) {
        document.body.removeEventListener("mousemove", f1, false);
        document.body.removeEventListener("mouseup", f2, false);
    } else {
        document.body.detachEvent("onmousemove", f1);
        document.body.detachEvent("onmouseup", f2);
    }

где f1 и f2 — глобальные переменные.

P.S. Хотя, я думаю, лучше всего было бы не поскупиться и создать отдельную именованную функцию-слушатель и оперировать ею, а не анонимными функциями.
PM   Вверх
bars80080
Дата 14.12.2009, 16:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

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



Цитата(Amphiluke @  14.12.2009,  15:07 Найти цитируемый пост)
где f1 и f2 — глобальные переменные.

тут какбэ попытка уйти от глобальной переменной. хотя, наверное, всё же нужно заворачивать всякие хвосты




Цитата(Amphiluke @  14.12.2009,  15:07 Найти цитируемый пост)
Хотя, я думаю, лучше всего было бы не поскупиться и создать отдельную именованную функцию-слушатель и оперировать ею, а не анонимными функциями. 

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


PM MAIL WWW   Вверх
bars80080
Дата 14.12.2009, 16:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

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



Цитата(Amphiluke @  14.12.2009,  15:07 Найти цитируемый пост)
Код

    if(document.body.addEventListener) {
        document.body.removeEventListener("mousemove", f1, false);
        document.body.removeEventListener("mouseup", f2, false);
    } else {
        document.body.detachEvent("onmousemove", f1);
        document.body.detachEvent("onmouseup", f2);
    }

нормальный вариант. покатит
PM MAIL WWW   Вверх
Amphiluke
Дата 14.12.2009, 16:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


   ☽
***


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

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



Как обойтись без глобальных переменных, сразу не соображу, но, с другой стороны, их и не будет много. Только две (пользователь не может таскать сразу две textarea) Первая глобальная переменная — id объекта textarea, размеры которого меняются (если имеется несколько таких textarea), второй — координаты, где изначально была нажата кнопка мыши. И всё — не так уж и много, вроде. А если textarea одна, то и вообще остается только одна глобальная переменная (dc).
Код

<html>
<body>
<style>
body { height: 100%; }
.area { width: 600px; }
.area textarea { width: 100%; height: 75px; }
.area div { width: 100%; height: 8px; background: #f8f8ee; cursor: n-resize; }
</style>
<script>
var ua = navigator.userAgent.toLowerCase();
var isOpera = (ua.indexOf('opera')  > -1);
var isIE = (!isOpera && ua.indexOf('msie') > -1);
var dc, bkid;
function ymouse(e) { if(isIE) { return event.clientY; } else { return e.pageY; }}
function getElementPosition(elemId, pos, ts) {
    if(ts) { var elem = elemId; }
    else { var elem = document.getElementById(elemId); }
    var w = elem.offsetWidth; var h = elem.offsetHeight;
    if(pos) { return {"width": w, "height":h}; }
    var l = 0, t = 0;
    while(elem) { l += elem.offsetLeft; t += elem.offsetTop; elem = elem.offsetParent; }
    return {"left":l, "top":t, "width": w, "height":h};
}
function startDrop(el, e) { 
    var bk = el.parentNode.getElementsByTagName('textarea'); if(!bk[0]) { return false; }
    bk[0].id = 'RND' + Math.floor(Math.random()*1000000);
    bkid = bk[0].id;
    var p = getElementPosition(bk[0], true, true);
    dc = ymouse(e) - p.height;
    if(document.body.addEventListener) {
        document.body.addEventListener("mousemove", dropENS, false);
        document.body.addEventListener("mouseup", endDrop, false);
    } else {
        document.body.attachEvent("onmousemove", dropENS);
        document.body.attachEvent("onmouseup", endDrop);
    }
    return true;
}
function endDrop() {
    if(document.body.addEventListener) {
        document.body.removeEventListener("mousemove", dropENS, false);
        document.body.removeEventListener("mouseup", endDrop, false);
    } else {
        document.body.detachEvent("onmousemove", dropENS);
        document.body.detachEvent("onmouseup", endDrop);
    }
    document.body.focus();
    return true; }
function dropENS(e) {
    var ev = (e) ? e : event;
    bk = document.getElementById(bkid); if(!bk) { return true; }
    var fy = ymouse(ev) - dc;
    bk.style.height = fy + 'px';
    return true;
}
</script>

<div class="area"><textarea>{V}</textarea><div onMouseDown="startDrop(this, event);"></div></div>

</body>
</html>


PM   Вверх
bars80080
Дата 14.12.2009, 17:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

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



Цитата(Amphiluke @  14.12.2009,  15:52 Найти цитируемый пост)
Первая глобальная переменная — id объекта textarea, размеры которого меняются (если имеется несколько таких textarea), второй — координаты, где изначально была нажата кнопка мыши

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



в общем, как всегда большое спасибо

Это сообщение отредактировал(а) bars80080 - 14.12.2009, 17:42
PM MAIL WWW   Вверх
diadiavova
Дата 14.12.2009, 21:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

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



Вот всё-таки есть у меня ощущение, что или я чего-то не догнал, или меня не поняли. Прочитал внимательнее первый пост и код...вот вариант, о котором говорил я
Код

<html>
<body>
<style>
body { height: 100%; }
.area { width: 600px; }
.area textarea { width: 100%; height: 75px; }
.area div { width: 100%; height: 8px; background: #f8f8ee; cursor: n-resize; }
</style>
<script type="text/javascript">
    function id(idText) { return document.getElementById(idText); }
    var body = document.body;
var ua = navigator.userAgent.toLowerCase();
var isOpera = (ua.indexOf('opera')  > -1);
var isIE = (!isOpera && ua.indexOf('msie') > -1);
function ymouse(e) { if(isIE) { return event.clientY; } else { return e.pageY; }}
function getElementPosition(elemId, pos, ts) {
    if(ts) { var elem = elemId; }
    else { var elem = id(elemId); }
    var w = elem.offsetWidth; var h = elem.offsetHeight;
    if(pos) { return {"width": w, "height":h}; }
    var l = 0, t = 0;
    while(elem) { l += elem.offsetLeft; t += elem.offsetTop; elem = elem.offsetParent; }
    return {"left":l, "top":t, "width": w, "height":h};
}
function startDrop(el, e) { 
    var bk = el.parentNode.getElementsByTagName('textarea'); if(!bk[0]) { return false; }
    bk[0].id = 'RND' + Math.floor(Math.random()*1000000);
    var p = getElementPosition(bk[0], true, true);
    var dc = ymouse(e) - p.height;
        body.onmousemove= function(e){ dropENS(bk[0].id, e, dc) }
        body.onmouseup= function(){ endDrop() }
    return true;
}
function endDrop() {
      body.onmousemove=body.onmouseup=null;
      body.focus();
      return true; }
function dropENS(el, e, dc) {
    bk = id(el); if(!bk) { return false; }
    var fy = ymouse(e) - dc;
    bk.style.height = fy + 'px';
    return true;
}
</script>
<div class="area"><textarea>{V}</textarea><div onmousedown="startDrop(this, event);"></div></div>
</body>
</html>



--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
bars80080
Дата 15.12.2009, 00:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

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



фиг знает, в последний раз у меня почему-то неудавалось передать event через такую запись

        body.onmousemove= function(e){ dropENS(bk[0].id, e, dc) }

из-за этого и приходилось всякие addEventListener вешать
PM MAIL WWW   Вверх
diadiavova
Дата 15.12.2009, 00:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

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



Цитата(bars80080 @  15.12.2009,  00:05 Найти цитируемый пост)
фиг знает, в последний раз у меня почему-то неудавалось передать event через такую запись

Ну ты же знаешь как это бывает: где-нибудь запятую потерял или ещё что и кирдык. С яваскриптом это "как два пальца обоссать".


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
bars80080
Дата 15.12.2009, 00:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

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



нет, там именно не получалось передать событие

вот, эта тема http://forum.vingrad.ru/index.php?showtopi...t&p=2020891

PM MAIL WWW   Вверх
diadiavova
Дата 15.12.2009, 00:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

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



Хотелось бы увидеть код в контексте, чтобы попробовать в деле и что получится когда немного подправишь. Кое-что смущает(например this во вложенных функциях и многократная инициализация обработчиков, я просто не вкурсе как это js работает), но из того, что сразу бросается в глаза в этом коде
Код

    for(var i = 0; i < ell; i++) {
        if(el[i].className != 'ihint') { continue; }
        el[i].onmouseover = function() { ihint_over(this); };
        el[i].onmousemove = function() { ihint_move(event); };
        el[i].onmouseout = function() { ihint_out(this); };
    }
я бы выделил вот такой момент
Код

    for(var i = 0; i < ell; i++) {

На сколько я понял из дальнейшего ell - это коллекция элементов, а не число, поэтому надо было писать вместо  i < ell всё-таки  i < ell.length. Ну это к вопросу о "запятых".

Это сообщение отредактировал(а) diadiavova - 15.12.2009, 00:32


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
Oxy
Дата 15.12.2009, 00:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Awaiting Authorisation
Сообщений: 70
Регистрация: 20.9.2009

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



Цитата(diadiavova @  15.12.2009,  00:30 Найти цитируемый пост)
На сколько я понял из дальнейшего ell - это коллекция элементов

ИМХО
Код

var ell = el.length;

PM MAIL WWW   Вверх
diadiavova
Дата 15.12.2009, 00:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

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



Цитата(Oxy @  15.12.2009,  00:35 Найти цитируемый пост)
var ell = el.length;

Точно...пропёрся smile 


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
diadiavova
Дата 15.12.2009, 01:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

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



Вот так вроде работает
Код

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
    <title></title>
</head>
<body>
    <input id="Button1" name="test" type="button" value="button" />
    <input id="Button2" name="test" type="button" value="button" />
    <input id="Button3" name="test" type="button" value="button" />
    <input id="Button4" name="test" type="button" value="button" />
    <input id="Button5" name="test" type="button" value="button" />
    <div id="info"></div>
    <script type="text/javascript">
        var info = document.getElementById("info");
        function ihint_over(arg)
        {
            arg.value="over";
        }
        function ihint_move(arg)
        {
            var el = arg.srcElement||arg.target;
            info.innerHTML = el.id;
        }
        function ihint_out(arg)
        {
            arg.value="out";
        }
        var el = document.getElementsByName("test");
        var ell = el.length;

    for (var i = 0; i < ell; i++)
        {
            //if (el[i].className != 'ihint') { continue; }
            el[i].onmouseover = function() { ihint_over(this); };
            el[i].onmousemove = function(e) { e = e || event; ihint_move(e); };
            el[i].onmouseout = function() { ihint_out(this); };
        }
        
    </script>

</body>
</html>


Это сообщение отредактировал(а) diadiavova - 15.12.2009, 01:37


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
bars80080
Дата 15.12.2009, 11:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

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



Цитата(diadiavova @  14.12.2009,  20:59 Найти цитируемый пост)
        body.onmousemove= function(e){ dropENS(bk[0].id, e, dc) }
        body.onmouseup= function(){ endDrop() }

мда, эта заморочка работает как надо.

будем иметь ввиду
PM MAIL WWW   Вверх
bars80080
Дата 15.12.2009, 12:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

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



Цитата(diadiavova @  14.12.2009,  23:30 Найти цитируемый пост)
Хотелось бы увидеть код в контексте, чтобы попробовать в деле и что получится когда немного подправишь

вот конкретный локализованный пример:
Код

<html>
<body><style>
#HINT { display: none; position: absolute; left: 300px; top: 300px; background: #eeeeee; padding: 10px; }
</style>
<script>
window.onload = function(){ ihint_init(); };
var IE = false;
if(window.ActiveXObject) { IE = true; }
function xmouse(e) { if(IE) { return event.clientX; } else { return e.pageX; }}
function ymouse(e) { if(IE) { return event.clientY; } else { return e.pageY; }}
function ihint_init() {
    var el = document.getElementsByTagName('img');
    var ell = el.length; var my;
    if(ell < 1) { return false; }
    if(el[0].addEventListener) {
        for(var i = 0; i < ell; i++) {
            if(el[i].className != 'ihint') { continue; }
            el[i].onmouseout = function() { ihint_out(); };
            (function(my) {
                my.addEventListener("mouseover", function(e){ ihint_over(e, my) }, false);
                my.addEventListener("mousemove", function(e){ ihint_move(e) }, false);
            })(el[i]);
        }
    } else {
        for(var i = 0; i < ell; i++) {
            if(el[i].className != 'ihint') { continue; }
            el[i].onmouseout = function() { ihint_out(this); };
            (function(my) {
                my.attachEvent("onmouseover", function(e){ ihint_over(e, my) });
                my.attachEvent("onmousemove", function(e){ ihint_move(e) });
            })(el[i]);
        }
    }
}
function ihint_over(e, x) {
    shHintWin(1, x.src, e);
}
function ihint_move(e) {
    var pX = document.documentElement.scrollLeft; var pY = document.documentElement.scrollTop;
    var xm = (IE) ? event.clientX : e.pageX;
    var ym = (IE) ? event.clientY : e.pageY;
    //var x = xmouse(e) + pX + 2; var y = ymouse(e) + pY + 2;
    var x = xm + pX + 2; var y = ym + pY + 2;
    var bk = document.getElementById('HINT');
    bk.style.left = x + 'px';
    bk.style.top = y + 'px';
}
function ihint_out() {
    shHintWin(0);
}
function shHintWin(x, xsrc, e)  {
    var bk = document.getElementById('HINT');
    var dk = document.getElementById('HINT1');
    if(!dk) { return false; }
    if(x == 1) {
        var img = new Image();
        img.src = xsrc;
        dk.innerHTML = '<img src="' + img.src + '" />';
        var pX = document.documentElement.scrollLeft; var pY = document.documentElement.scrollTop;
        var nx = xmouse(e) + pX + 2; var ny = ymouse(e) + pY + 2;
        bk.style.left = nx + 'px'; bk.style.top = ny + 'px';
        bk.style.display = 'block';
    } else {
        bk.style.display = 'none';
    }
}
</script>
<img src="1.jpg" class="ihint" />
<img src="1.jpg" />
<img src="1.jpg" class="ihint" />

<div id="HINT"><div id="HINT1">&nbsp;</div></div>
</body></html>

вся загвоздка была в том, чтобы запихнуть в функцию и event и this. прописать их в хтмл - и получается без нагромождений, 
но надо же так, указав одним классом
PM MAIL WWW   Вверх
diadiavova
Дата 15.12.2009, 16:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

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



Цитата(bars80080 @  15.12.2009,  12:36 Найти цитируемый пост)
вся загвоздка была в том, чтобы запихнуть в функцию и event и this

Ну с this при использовании его в замыканиях вообще лучше дело не иметь, там вопрос мутный smile , а вот через промежуточные параметры такие дела передаются без проблем. В принципе вот эта строчка 
Код

my.attachEvent("onmouseover", function(e){ ihint_over(e, my) });
могла выглядеть и так
Код

my.attachEvent("onmouseover", function(e, me){ ihint_over(e, me) });


Вот мне интересен другой вопрос(просто не в курсе как это в яваскрипте работает): когда ты в цикле объявляешь функцию это память не перегружает? Ведь по идее вот при вот таком коде
Код

for(var i = 0; i < 100; i++)
{
    ar[i].meth = function(){alert(this.toString());}
}
новая функция создаётся при каждой итерации цикла. При чём эти все функции одинаковые. Мне почему-то кажется, что такой код
Код

var myFunc = function(){alert(this.toString());}
for(var i = 0; i < 100; i++)
{
    ar[i].meth = myFunc;
}
будет работать более экономично по отношению к ресурсам. Или я чего-то не понимаю?

Это сообщение отредактировал(а) diadiavova - 15.12.2009, 16:36


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
Amphiluke
Дата 15.12.2009, 17:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


   ☽
***


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

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



Цитата(diadiavova @  15.12.2009,  19:35 Найти цитируемый пост)
Вот мне интересен другой вопрос

Дак это ж совсем разные случаи.

В первом случае:
Цитата(diadiavova @  15.12.2009,  19:35 Найти цитируемый пост)
Код

ar[i].meth = function(){alert(this.toString());}

каждый раз в цикле создается индивидуальная функция и присваивается атрибуту meth элемента массива ar.

Во втором случае:
Цитата(diadiavova @  15.12.2009,  19:35 Найти цитируемый пост)
Код

ar[i].meth = myFunc;

атрибуты math всех элементов массива ar указывают на одну и ту же единственную функцию myFunc.

Разумеется, второй вариант рациональнее.

-------------------------------------------------

И вообще, для наглядности сказанного выше кусочек демонстрационного кода  smile
Код

<script type="text/javascript">
    var f1 = function() {alert("Hey!");};
    var f2 = function() {alert("Hey!");};
    if (f1 == f2)
        alert("two functions are the same");
</script>

PM   Вверх
diadiavova
Дата 15.12.2009, 17:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

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



Цитата(Amphiluke @  15.12.2009,  17:01 Найти цитируемый пост)
Дак это ж совсем разные случаи.

Естественно разные. Результат один, а происходят разные вещи и расход ресурсов разный. Поэтому я и спрашиваю какие причины ля того, чтобы объявлять функцию в цикле?


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
bars80080
Дата 15.12.2009, 18:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

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



Цитата(diadiavova @  15.12.2009,  16:29 Найти цитируемый пост)
Поэтому я и спрашиваю какие причины ля того, чтобы объявлять функцию в цикле? 

согласен, уберу. но как тогда в неё засунуть эти параметры (event и this)?

Код

    if(el[0].addEventListener) {
        for(var i = 0; i < ell; i++) {
            if(el[i].className != 'ihint') { continue; }
            el[i].onmouseout = function() { ihint_out(); };
            (function(my) {
                my.addEventListener("mouseover", function(e){ ihint_over(e, my) }, false);
                my.onmousemove = ihint_move;
            })(el[i]);
        }
    }

как с mouseover поступить?
PM MAIL WWW   Вверх
diadiavova
Дата 15.12.2009, 18:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

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



Ну event точно так же через параметр, а что до ссылки на элемент, то функцию ты в принципе можешь вывести в глобальную область и тогда слово this будет возвращать ссылку на объект.

Добавлено через 4 минуты и 54 секунды
А кроме того, объект события имеет ссылку на отправителя этого события. В ИЕ это свойство srcElement, а в файрфоксе точно не помню, кажется targetObject


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
bars80080
Дата 16.12.2009, 14:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

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



образовалась новая проблема по этому вопросу

вот мы всё время говорили о textarea, но тут чёрт дёрнул меня подключить fckeditor. как знаете, эта штуковина заменяет текстарею на скрытое поле и фрейм. конечно, такой ползунок для такого эдитора ещё более полезен, но тут возникла естественная проблема - как только курсор оказывается над фреймом, то обработчик document.body.onmousemove конечно перестаёт действовать, ведь это не его документ

попытался в этом случае продублировать обработчики на фрейм, но там получилось такое нагромождение с этими parent и прочим, что пока снёс всё.

вооот, что хотел спросить: нет ли какого обходника простого или всё же придётся мучаться с линковкой?
PM MAIL WWW   Вверх
diadiavova
Дата 16.12.2009, 15:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

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



Цитата(bars80080 @  16.12.2009,  14:06 Найти цитируемый пост)
как знаете, эта штуковина заменяет текстарею на скрытое поле и фрейм.

Нет, я не в курсе. Но не вижу проблемы с обработкой событий фрейма, если он в том же домене, что и основной документ. Всё можно делать в одном документе, просто перенести в него все необходимые ссылки. Вот пример документа
Код

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
    <head>
        <title></title>
    </head>
    <body >
<iframe src="EditFrame.htm" height="300" width="300" id="fr1" onload="frameLoad();"  ></iframe>    
<div id="d1"></div>
<script type="text/javascript">

    var id = function(idText) { return document.getElementById(idText); }
    var fr1 = id("fr1"); ;
    var d1 = id("d1");
    var frDocument;
    var content;
    function frameLoad()
    {
        frDocument = fr1.contentDocument || fr1.contentWindow.document;
        content = frDocument.getElementById("content") || frDocument.body.children[0];
        content.onmousemove = function(e)
        {
            var e = e || fr1.contentWindow.event;
            d1.innerHTML = e.clientX+";"+e.clientY;
        }

    }
</script>
    </body>
</html>

А вот его фрейм
EditFrame.htm
Код

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
    <head>
        <title></title>
    </head>
    <body>
    <div id="content" style="width:100%;height:100%;"></div>
    </body>
</html>

Вся обработка производится в самом документе, просто в него надо добавить ссылки на нужные элементы фрейма.


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
bars80080
Дата 30.12.2009, 13:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

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



так, я снова вернулся к этому вопросу.

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

код такой:
Код

<html>
<body>
<style>
body { height: 100%; }
.area { width: 600px; }
.area textarea { width: 100%; height: 75px; }
.area iframe { width: 100%; height: 75px; }
.dropNS { position: relative; width: 100%; height: 6px; cursor: n-resize; border: 0px; background: #ffff00; /*border: solid 1px #ff0000;*/ }
.dropNS div { width: 100%; height: 6px; background: #f8f8ee; }
</style>
<script>
var dropNS = false;
var ua = navigator.userAgent.toLowerCase();
var isOpera = (ua.indexOf('opera')  > -1);
var IE = (!isOpera && ua.indexOf('msie') > -1);
function ymouse(e) { if(IE) { return event.clientY; } else { return e.pageY; }}
function getElementPosition(elemId, pos, ts) {
    if(ts) { var elem = elemId; }
    else { var elem = document.getElementById(elemId); }
    var w = elem.offsetWidth; var h = elem.offsetHeight;
    if(pos) { return {"width": w, "height":h}; }
    var l = 0, t = 0;
    while(elem) { l += elem.offsetLeft; t += elem.offsetTop; elem = elem.offsetParent; }
    return {"left":l, "top":t, "width": w, "height":h};
}
function startDrop(el, e) { 
    el.style.height = '146px';
    el.style.marginTop = '-70px';//(IE) ? '-70px' : '-140px';
    el.style.marginBottom = '-70px';//(IE) ? '-70px' : '-140px';
    el.getElementsByTagName('div')[0].style.marginTop = '70px';//(IE) ? '70px' : '140px';
    var bk = el.parentNode.getElementsByTagName('textarea'); if(!bk[0]) {
        var bk = el.parentNode.getElementsByTagName('iframe'); if(!bk[0]) { return false; }}
    if(!bk[0].id) { bk[0].id = 'RND' + Math.floor(Math.random()*1000000); }
    var p = getElementPosition(bk[0], true, true);
    var dp = ymouse(e) - p.height;
    document.body.onmousemove = function(e){ dropENS(e, bk[0].id, dp); }
    document.body.onmouseup = function(){ endDrop(el); }
    el.ondblclick = function(){ backDrop(bk[0].id); }
    return true;
}
function backDrop(el) {
    bk = document.getElementById(el);if(!bk) { return false; }
    bk.style.height = '75px';
    document.body.onmousemove = null; document.body.onmouseup = null;
    document.body.focus();
    return true;
}
function endDrop(el) {  
    el.getElementsByTagName('div')[0].style.marginTop = '0px';
    el.style.height = '6px';
    el.style.marginTop = '0px';
    el.style.marginBottom = '0px';
    document.body.onmousemove = null; document.body.onmouseup = null;
    document.body.focus();
    return true; }
function dropENS(e, el, dp) {
    bk = document.getElementById(el); if(!bk) { return false; }
    var fy = ymouse(e) - dp; if(fy < 10) { fy = 10; }
    bk.style.height = fy + 'px';
    return true;
}
</script>

<div class="area"><iframe>{V}</iframe><div class="dropNS" onmousedown="startDrop(this, event);"><div></div></div></div>

</body>
</html>

в ИЕ7 работает отлично, в ФФ, опере и хроме проявляется странный эффект. слой не реагирует на изменение marginTop, но при этом, если назначить слою бордюр (тот закомментированный стиль), то работает нормально во всех браузерах.

какой-то тотальный дефект мозиллы или гекко, кто там у них в основе.
как бы с ним справится, чтоб без бордюра работало?
PM MAIL WWW   Вверх
12345c
Дата 31.12.2009, 00:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Круглый
****


Профиль
Группа: Vingrad developer
Сообщений: 2018
Регистрация: 26.12.2005
Где: наша не пропадала ?

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



По очереди.
Тема интересная, но есть общие замечания в порядке критики.
Такой метод, конечно, удобен, как и аналог его, зашитый в браузер Safari3+ (активная область перетаскивания внизу справа). Но лучше, если бы его вообще не было. Т.е. реализовать автоматическое расширение textarea, как сделано в 
http://www.google.com/search?client=opera&...o-Grow+Textarea :
http://habrahabr.ru/blogs/habrahabr_ideas/11064/
http://habrahabr.ru/blogs/habrahabr_ideas/11064/
Общая проблема в реализации в том, что в Опере не хватает информации о содержимом (не возвращается высота текста), поэтому для полной кроссбраузерности требуется громоздкое решение с эмуляцией текстареи в невидимом Div. 

Если при этом надо ограничить максимальную высоту, вводим ещё один параметр максимальной высоты. Тогда и понадобится визуальная область перетаскивания. Тронули её - высота фиксируется.

В случае использования div designMode="on", думаю, все проблемы решаются нормальнее (хотя не пробовал), и более гибкая функциональность, чем обсуждаемая здесь, будет реализована легче, кратко и без костылей.

Короче, рекомендую сразу разрабатывать более продвинутую юзабельность.


По приведённому коду - что-то во всех этих примерах очень много лишнего. Уйти от глобальных переменных - как известно, это значит использовать замыкания. Или, как вариант, записать обработчик в оперируемый DOM-объект div class="area". Но на самом деле, хранить функцию в объекте не нужно, потому что курсор мыши всегда один smile. Как появится mouseup, так удаляем тот единственный  Listener("mousemove"), которому ничего не мешает быть единственным глобальным.

Есть баг в IE6 - не установлен .area div(font-size:4px} или сколько надо.
...
Этот последний метод с закрылками должен тоже нормально работать (только поставить прозрачный рисунок вместо заливки).


--------------------
Google Code Playground - онлайн-отладка своих примеров HTML+JS без регистрации, с сохранением по URL, без кириллицы. Go
PM WWW   Вверх
bars80080
Дата 31.12.2009, 00:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

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



Цитата(12345c @  30.12.2009,  23:04 Найти цитируемый пост)
(только поставить прозрачный рисунок вместо заливки)

бляха-муха. я собсна и хотел, но вначале проверил на заливке, а он с ней почему-то портачит. неужели, опять не дотянул?

завтра попробую
PM MAIL WWW   Вверх
bars80080
Дата 31.12.2009, 11:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

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



Цитата(12345c @  30.12.2009,  23:04 Найти цитируемый пост)
Этот последний метод с закрылками должен тоже нормально работать (только поставить прозрачный рисунок вместо заливки).

нет, не пашет. ФФ просто игнорирует, если не указан бордюр. 

маразм какой-то

Добавлено через 8 минут и 56 секунд
Цитата(12345c @  30.12.2009,  23:04 Найти цитируемый пост)
 реализовать автоматическое расширение textarea

Короче, рекомендую сразу разрабатывать более продвинутую юзабельность.


не, автоматичный я не буду делать просто потому, что мне он не нравится. очень не приятно, когда что-то начинает работать само по себе. может быть мне нужен небольшой размер текстареи (бывает и так)
PM MAIL WWW   Вверх
bars80080
Дата 31.12.2009, 12:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

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



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

Код

<html>
<body>
<style>
body { height: 100%; }
.area { width: 600px; }
.area textarea { width: 100%; height: 75px; }
.area iframe { width: 100%; height: 75px; }
.dropNS { position: relative; width: 100%; height: 6px; cursor: n-resize; border-top: solid 1px #ffffff; background: #ffff00; }
.dropNS div { width: 100%; height: 6px; background: #f8f8ee; font-size: 4px; }
</style>
<script>
var dropNS = false;
var ua = navigator.userAgent.toLowerCase();
var isOpera = (ua.indexOf('opera')  > -1);
var IE = (!isOpera && ua.indexOf('msie') > -1);
function ymouse(e) { if(IE) { return event.clientY; } else { return e.pageY; }}
function getElementPosition(elemId, pos, ts) {
    if(ts) { var elem = elemId; }
    else { var elem = document.getElementById(elemId); }
    var w = elem.offsetWidth; var h = elem.offsetHeight;
    if(pos) { return {"width": w, "height":h}; }
    var l = 0, t = 0;
    while(elem) { l += elem.offsetLeft; t += elem.offsetTop; elem = elem.offsetParent; }
    return {"left":l, "top":t, "width": w, "height":h};
}
function startDrop(el, e) { 
    var fr = false;
    var bk = el.parentNode.getElementsByTagName('textarea'); if(!bk[0]) {
        var bk = el.parentNode.getElementsByTagName('iframe'); 
        if(isOpera) { fr = true; } if(!bk[0]) { return false; }}
    if(!bk[0].id) { bk[0].id = 'RND' + Math.floor(Math.random()*1000000); }
    var p = getElementPosition(bk[0], true, true);
    var dp = ymouse(e) - p.height;
    var plus = (p.height < 70) ? 70 : p.height;
    el.style.height = (plus + 76) + 'px';
    el.style.marginTop = (0 - plus) + 'px';//(IE) ? '-70px' : '-140px';
    el.style.marginBottom = '-70px';//(IE) ? '-70px' : '-140px';
    el.getElementsByTagName('div')[0].style.marginTop = plus + 'px';//(IE) ? '70px' : '140px';
    document.body.onmousemove = function(e){ dropENS(e, bk[0].id, dp, el, fr); }
    document.body.onmouseup = function(){ endDrop(el); }
    el.ondblclick = function(){ backDrop(bk[0].id); }
    return true;
}
function backDrop(el) {
    bk = document.getElementById(el);if(!bk) { return false; }
    bk.style.height = '75px';
    document.body.onmousemove = null; document.body.onmouseup = null;
    document.body.focus();
    return true;
}
function endDrop(el) {  
    el.getElementsByTagName('div')[0].style.marginTop = '0px';
    el.style.height = '6px';
    el.style.marginTop = '0px';
    el.style.marginBottom = '0px';
    document.body.onmousemove = null; document.body.onmouseup = null;
    document.body.focus();
    return true; }
function dropENS(e, bkid, dp, el, fr) {
    bk = document.getElementById(bkid); if(!bk) { return false; }
    var fy = ymouse(e) - dp; if(fy < 70) { fy = 70; }
    bk.style.height = fy + 'px';
    if(fr) { bk.document.getElementById('xEditingArea').style.height = (bk.document.body.offsetHeight - 58) + 'px'; }
    el.style.height = (fy + 76) + 'px';
    el.style.marginTop = (0 - fy) + 'px';
    el.style.marginBottom = '-70px';
    el.getElementsByTagName('div')[0].style.marginTop = fy + 'px';
    return true;
}
</script>

<div class="area"><iframe>{V}</iframe><div class="dropNS" onmousedown="startDrop(this, event);"><div></div></div></div>
<div class="area"><iframe>{V}</iframe><div class="dropNS" onmousedown="startDrop(this, event);"><div></div></div></div>
<div class="area"><iframe>{V}</iframe><div class="dropNS" onmousedown="startDrop(this, event);"><div></div></div></div>

</body>
</html>

работает в ИЕ6, ИЕ7, ИЕ8, опера 9.5, ФФ3, ГуглХром

таким образом, осталась всего одна проблема, но к сожалению, на этом примере она не воспроизводится.
в ИЕ6, если несколько блоков, и схватить за ползунок одного из них, то остальные исчезают. также исчезает ряд других элементов управления.
наверное, это как-то связано со скрытыми слоями, но пока проблему не выцепил
PM MAIL WWW   Вверх
SelenIT
Дата 1.1.2010, 02:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


баг форума
****


Профиль
Группа: Завсегдатай
Сообщений: 3996
Регистрация: 17.10.2006
Где: Pale Blue Dot

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



Цитата(bars80080 @  30.12.2009,  13:54 Найти цитируемый пост)
слой не реагирует на изменение marginTop, но при этом, если назначить слою бордюр (тот закомментированный стиль), то работает нормально во всех браузерах.

Видимо, это схлопывание маргинов. А в IE<8 ошибка, что все относительно позиционированные элементы создают новый контекст форматирования (а должны только с явно заданным z-index'ом). А просто top-ом/left-ом (раз элемент относительно позиционируется) двигать нельзя?


--------------------
Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму!
PM MAIL   Вверх
12345c
Дата 1.1.2010, 03:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Круглый
****


Профиль
Группа: Vingrad developer
Сообщений: 2018
Регистрация: 26.12.2005
Где: наша не пропадала ?

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



Цитата(bars80080 @  31.12.2009,  11:08 Найти цитируемый пост)
может быть мне нужен небольшой размер текстареи (бывает и так)
Тогда, как предлагал, 
Цитата(12345c @  31.12.2009,  00:04 Найти цитируемый пост)
Если при этом надо ограничить максимальную высоту, вводим ещё один параметр максимальной высоты. Тогда и понадобится визуальная область перетаскивания. Тронули её - высота фиксируется.
Т.е. вместе с авто-grow можно зафиксировать область, двинув ползунок 1 раз (как в Экселе ячейка).



--------------------
Google Code Playground - онлайн-отладка своих примеров HTML+JS без регистрации, с сохранением по URL, без кириллицы. Go
PM WWW   Вверх
cardinal
Дата 1.1.2010, 04:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

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



Цитата(12345c @  1.1.2010,  01:52 Найти цитируемый пост)
Т.е. вместе с авто-grow можно зафиксировать область, двинув ползунок 1 раз (как в Экселе ячейка).

Простите, а Вы с какой планетЫ? smile 


--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
bars80080
Дата 2.1.2010, 12:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

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



Цитата(12345c @  1.1.2010,  02:52 Найти цитируемый пост)
Т.е. вместе с авто-grow можно зафиксировать область, двинув ползунок 1 раз (как в Экселе ячейка).

не понял, а чем это отличается от моего?
или я не догнал как


Цитата(SelenIT @  1.1.2010,  01:31 Найти цитируемый пост)
А просто top-ом/left-ом (раз элемент относительно позиционируется) двигать нельзя?

хотелось бы поменьше опираться на то, что за пределами ползунка. то есть вещь должна быть сама в себе
PM MAIL WWW   Вверх
12345c
Дата 4.1.2010, 03:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Круглый
****


Профиль
Группа: Vingrad developer
Сообщений: 2018
Регистрация: 26.12.2005
Где: наша не пропадала ?

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



Цитата(bars80080 @  2.1.2010,  12:07 Найти цитируемый пост)
не понял, а чем это отличается от моего?
В плане ползунка - авто-grow текстареи, если его не трогаешь.

У Вас ещё хороший функционал на dblclick повешен - возврат к исходному. Это, правда, неочевидно, требует подсказки юзеру. А вобще, если задаться вопросом, что для ред.области нужно для полного комфорта - это авторост, обсуждаемый ползунок и операция возврата к авторосту.



--------------------
Google Code Playground - онлайн-отладка своих примеров HTML+JS без регистрации, с сохранением по URL, без кириллицы. Go
PM WWW   Вверх
Страницы: (3) [Все] 1 2 3 
Ответ в темуСоздание новой темы Создание опроса
Форум для вопросов, которые имеются в справочниках, но их поиск вызвал затруднения, или для разработчика требуется совет или просьба отыскать ошибку. Напоминаем: 1) чётко формулируйте вопрос, 2) приведите пример того, что уже сделано, 3) укажите явно, нужен работающий пример или подсказка о том, где найти информацию.
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: Общие вопросы | Следующая тема »


 




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


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

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