два обработчика событий (щелчок и перемещение мыши) одновременно на одном элементе

Я создаю своего рода ползунок, который при щелчке в определенной точке окна элемент растягивает свою ширину до этой точки. Я также хотел бы добавить обработчик события перетаскивания, и я читал о mousedown, mousemove и mouseup, которые являются тремя обработчиками, которые необходимо объединить. Этот код работает довольно хорошо, но мне интересно, есть ли лучший способ объединить эти обработчики, потому что в данный момент я повторяю код, который, я не уверен, необходим. Я совсем новичок в javascript и jquery. Спасибо за помощь

function reposition_bar(mouse_touch_position){
    document.onclick = function(mouse_touch_position){
        var timer_bar_position = $(timer_bar);
        timer_bar_offset = timer_bar_position.offset();
        var total_width_timer = $("#timer_bar_outer0").width();
        var new_width_timer = (((mouse_touch_position.pageX - timer_bar_offset.left)/total_width_timer) * 100); /*converting to percantages because the width of the timer is in percentages in css*/
        player.currentTime = (window.duration)*(new_width_timer/100);
    }
    document.onmousemove = function(mouse_touch_position){
        var timer_bar_position = $(timer_bar);
        timer_bar_offset = timer_bar_position.offset();
        var total_width_timer = $("#timer_bar_outer0").width();
        var new_width_timer = (((mouse_touch_position.pageX - timer_bar_offset.left)/total_width_timer) * 100); /*converting to percantages because the width of the timer is in percentages in css*/
        player.currentTime = (window.duration)*(new_width_timer/100);

    }
    this.onmouseup = function() {
    document.onmousemove = null;
    }

}

и здесь я создаю прослушиватель событий.

 $(timer_area).on("mousedown", reposition_bar);

мой HTML:

<div id="timer_area0" class="timer_area">
    <div id="timer_bar_outer0" class="timer_bar_outer"></div>
    <div id="timer_bar0" class="timer_bar"></div>
</div>

и мой css:

.timer_area{
position: relative;


width: 100%;
margin: 20px auto 10px auto;
height: 20px;
backgroud: #fff;
}

.timer_bar{  
z-index: -1;
display: block;  
width: 3%;  
height: 8px;  
border-radius: 4px;  
clear: both;  
position: absolute; 
margin-top: 6px;
box-shadow: inset 0px 1px 0px 0px rgba(250,250,250,0.5),  
                0px 0px 3px 2px rgba(250,250,250,1);  
background-color: #fff; 
}  

.timer_bar_outer{
padding: 0px 3% 0px 3%; 
    width: 100%;  /*this should be same number as 100/windowduration*/
    height: 20px;  
    display: block;  
    z-index: -2;  
    position: absolute;  
    background-color: rgb(0,0,0); 
margin-left: -3%;
border-radius: 10px;  
box-shadow: 0px 1px 0px 0px rgba(250,250,250,0.1),   
                inset 0px 1px 2px rgba(0, 0, 0, 0.5); 
box-sizing: content-box;
}

.timer_bar.on{  
   background-color: blue;  
    box-shadow: inset 0px 1px 0px 0px rgba(250,250,250,0.5),  
                0px 0px 3px 2px rgba(5,242,255,1); 
}

Изменить после комментария @tlindell:

Спасибо за ваш комментарий. Я пробовал ползунки диапазона, но не смог стилизовать их с помощью css так, как хотел, после долгих исследований. (т.е. мой вертикальный ползунок работал идеально, пока я не наложил на него тень блока, и он больше не работал вертикально)... Я доволен своим ползунком. просто мне было интересно, мог ли бы я написать метод reposition_bar лучше, потому что так, как я сделал это выше, этот код:

document.onclick = function(mouse_touch_position){
            var timer_bar_position = $(timer_bar);
            timer_bar_offset = timer_bar_position.offset();
            var total_width_timer = $("#timer_bar_outer0").width();
            var new_width_timer = (((mouse_touch_position.pageX - timer_bar_offset.left)/total_width_timer) * 100); /*converting to percantages because the width of the timer is in percentages in css*/
            player.currentTime = (window.duration)*(new_width_timer/100);
        }

это точно так же, как и это, принять, что это разные обработчики событий, например, onmousemove и onclick:

