forked from bitovi/jquerypp
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathselection.js
More file actions
96 lines (83 loc) · 2.53 KB
/
selection.js
File metadata and controls
96 lines (83 loc) · 2.53 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
// a text selection event that is useful in mobile safari
steal('jquery/dom/range', 'jquery/event/livehack').then(function($){
var event = $.event;
event.selection = {
delay : 300,
preventDefault : event.supportTouch
};
event.setupHelper( ["selectionStart","selectionEnd","selectionEnding","selectionMoving","selectionMove"], "mousedown", function(ev){
//now start checking mousemoves to update location
var delegate = ev.delegateTarget || ev.currentTarget,
selector = ev.handleObj.selector,
ready = false,
el = this,
startRange = $.Range(ev),
getRange = function(ev){
var range = $.Range(ev),
pos = startRange.compare("START_TO_START", range),
entire;
if(pos == -1 || pos == 0){
return startRange.clone().move("END_TO_END", range)
} else {
return range.clone().move("END_TO_END", startRange)
}
},
cleanUp = function(){
$(delegate).unbind('mousemove', mousemove)
.unbind('mouseup',mouseup);
clearTimeout(moveTimer);
startRange = null;
},
mouseup = function(moveev){
if(!ready){
cleanUp();
return
}
$.each(event.find(delegate, ["selectionMoving"], selector), function(){
this.call(el, moveev, range)
});
var range = getRange(moveev);
cleanUp();
$.each(event.find(delegate, ["selectionEnd"], selector), function(){
this.call(el, ev, range);
});
},
mousemove = function(moveev){
// safari keeps triggering moves even if we haven't moved
if(moveev.clientX == ev.clientX && moveev.clientY == ev.clientY){
return;
}
if(!ready){
return cleanUp();
}
$.each(event.find(delegate, ["selectionMoving"], selector), function(){
this.call(el, moveev, range)
});
var range = getRange(moveev);
$.each(event.find(delegate, ["selectionMove"], selector), function(){
this.call(el, moveev, range)
});
},
start = function(){
ready = true;
var startEv = event.selection.preventDefault ? $.Event('selectionStart') : ev;
var startEv = $.extend(ev, startEv)
$.each(event.find(delegate, ["selectionStart"], selector), function(){
this.call(el, startEv, startRange)
});
if(event.selection.preventDefault && startEv.isDefaultPrevented()){
ready = false;
cleanUp();
}
},
moveTimer;
if(event.selection.preventDefault){
ev.preventDefault();
moveTimer = setTimeout(start, event.selection.delay);
} else {
start();
}
$(delegate).bind('mousemove', mousemove)
.bind('mouseup',mouseup)
});
});