Reputation: 169
I'm trying to make a slider, which on reaching a specific value, redirects to another url. The code is http://jsfiddle.net/9vs2n/
HTML:-
<div id="slide-wrap">
<div id="over">
<div id="overin"></div>
</div>
<input type="range" id="in" class="slideToUnlock" value="0" max="100">
</div>
CSS:-
body {
color:white;
background: #323232;
margin:0;
padding:0;
}
#over {
width:80%;
border:solid thick rgba(255, 255, 255, 0.5);
margin:0 auto;
padding:0;
height:55px;
display:block;
position:relative;
background:rgba(255, 255, 255, 0.75);
border-bottom-left-radius:1em;
border-top-right-radius:1em;
}
#overin {
appearance:none;
-webkit-appearance:none;
-moz-appearance:none;
background:#60a917;
width:75px;
height:55px;
display:block;
border-bottom-left-radius:1em;
border-top-right-radius:1em;
}
#in {
outline:none;
-moz-appearance:none;
-webkit-appearance:none;
appearance:none;
width:80%;
margin:0 auto;
margin-top:-55px;
padding:0;
height:55px;
display:block;
position:relative;
background:rgba(0, 0, 0, 0);
}
#overin:before {
color: white;
position:relative;
right:10px;
top: -10px;
width:99%;
font-size: 56px;
font-weight: bold;
content:">";
display:inline-block;
text-align:end;
}
#in::-webkit-slider-thumb {
cursor:pointer;
appearance:none;
-webkit-appearance:none;
-moz-appearance:none;
background:rgba(0, 0, 0, 0);
width:75px;
height:55px;
display:block;
}
#over:before {
content:"slide to continue";
color: white;
position: absolute;
left: 100px;
top: 10px;
z-index: -1;
font-size: 32px;
}
#slide-wrap {
margin:10px auto;
}
JavaScript:-
document.getElementById('in').onmouseup = function () {
var val = document.getElementById('in').value;
if (val >= 50) {
window.location.href = "http://www.example.com/";
} else {
this.value = 0;
zero()
}
}
document.getElementById('in').onmousemove = function () {
enlarge();
}
function enlarge() {
if (document.getElementById('in').value > 10) {
document.getElementById('overin').style.width = document.getElementById('in').value + "%";
}
}
function zero() {
document.getElementById('overin').style.width = '80px';
}
setInterval(loop1(), 1);
function loop1() {
document.getElementById('over').style.width = document.getElementById('in').style.width;
}
It works properly, but the problem is that it's not working on touch devices, i've tried it on ipad, please try and try to solve this. The page is available at https://dl.dropboxusercontent.com/u/99185097/donotdelete/index.html
Upvotes: 0
Views: 1828
Reputation: 11371
Simple. You'll have to add some touch events to this. onmouseup
& onmousestart
will trigger only mouse events and from what I've seen, doesnt work on touch screens. The events you have to add are touchmove
& touchend
as well. Here's a reference link from MDN for touch events of HTML5.
This is how your code needs to be structured :
var el = document.getElementById('in');
//mouse events
//gave names to the functions bound this, since w'll be using them two times.
el.onmousemove = enlarge;
el.onmouseup = redirect;
//touch events
//check if device has touch screen
// CREDIT : http://stackoverflow.com/a/4819886/1217785
if (is_touch_device()) {
console.log(true);
//onmousemove = touchmove
el.addEventListener("touchmove", enlarge, false)
//onmouseup = touchend
el.addEventListener("touchend", redirect, false)
}
//this function checks whether the device is a touch screen or not, else no binding will be done.
function is_touch_device() {
var isTouch = 'ontouchstart' in window ||
'onmsgesturechange' in window;
console.log(isTouch);
return isTouch;
};
//the rest of your functions
function redirect() {
var val = document.getElementById('in').value;
if (val >= 50) {
window.location.href = "http://www.example.com/";
} else {
this.value = 0;
zero()
}
}
function enlarge() {
if (document.getElementById('in').value > 10) {
document.getElementById('overin').style.width = document.getElementById('in').value + "%";
}
}
//other code
And here's the updated demo : http://jsfiddle.net/hungerpain/9vs2n/6/
Hope this helps!
Upvotes: 2