document.onmousemove = function(mouse_touch_position){
            var timer_bar_position = $(timer_bar);
            timer_bar_offset = timer_bar_position.offset();
            var total_width_timer = $("#timer_bar_outer0").width();
            var new_width_timer = (((mouse_touch_position.pageX - timer_bar_offset.left)/total_width_timer) * 100); /*converting to percantages because the width of the timer is in percentages in css*/
            player.currentTime = (window.duration)*(new_width_timer/100);

        }

так что я могу объединить их, например,

document.onmousemove || document.onclick = function(mouse_touch_position){
                var timer_bar_position = $(timer_bar);
                timer_bar_offset = timer_bar_position.offset();
                var total_width_timer = $("#timer_bar_outer0").width();
                var new_width_timer = (((mouse_touch_position.pageX - timer_bar_offset.left)/total_width_timer) * 100); /*converting to percantages because the width of the timer is in percentages in css*/
                player.currentTime = (window.duration)*(new_width_timer/100);

            }

Спасибо за ваше редактирование @tlindell. Это что-то вроде того, что я хотел бы, но я попробовал следующее, что на самом деле не дало желаемого эффекта. Он не регистрирует событие mouseup.

function reposition_bar(mouse_touch_position){
    document.onmousemove = function(mouse_touch_position){
        var timer_bar_position = $(timer_bar);
        timer_bar_offset = timer_bar_position.offset();
        var total_width_timer = $("#timer_bar_outer0").width();
        var new_width_timer = (((mouse_touch_position.pageX - timer_bar_offset.left)/total_width_timer) * 100); /*converting to percantages because the width of the timer is in percentages in css*/
        player.currentTime = (window.duration)*(new_width_timer/100);

    }
    this.onmouseup = function() {
    document.onmousemove = null;
    }

}

$(timer_area).on("mousedown click", reposition_bar);

Я хотел бы, чтобы функция вызывалась с помощью onmousedown, а затем внутри функции я хотел бы, чтобы она обрабатывала события onmousemove и onclick. могу ли я сделать что-то подобное в функции reposition_bar:

function reposition_bar(mouse_touch_position){
    document.on("mousemove click") = function(mouse_touch_position){
        var timer_bar_position = $(timer_bar);
        timer_bar_offset = timer_bar_position.offset();
        var total_width_timer = $("#timer_bar_outer0").width();
        var new_width_timer = (((mouse_touch_position.pageX - timer_bar_offset.left)/total_width_timer) * 100); /*converting to percantages because the width of the timer is in percentages in css*/
        player.currentTime = (window.duration)*(new_width_timer/100);

    }
    this.onmouseup = function() {
    document.onmousemove = null;
    }

}

$(timer_area).on("mousedown", reposition_bar);

Это вообще не работает, поэтому я предполагаю, что синтаксис неверен в этой строке внутри функции:

document.on("mousemove click") = function(mouse_touch_position){

}

Спасибо еще раз. Я совсем новичок в этом :)

Спасибо @tlindell за ответ. Это то, что я сделал в конце. (см. раздел window.onload для правок)

<script>
    var player;
    var intv;
    var duration;
    var song_id;
    var button;

    //init
window.onload = function(){
        player = document.getElementById('audio_player');


            $('#volume_control_area').on('mousedown mouseup mouseleave click', function(e){
                if(e.type === 'mousedown'){
                        $(this).bind('mousemove', reposition);
                }
                else if((e.type === 'mouseup') || (e.type === 'mouseleave')) {
                        $(this).unbind('mousemove', reposition);
                }else if(e.type === 'click'){
                        $(this).bind('click', reposition);
                }
            });
}

function reposition(mouse_volume_position){

        var volume_knob_position = $(".volume_control_knob");   
        volume_area_offset = $('#volume_control_area').offset();
        var total_height_volume = $('#volume_control_area').height();
        console.log(total_height_volume);
        var new_height_volume = ((volume_area_offset.top + total_height_volume)- mouse_volume_position.pageY); /*converting to percantages because the width of the timer is in percentages in css*/

        if(new_height_volume > 8 && new_height_volume <= 100){
        console.log(new_height_volume);
        player.volume = new_height_volume/100;
        $(".volume_control_knob").css({

        'height' : new_height_volume + '%' 

        });
        }

}




</script>

person Sarah    schedule 28.04.2014    source источник


