| 
 Требуется совет в реализации. В своем приложении мне необходимо по нажатию на кнопку открывать перетаскиваемое окошко посередине окна броузера, а то, что под окном затемнять и делать не кликабельным. Кто сталкивался с fckeditor - в нем это реализовано при нажатии на инструмент "вставить картинку", вставить ссылку". Вот то же самое нужно мне.  В принципе у меня все не плохо получилось с исполозованием createElement('iframe'), но немогу сделать его перетаскиваемым. А так же позиционирование посередине экрана по оси Х вызывает затруднения. В то же время могу сделать div-элемент перетаскиваемым. Но внутри этого дива есть переходы и переделать под аякс проблематично. Опять же проблема с позиционированием. Вот пока такие результаты, чего удалось добиться. Кто что подскажет, посоветует? | 
| 
 А в чем проблема с позиционированием посередине экрана? Вам всего лишь нужно найти, насколько пикселей документ проскроллен и прибавить половину видимой части документа. | 
| 
 Ось Х - горизонтальная, а не вертикальная... | 
| 
 Ну позиционирование допустим сделаю. А можно-ли сделать перетаскивание iframe-а по окну броузера? Или только див? | 
| 
 а кто мешает сделать <div><iframe/></div> Так точно будет работать. | 
| 
 Тоже думал об этом. Но как-то не красивый код получается. То, чего хочется добиться можно посмотреть вот здесь: http://www.fckeditor.net/demo если нажать на пиктограмму "вставить изображение" | 
| 
 <iframe frameborder="0" style="border: 0pt none ; margin: 0pt; padding: 0pt; background-color: transparent; background-image: none; position: fixed; top: 26px; left: 279px; width: 450px; height: 405px; z-index: 11001;" src="http://www.fckeditor.net/fckeditor/2.6.4/editor/fckdialog.html"/> вот такой там код генерится видимо через свойство window.parent в родительском окне изменяются свойства top и left для этого элемента iframe. | 
| 
 Да, это понятно. Но как они сделали его перетаскивание? И как они блокируют все окно броузера от кликов? В принципе я уже реализовал схему div+iframe, но хочется понять, как это сделано в fckeditor. | 
| 
 Цитата: 
 | 
| 
 А как это "полупрозрачный див"? | 
| 
 Я попробовал разместить див. Указываю ему ширину 100% и высоту 100%. Див появляется только в области видимости в броузере. А если проскроллить ниже, то там див уже не накрывает собой окно. | 
| 
 Абсолютно с позиционированный див, перекрывающий весь документ. z-index на 1 меньше чем у перетаскиваемого блока. | 
| 
 Цитата: 
 а для разных браузеров можно сделать так: 
/* Функция кроссбраузерной установки прозрачности
Пример: setElementOpacity(document.body, 0.5); //сделать документ прозрачным на половину
*/
function setElementOpacity(oElem, nOpacity)
{
	var p = getOpacityProperty();
	(setElementOpacity = p=="filter"?new Function('oElem', 'nOpacity', 'nOpacity *= 100;	var oAlpha = oElem.filters["DXImageTransform.Microsoft.alpha"] || oElem.filters.alpha;	if (oAlpha) oAlpha.opacity = nOpacity; else oElem.style.filter += "progid:DXImageTransform.Microsoft.Alpha(opacity="+nOpacity+")";'):p?new Function('oElem', 'nOpacity', 'oElem.style.'+p+' = nOpacity;'):new Function)(oElem, nOpacity);
}
// Функция getOpacityProperty() возвращает свойство которое используется для смены прозрачности или undefined, и может использоваться для проверки возможности изменения прозрачности браузером
function getOpacityProperty()
{
	var p;
	if (typeof document.body.style.opacity == 'string') p = 'opacity';
	else if (typeof document.body.style.MozOpacity == 'string') p =  'MozOpacity';
	else if (typeof document.body.style.KhtmlOpacity == 'string') p =  'KhtmlOpacity';
	else if (document.body.filters && navigator.appVersion.match(/MSIE ([\d.]+);/)[1]>=5.5) p =  'filter';
	
	return (getOpacityProperty = new Function("return '"+p+"';"))();
}
или в стилях: Цитата: 
 (сам использую этот скрипт. удобно) | 
| 
 И у дива должен быть установлен фон, иначе в ИЕ он не будет ничего перекрывать. | 
| 
 Я немогу сделать див на всю высоту броузера с учетом прокрутки. Ниже прокрутки у меня див уже не раширяется. Стоит абсолют; ширина, высота по 100% | 
| 
 Цитата: 
 http://javascript.ru/forum/misc/1166...j-chastyu.html ---- А разве стоит еще беспокоиться о MozOpacity и KhtmlOpacity? Вроде браузеры их, использующие, давно умерли или перешли на opacity. | 
| 
 А как это "полупрозрачный див"? { -moz-opacity: 0.5; opacity: 0.5; filter: alpha(opacity=50); } а вообще они наверное ставят обработчик только в окне iframe, а при попытке перетаскивания передают комманду в родительское окно, где срабатывает функция, которая позиционирует iframe | 
