@MihailDonskoy

Не могу отловить всплытие события document.addEventListener("onmousemove", resizeBlock, false) в firefox,т.к. там нет window.event. Как это сделать?

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <link rel="stylesheet" href="main.css">
    <script src="app.js"></script>
</head>
<body>
    <div id="content" class="clear">
        <div class = "jersey_skin">
            <div class="jersey">
                <div id = "skin_block">
                    <img src="images/kvadrat.jpg" id="skin_cell">
                    <div id="block_resize"></div>
                    <div id="block_turnover"></div>
                </div>
            </div>
            <div class="skin_control">
                <div class="turn_right"></div>
                <div class="turn_left"></div>
            </div>
        </div>
        <div class="skin_border">
            <img src = "images/avatar.png" class="skin">
            <img src = "images/face.jpg" class="skin">
            <img src = "images/kaban.png" class="skin">
            <img src = "images/piratskaja_stantsija.jpg" class="skin">
            <img src = "images/stalker.jpg" class="skin">
            <img src = "images/warface.png" class="skin">
        </div>
    </div>
</body>
</html>


*{
    padding: 0;
    margin: 0;
}
#content{
    min-width:1000px;
    min-height: 500px;
    margin: 100px auto;
    width: 30%;
    height: auto; 
    border-radius: 5px;
    border: 1px solid gray;
}
.clear::after{
    content:"";
    display: block;
    clear: both;
}
.jersey_skin, .skin_border{
    min-width: 300px;
    min-height: 460px;
    width:30%;
    height: 70%;
    border-radius: 5px;
    display: inline-block;
}
.jersey_skin{
    float: left;
    margin: 20px 0 0 130px;
}
.skin_border{
    float: right;
    margin: 20px 130px 0 0;
}
.jersey{
    position: relative;
    min-width: 200px;
    min-height: 350px;
    background:url(images/jersey.jpg) no-repeat;
    background-size: 100% 100%;
}
#skin_block{
    width: 120px;
    height: 100px;
    position: absolute;
    top:90px;
    left: 88px;
    border: 1px solid red;
}
#skin_cell{
    width: 100%;
    height: 100%;
}
.skin_control{
    width: 72px;
    margin: 30px auto;    
}
.skin_control div{
    width: 34px;
    height: 34px;
    display:inline-block;
    cursor:pointer;
    background-size: 100% 100%;
}
.turn_left{
    background: url(images/turnleft.jpg);
}
.turn_right{
    background: url(images/turnright.jpg);
}
.resize{
    background: url(images/resize.jpg);
}
.resize_in{
    background: url(images/resizein.jpg);
}
.up{
    background: url(images/up.jpg);
}
.down{
    background: url(images/down.jpg);
}
.skin{
    height: 120px;
    width: 146px;
    border: 1px solid gray;
    border-radius: 10px;
    display: inline-block;
    background-size: 100% 100%;
    cursor: pointer;
}

#block_resize, #block_turnover{
    width: 0;
    height: 0;
    position: absolute;
}

#block_resize{
    border: 2px solid black;
    border-right:2px solid transparent; 
    border-bottom:2px solid transparent;
    cursor: se-resize;
    left: 95%;
    top:94%;
}
#block_turnover{
    left: 97%;
    top:96%;
    border: 2px solid grey;
    border-left:2px solid transparent; 
    border-top:2px solid transparent;
    cursor: nesw-resize;
}


//для того чтобы подгружалась сначала DOM-структура а потом функция исполнения
window.addEventListener("DOMContentLoaded",init);
window.addEventListener("DOMContentLoaded",mainBlock);


//--------------подгрузка скина при клике--------------------

function init(){
    // взяли блок в котором будет отображаться скин
    var blockSkin = document.getElementById("skin_cell");
    // взяли img-блоки со скинами
    var skin = document.getElementsByClassName("skin");
    /*делаем цикл чтобы перебрать массив skin и вытащить каждый элемент img,а затем вешаем обработчик нажатия на каждый img и в функции прописываем чтоб при нажатии src blockSkin-а был такой-же как и у выбранного img (skin[i])*/
    for(var i = 0;i<skin.length;i++){
        skin[i].addEventListener("click", function(){
            blockSkin.src = this.src;
        });
    }
}

//---------------ресайз,перемещение,поворот-------------------