Ответы (1)


Добро пожаловать, интерфейс Jquery!

вы можете изменить размер div здесь:

изменяемый размер пользовательского интерфейса jquery

и получить ползунки диапазона здесь:

Jquery ui silders

РЕДАКТИРОВАТЬ

абсолютно! вот как это сделать.

$('#element').on('keyup keypress blur change', function() {
    ...
});

Или просто передайте функцию в качестве параметра обычным функциям событий:

var myFunction = function() {
   ...
}

$('#element')
    .keyup(myFunction)
    .keypress(myFunction)
    .blur(myFunction)
    .change(myFunction)

несколько событий jQuery для запуска одной и той же функции

ОБНОВИТЬ:

<script>
    let player;
    let intv;
    let duration;
    let song_id;
    let button;

    //init
    window.onload = function(){
        player = document.getElementById('audio_player');

        $('#volume_control_area').on('mousedown mouseup', function(e){
            if(e.type === 'mousedown'){
                $(this).bind('mousemove', reposition);
            }
            else if(e.type === 'mouseup'){
                $(this).unbind('mousemove', reposition);
            }
        })
    }

    function reposition(mouse_volume_position){
        let volume_knob_position = $(".volume_control_knob");   
        let volume_area_offset = $('#volume_control_area').offset();
        let total_height_volume = $(volume_control_area).height();
        let new_height_volume = ((volume_area_offset.top + total_height_volume)- mouse_volume_position.pageY); /*converting to percantages because the width of the timer is in percentages in css*/

        if(new_height_volume > 8 && new_height_volume <= 100){
            console.log(new_height_volume);
            player.volume = new_height_volume/100;
                $(".volume_control_knob").css({

                    'height' : new_height_volume + '%' 

                });
        }
    }   
</script>
person tylerlindell    schedule 28.04.2014
comment
Спасибо за ваш комментарий. Я знаю о ползунках в jquery. Я пробовал ползунки диапазона, но не смог стилизовать их так, как хотел. например, когда я помещал тень окна на свой вертикальный ползунок, он больше не работал как вертикальный ползунок. Я отредактировал свой вопрос, чтобы лучше объяснить, что я хотел бы... спасибо - person Sarah; 29.04.2014
comment
Я обновил свой ответ, это больше того, что вы искали? - person tylerlindell; 30.04.2014
comment
Спасибо за ваше редактирование @tlindell. Да, это очень близко к тому, что я хотел бы, но я отредактировал свой вопрос, чтобы показать вам, как именно я этого хочу :) спасибо. - person Sarah; 30.04.2014
comment
Произошло чудо, и оказалось, что мне вообще не нужен обработчик события клика. Я думаю, потому что mouseup и mousedown - это то же самое, что и щелчок. хаха. Спасибо :) - person Sarah; 30.04.2014
comment
Могу я спросить одну последнюю вещь. Что эквивалентно document.onmousemove = null; в jquery? Я пробовал это: $(document).on(mousemove, function(){}); и это: $(document).on(mousemove, null); Однако они не работают. Спасибо :) - person Sarah; 30.04.2014
comment
чего вы хотите добиться с помощью «нулевого»? для меня это выглядит так, как будто вы пытаетесь разрешить одно действие при перемещении мыши, но не хотите, чтобы это влияло на что-то еще в документе... jsfiddle может помочь мне лучше понять - person tylerlindell; 01.05.2014
comment
Я хочу завершить метод reposition(), чтобы, когда событие mouseup происходит после вызова метода reposition, событие mousemove больше не имело эффекта. вот jsfiddle jsfiddle.net/Jv6tC, но по какой-то причине он здесь не работает, поэтому я загрузил его на паутина. Не уверен, что это разрешено, но вот ссылка на него. как вы можете видеть, когда ползунок щелкнут, он перемещается на место, но затем продолжает двигаться при перемещении мыши, я бы хотел, чтобы он перестал двигаться до тех пор, пока в следующий раз не произойдет событие mousedown. funkdafone.com/demo_volume_control/demo_volume_control.htm - person Sarah; 01.05.2014
comment
Это идеально спасибо миллион. Я добавил еще несколько событий, таких как click и mouseleave, и все отлично работает! :) только что обновил свой ответ (с новыми правками) на мой вопрос :) - person Sarah; 04.05.2014