| 
 Вложений: 1 Да, с высотой окна все получилось, спасибо. Только вот обнаружил, что при перетаскивании моего дива по окну броузера иногда в броузере происходит выделение текста =( Использовал пример как здесь: Вложение 91 Может есть лучше реализация перетаскивания? У меня ж в этом диве еще ифрейм. | 
| 
 Цитата: 
 | 
| 
 Цитата: 
 | 
| 
 Цитата: 
 Цитата: 
 
if (e.preventDefault) {
	e.preventDefault();
	e.stopPropagation();
} else {
	e.returnValue = false;
	e.cancelBubble = true;
}
 | 
| 
 
if (e.preventDefault) {
	e.preventDefault();
	e.stopPropagation();
} else {
	e.returnValue = false;
	e.cancelBubble = true;
}
А куда это? | 
| 
 В начало обработчика. | 
| 
 не получается :( | 
| 
 Чтобы замутить drag'n'drop, самый простой способ это реализовать конечный автомат о трех состояниях: - начальное (ничего не перетаскивается) - перетаскиваем (поступило событие mousedown, теперь перехватываем все события mousemove) - "бросаем" (поступило событие mouseup) Реализацию этой идеи можешь посмотреть на сайте Flapjax. Другие библиотеки тоже предоставляют такую функциональность, но там все плохо с точки зрения комбинирования этого кода с твоим (compositionality). Полупрозрачный div это div с CSS-свойством opacity < 1.0 (для IE хаки нужны). ADD: блин, ответил на вопросы с первой страницы %) | 
| 
 Цитата: 
 | 
| 
 Цитата: 
 | 
| 
 Для чего реализовывать автомат, если обработка mousemove зависит только от того, нажата в данный момент кнопка мыши или нет, и больше ни от чего? | 
| 
 | 
| 
 Цитата: 
 
// dragE(element) -> EventStream { left: int, top: int }
function dragE(target) {
  // начинаем в состоянии покоя
  // moveEe :: EventStream (EventStream { left: int, top: int })
  var moveEe = extractEventE(target,'mousedown').mapE(function(md) {
    // переходим из начального состояния в состояние переноса
    var startX = md.layerX;
    var startY = md.layerY;
    // в состоянии переноса отлавливаем все события mousemove
    // и сохраняем в особый объект
    return extractEventE(document,'mousemove').mapE(function(mm) {
      mm.preventDefault(); // отменяем выделение текста
      return { element: target, // ради удобства
               left: mm.clientX - startX,  
               top: mm.clientY - startY };
    });
  });
  // терминирующее состояние
  // dropEe :: EventStream (EventStream 'a)
  var dropEe = extractEventE(document,'mouseup').mapE(function() {
    return zeroE();
  });
  // switchE "смешивает" перемещение и окончание, то есть,
  // когда поступает mouseup, то mousemove нас уже не интересуют,
  // и мы на этом заканчиваем
  return switchE(mergeE(moveEe,dropEe));
}
(беспроблемно расширяется до http://flapjax-lang.org/try/index.ht...=listdrag.html) Этот подход таки лучше указанного в статье, потому что callback'ов нету, а есть потоки событий, с которыми можно обращаться также, как и с переменными (передавать в функции, возвращать из функций, "изменять", etc.). Еще раз повторю: сначала спецификация, затем код. Иначе не будет четкого понимания, что и зачем делаем, лапша получится. | 
| 
 В общем-то получилось у меня сделать drag & drop. Всем большое спасибо! Но одна проблема еще есть: как было решено из дискуссии мой перетаскиваемый элемент на странице представляет из себя див, в который вставлен фрейм с другой html-страничкой. Так вот если БЫСТРО перетаскиваю этот слой вниз он может остановится где нибудь и не тащится дальше. Пока к нему мышкой не вернешься. Влево, вправо, вверх все отлично быстро работает. И только вниз вот такие скачки происходят. Что это может быть? | 
| 
 Все получилось с прозрачностью и остальными вопросами. Растраивает только проблема, описанная мной в предыдущем посте. Кто что посоветует? | 
| 
 | 
| 
 А можно-ли как-то ограничить область в броузере, в которой можно диву "ездить"? Чтобы он не мог сдвигаться влево вправо дальше видимости окна броузера. | 
| 
 Измерения окна, документа и элементов - тут есть определение размеров окна браузера | 
| 
 Вложений: 1 Вот собрал в кучу все свое "творчество": Вложение 98. Не могу исправить две вещи: 1. при перетаскивании всплывающего дива вниз возникают затыки. В другие стороны все хорошо. 2. Немогу ограничить область разрешенного перетаскивания этого дива. :help: | 
| 
 1) в ie когда мышь становится над iframe, события начинает принимать как раз он 2) что тебе для этого не хватает | 
| 
 1. Добавил в свой код после создания ифрейма такое: Код: document.getElementById('myPopup').onmousemove = function() { return false };2. Пытался при движении проверять значение по оси X и если достигает какого-то значения возвращал false. Работало но как-то странно. Правая граница все-время менялась при разных сеансах перетаскивания. Т.е. и не выезжала за пределы окна, но иногда и рано останавливался move. | 
| 
 Цитата: 
 2) попробуй еще раз и покажи код | 
| 
 Вложений: 1 по первому пункту если чесно не понимаю, что нужно сделать :(  По второму пункту вот исходники: Вложение 102 Правил функцию mouseMove. Вот если схватится за синюю полосу и двигать окно то влево то вправо видно, что крайние границы меняются с каждым передвижением :( | 
| Часовой пояс GMT +3, время: 20:58. |