Несколько замечаний до / для достижения оптимального решения:
- Вы объявили и инициализировали переменную
allBetween
, но не используете ее. Я предлагаю удалить его.
- В вашем
#buttonOne
прослушивателе событий вы используете несовместимые значения: 429 и 424: if($("#firstInput").val() > 429 )$("#firstInput").val(424);
- Вы используете селектор
#firstInput
(и #thirdInput
) несколько раз без кеширования ссылки.
- Вы дублируете функции для каждой кнопки. Лучшее, менее подверженное ошибкам решение - создать метод для построения этих методов.
Финальный код
Оптимизации были объяснены ранее. Я не буду их уточнять, поскольку это не тема вопроса. Я объяснил логику функции запрашиваемого поведения в комментариях сценариев (ниже).
$(document).ready(function() {
// Helper to easily bind related events to the button.
function createButtonClickEvent(sel_selector, input_selector, left_limit, right_limit) {
return function(){
var $sel = $(sel_selector),
$input = $(input_selector),
val = $input.val();
if (val > right_limit) input.val(val = right_limit);
else if (val < left_limit) input.val(val = left_limit);
$sel.css('left', val + "px");
var $allElems = $("#second").children(".single"),
$between = $allElems.inRangeX("#selFirst", "#selSecond");
$allElems.removeClass("ui-selected");
$between.addClass("ui-selected");
}
}
//setValue 1
$("#buttonOne").click(createButtonClickEvent("#selFirst", "#firstInput", 0, 429));
//setValue2
$("#buttonTwo").click(createButtonClickEvent("#selSecond", "#thirdInput", 0, 429));
//graph values
var valuesG = [],
$elements = $();
for (i = 0; i < 144; i++) {
valuesG[i] = Math.floor(Math.random() * (30 - 20 + 1) + 10);
$elements = $elements.add($("<div class='single'>")
.css('height', valuesG[i])
.css('margin-top', 30 - valuesG[i]));
}
$elements.appendTo($("#second"));
$("#second").children(".single").addClass("ui-selected");
//inRangeX (http://stackoverflow.com/a/8457155/938089)
(function($) {
$.fn.inRangeX = function(x1, x2) {
if (typeof x1 == "string" && +x1 != x1 || x1 instanceof Element) {
x1 = $(x1);
}
if (typeof x2 == "string" && +x1 != x1 || x1 instanceof Element) {
x2 = $(x2);
}
if (x1 instanceof $) {
x1 = x1.offset().left;
}
if (x2 instanceof $) {
x2 = x2.offset().left;
}
x1 = +x1;
x2 = +x2;
if (x1 > x2) {
var x = x1;
x1 = x2;
x2 = x;
}
return this.filter(function() {
var $this = $(this),
offset = $this.offset(),
rightSide = offset.left - 5;
return offset.left >= x1 + 5 && rightSide <= x2;
});
}
})(jQuery);
//firstPositions
var startFirst = $(".selector#selFirst").position().left;
var startSecond = $(".selector#selSecond").position().left;
$('input#firstInput').val(startFirst);
$('input#thirdInput').val(startSecond);
// *********** Actual requested code *********** //
//first and second-Picker
var $selFirst = $("#selFirst"),
$selSecond = $("#selSecond"),
cachedWidth = $selFirst.outerWidth();
function drag_function(event, ui){
var $firstRightBorder = $selFirst.position().left + cachedWidth,
$secondLeft = $selSecond.position().left,
diff = $firstRightBorder - $secondLeft;
/*
* The logic is as follows:
* dif < 0 if selFirst and selSecond do not overlap
* dif = 0 if they're next to each other
* dif > 0 if they overlap each other
* To fix this (reminder: if they overlap, dif is negative):
* If current == #selFirst,
* left = left + dif
* else (if current == #selSecond),
* left = left - dif
*/
if (diff > 0) {
var currentLeft = parseFloat($(this).css("left"));
if (this.id == "selSecond") diff = -diff;
ui.position.left = currentLeft - diff;
ui.helper.css("left", currentLeft - diff);
}
var $allElems = $("#second").children(".single"),
$between = $allElems.inRangeX("#selFirst", "#selSecond");
$("#firstInput").val($("#selFirst").position().left);
$("#thirdInput").val($("#selSecond").position().left);
$allElems.removeClass("ui-selected");
$between.addClass("ui-selected");
var allBetween = $('.ui-selected');
}
$("#selFirst, #selSecond").draggable({
containment: 'parent',
axis: 'x',
drag: drag_function,
stop: drag_function
});
}); //eof