Подтвердить что ты не робот

JQueryMobile: как работать со слайдерами?

Я тестирую события slider в jQueryMobile, и я должен что-то пропустить.

код страницы:

<div data-role="fieldcontain">
    <label for="slider">Input slider:</label>
    <input type="range" name="slider" id="slider" value="0" min="0" max="100"  />
</div>

и если я это сделаю:

$("#slider").data("events");

Я получаю

blur, focus, keyup, remove

Что я хочу сделать, это получить значение после того, как пользователь выпустит ручку ползунка

и имеющий крючок для события keyup как

$("#slider").bind("keyup", function() { alert('here'); } );

ничего не делает: (

Я должен сказать, что я неправильно принял, что jQueryMobile использовал jQueryUI, поскольку это была моя первая мысль, но теперь, работая глубоко в событиях, я вижу, что это не так, только с точки зрения CSS Design.

Что я могу сделать?

jQuery Mobile Slider исходный код можно найти на Git, если это помогает любой, а также тестовую страницу, можно найти в JSBin


Как я понимаю, #slider - это текстовое поле со значением, поэтому мне нужно будет подключиться к ползунку, поскольку сгенерированный код для этого ползунка:

<div data-role="fieldcontain" class="ui-field-contain ui-body ui-br">
    <label for="slider" class="ui-input-text ui-slider" id="slider-label">Input slider:</label>
    <input data-type="range" max="100" min="0" value="0" id="slider" name="slider" class="ui-input-text ui-body-null ui-corner-all ui-shadow-inset ui-body-c ui-slider-input" />
    <div role="application" class="ui-slider  ui-btn-down-c ui-btn-corner-all">
        <a class="ui-slider-handle ui-btn ui-btn-corner-all ui-shadow ui-btn-up-c" href="#" data-theme="c" role="slider" aria-valuemin="0" aria-valuemax="100" aria-valuenow="54" aria-valuetext="54" title="54" aria-labelledby="slider-label" style="left: 54%;">
            <span class="ui-btn-inner ui-btn-corner-all">
                <span class="ui-btn-text"></span>
            </span>
        </a>
    </div>
</div>

и проверять события в привязке обработчика, я получаю только событие click

$("#slider").next().find("a").data("events");

Fix

От ответа от Ivan нам просто нужно:

<div data-role="fieldcontain">
    <label for="slider">Input slider:</label>
    <input type="range" name="slider" id="slider" value="0" min="0" max="100"  />
</div>

а затем

$(document).bind("pagecreate", function(event, ui) {

    $('#slider').siblings('.ui-slider').bind('tap', function(event, ui){ makeAjaxChange($(this).siblings('input')); });
    $('#slider').siblings('.ui-slider a').bind('taphold', function(event, ui){ makeAjaxChange($(this).parent().siblings('input')); 

});

function makeAjaxChange( elem ) { 
    alert(elem.val()); 
}

Спасибо Иван за головы.

4b9b3361

Ответ 1

Мое решение вашей проблемы заключается в подключении обработчиков к событиям tap и taphold. Нажмите на крючок на элементе div ползунка, а нажатие кнопки - на элементе (кнопка управления ползунком).

HTML-разметка слайдера:

<div class="ui-field-contain ui-body ui-br" data-role="fieldcontain" id="element-boravak3">
     <label class="ui-input-text ui-slider" id="boravak3-label" for="boravak3">strop</label>
    <input class="ui-input-text ui-body-null ui-corner-all ui-shadow-inset ui-body-c ui-slider-input" name="boravak3" id="boravak3" value="0" min="0" max="100" data-type="range">
<!-- this is code that jQMobile generates -->
    <div role="application" class="ui-slider  ui-btn-down-c ui-btn-corner-all">
        <a class="ui-slider-handle ui-btn ui-btn-up-c ui-btn-corner-all ui-shadow" href="#" data-theme="c" role="slider" aria-valuemin="0" aria-valuemax="100" aria-valuenow="0" aria-valuetext="0" title="0" aria-labelledby="boravak3-label" style="left: 0%;">
            <span class="ui-btn-inner ui-btn-corner-all">
                <span class="ui-btn-text"></span>
            </span>
        </a>
    </div>
</div>

JS:

$('#' + id).slider();
$('#' + id).siblings('.ui-slider').bind('tap', function(){ makeAjaxChange($(this).siblings('input')); });
$('#' + id).siblings('.ui-slider a').bind('taphold', function(){ makeAjaxChange($(this).parent().siblings('input')); });

Функция makeAjaxChange (elem) делает обновление для сервера. Здесь есть еще одна вещь, изменение значения в поле ввода не обновляет сервер, поэтому вам нужно привязать функцию для изменения события входного элемента. Также вы должны обратить внимание на то, что при этом каждый ход управления ползунком инициирует изменение входного элемента, поэтому вы также должны обходиться.

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

Надеюсь, это поможет.

EDIT: Я забыл объяснить, почему нажмите на div.ui-слайдер и нажмите на a.ui-слайдер. div.ui-handler tap - для события click/tap, когда пользователь просто нажимает или нажимает палец на ползунок. Закладка a.ui-slider-handle находится после того, как пользователь двигался с помощью мыши или пальца влево/вправо по ползунку и отпускал его.

Иван

Ответ 2

Попробуйте этот код:

$( "#slider-1").on('slidestop', function( event ) {
   var slider_value=$("#slider-1").slider().val();
   alert('Value: '+slider_value);
});

Я надеюсь, что эта работа для вас

Ответ 3

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

$('.ui-slider').live('mousedown', function(){$('#'+id).trigger('start');});
$('.ui-slider').live('mouseup', function(){$('#'+id).trigger('stop');});
$('.ui-slider').live('touchstart', function(){$('#volumeSlider').trigger('start');});
$('.ui-slider').live('touchend', function(){$('#volumeSlider').trigger('stop');});

Ответ 4

Я узнал, что есть некоторые проблемы с использованием решения Ivan. Если вы перетащите ползунок, остановитесь некоторое время (не поднимая кнопку мыши) и продолжайте перетаскивание слайдера, кнопка -event больше не будет запускаться.

Добавляя события vmouseup и mouseup в ползунок div, вы получаете улучшение, но ползунок все еще не запускает событие, если курсор мыши перемещается от ползунка.

Ответ 5

На основе решения @VTWood; здесь общее "исправление" для всех слайдеров jQuery-Mobile 1.1, чтобы они отправляли события start и stop в соответствующие моменты времени. Вам просто нужно отбросить этот код на свою страницу один раз, чтобы исправить все будущие слайдеры.

$(document).on({
    "mousedown touchstart": function () {
        $(this).siblings("input").trigger("start");
    },
    "mouseup touchend": function () {
        $(this).siblings("input").trigger("stop");
    }
}, ".ui-slider");

В двух словах он связывает прослушиватель событий с объектом документа, который прослушивает события mousedown и touchstart, вызванные элементами .ui-slider. После срабатывания функция обработчика найдет элемент input, который сидит рядом с элементом управления .ui-slider, который был нажат и вызывает событие start. Вы можете использовать это так:

$("#my-slider").on("start", function () { 
    console.log("User has started sliding my-slider!");
});

$("#my-slider").on("stop", function (event) {
    var value = event.target.value;
    console.log("User has finished sliding my slider, its value is: " + value);
});

Ответ 6

<input type="range" id="player-slider" value="25" min="0" max="100"/>

$( "#player-slider" ).bind( "change", function(event, ui) {
    alert ("changed!");
});

Ответ 7

Если вы хотите просто поймать событие при отпускании слайдера (скорее всего, для оптимизации запросов ajax).

Это сработало для меня:

var slider = $('#my_slider');
//as the answer from @nskeskin you have to remove the type range from your input on the html code
slider.slider({create:function(){
    //maybe this is too much hacking but until jquery provides a reference to this...
    $(this).next().children('a').bind('vmouseup', yourOnChangeCallback);
}
});

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

Ответ 8

 $('#slider').next().children('a').bind('taphold', function () {
        $('#slider').live("change", function (event, ui) {
          //do these.....
        });
    });