/
jquery.comet.js
122 lines (107 loc) · 3.79 KB
/
jquery.comet.js
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
(function($) {
$.comet = function(options){
var open = false;
var connect = null;
var datetime = 0;
var settings = $.extend({
//Options
timeout: 60000,
wait: 3, //seconds
type: 'GET',
dataType: 'json',
autoStart: true,
debug: false,
datetime: true,
url: '', // required
data: {},
// Events
onMessage: null,
onError: null,
beforeRequest: null,
}, options);
if(settings.url == null || settings.url == ''){
console.error('url can not be empty');
return 1;
}
if(settings.debug){ console.log('init comet object') }
fetch = function() {
if (open){ return 1; }
open = true;
if (settings.beforeRequest != null) {
settings.beforeRequest();
}
var data = settings.data;
if(settings.datetime){
data = $.extend(data, {datetime: datetime});
}
connect = $.ajax({
url: settings.url,
type: settings.type,
timeout: settings.timeout,
dataType: settings.dataType,
data: data,
async: true,
cache: false,
//contentType: 'multipart/form-data',
ifModified: true,
success: function(data, textStatus, jqXHR) {
//jQuery.comet.handle_update(data);
if (settings.onMessage != null) {
settings.onMessage(data, textStatus, jqXHR);
}
open = false;
if (settings.datetime===true && typeof data.datetime !== 'undefined') {
datetime = data.datetime;
}
setTimeout(fetch, settings.wait);
},
//complete: function(){
// console.log('complete');
//},
error: function(jqXHR, textStatus, errorThrown) {
open = false;
if (textStatus == 'timeout') {
if(settings.debug){ console.log('response timeout') }
setTimeout(fetch, settings.wait);
} else {
if (settings.onError != null) {
settings.onError(jqXHR, textStatus, errorThrown);
}else{
console.error('response error: ');
console.error(jqXHR);
}
}
}
});
return 0;
}
this.setData = function(data, recursively = false){
settings.data = $.extend(recursively, settings.data, data);
}
this.start = function(){
if (settings.url != null && settings.url != '') {
open = false;
if(settings.debug){ console.log('comet started!') }
fetch();
}else{
console.error('url to open not found!');
}
}
this.stop = function(){
open = true;
if( connect != null){
connect.abort();
if(settings.debug){ console.log('comet stoped!') }
connect = null;
}
}
this.restart = function(){
this.stop();
this.start();
}
if(settings.autoStart){
this.start();
}
return this;
}
}(jQuery));