var ff = 0;
var op = 0;
var ie = 0;
var chr = 0;
var skinBlock; // Основной блок
var skinResize; // Div для изменения размеров
var resizeWidth = 0; // Изменение по ширине
var resizeHeight = 0; // Изменение по высоте

// Функция определения браузера
function mainBlock(){
    var browser = navigator.userAgent;
    if(browser.indexOf("opera") !=-1) op = 1;
    if(browser.indexOf("chrome") !=-1) chr = 1;
    if(browser.indexOf("MSIE") !=-1) ie = 1;
    if(browser.indexOf("Forefox") !=-1) ff = 1;

skinBlock = document.getElementById("skin_block"); // Получаем основной блок
skinResize = document.getElementById("block_resize");// Получаем Div для изменения размеров
document.onmouseup = clearXY; // Ставим обработку на отпускание кнопки мыши на document(уменьшение-увеличение размера)
skinResize.onmousedown = setXY; // Ставим обработку на нажатие кнопки мыши на растягивание-стягивание
}

//-------------------ресайз для блока skin-cell----------------------

// Функция для получения текущих координат курсора мыши
function getXY(pos){
    if(pos){
        x = pos.pageX; // координаты x,y относительно документа(не известно)
        y = pos.pageY;
    }else{
         x = window.event.clientX; //x,y относительно рабочей области окна
         y = window.event.clientY;
    }
    return new Array(x,y); // возвращаем массив координат относительно рабочей области окна
}

// функция которая отработает при обработке на нажатие кнопки мыши
function setXY(pos){
    var point = getXY(pos); //вернулся массив координат[x,y]
    var skinBlock_W = skinBlock.clientWidth; // Текущая ширина основного блока
    var skinBlock_H = skinBlock.clientHeight; // Текущая высота основного блока
    resizeWidth = skinBlock_W - point[0];// Измеряем текущую разницу между шириной основного блока и x-координатой мыши
    resizeHeight = skinBlock_H - point[1];// Измеряем текущую разницу между высотой основного блока и y-координатой мыши

    /* Ставим обработку движения мыши на документ */
    document.onmousemove = resizeBlock;
    //прописываем чтобы отменить всплытие события и не отработало перемещение блока(т.е. событие на window)
    event.stopPropagation();
    //вешаем на документ обработчик события на движение мыши на разных браузерах
    if(ie || ff) document.addEventListener("onmousemove", resizeBlock, false);//ставим 3-м арг. fаlse чтоб отловить событие при всплытии с помощью event.stopPropagation();
    if(op || chr) document.addEventListener("onmousemove", resizeBlock, false);

    return false;// Отключаем стандартную обработку нажатия мыши skinResize.onmousedown, чтобы не было конфликтов обработчиков,так как мы использовали в качестве обработчика функцию setXY.
}

/* Функция для измерения ширины окна */
function clientWidth(){
    return document.documentElement.clientWidth == 0 ? document.body.clientWidth : document.documentElement.clientWidth;
}

/* Функция для измерения высоты окна */
function clientHeight(){
    return document.documentElement.clientHeight == 0 ? document.body.clientHeight : document.documentElement.clientHeight;
}

/* При отпускании кнопки мыши отключаем обработку движения курсора мыши */
function clearXY(){
    document.onmousemove = null;
}

function resizeBlock(pos){
    var point = getXY(pos); // вернули массив x,y
    var new_w = resizeWidth + point[0]; // Изменяем на новое значение по ширине
    var new_h = resizeHeight + point[1];// Изменяем на новое значение по высоте
    skinBlock.style.width = new_w + "px";// Устанавливаем новую ширину блока
    skinBlock.style.height = new_h + "px";// Устанавливаем новую высоту блока
    /* Если блок выходит за пределы экрана, то устанавливаем максимальные значения для ширины и высоты */
    if (skinBlock.offsetLeft + skinBlock.clientWidth > clientWidth()) skinBlock.style.width = (clientWidth() - skinBlock.offsetLeft)  + "px";
    if (skinBlock.offsetTop + skinBlock.clientHeight > clientHeight()) skinBlock.style.height = (clientHeight() - skinBlock.offsetTop) +"px";

    // ##### проверка изменения координат(для себя) #####
    console.log(point[0] + "," + point[1] + "," + resizeWidth + "," + resizeHeight + "," + new_w + "," + new_h);
}
  • Вопрос задан
  • 319 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы