-
Notifications
You must be signed in to change notification settings - Fork 1
/
jquery.mobile.fetchlinks.js
124 lines (100 loc) · 3.45 KB
/
jquery.mobile.fetchlinks.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
123
124
/*
* FetchLinks Plugin
* Copyright 2012, Toru Yoshikawa
* Dual licensed under the MIT or GPL Version 2 licenses.
*
* Changes jquery.mobile.fetchlinks.js in jQuery Mobile
* http://jquerymobile.com/
*
* Copyright 2011 (c) jQuery Project
* Dual licensed under the MIT or GPL Version 2 licenses.
* http://jquery.org/license
*/
(function( $, undefined ) {
$.widget( "mobile.fetchlink", $.mobile.widget, {
options: {
initSelector: ":jqmData(target)"
},
_create: function() {
var self = $( this.element ),
target = self.attr( "href" ) ? self : self.find( "a" ).not( ":jqmData(target)" );
target.bind("click", function(e) {
var el = $( this ),
url = el.attr( "href" ),
target = self.jqmData( "target" ),
targetEl = target && $( target ) || self,
fragment = self.jqmData( "fragment" ),
load = fragment || ":jqmData(role='page')",
// screen width replaces client width
threshold = document.documentElement.clientWidth > parseInt( el.jqmData( "breakpoint" ) || 0 ),
methods = [ "append", "prepend", "replace", "before", "after" ],
method = "html",
url;
if ( threshold ) {
for( var ml = methods.length, i = 0; i < ml; i++ ){
if( el.is( ":jqmData(method='" + methods[ i ] + "')" ) ){
method = methods[ i ];
}
}
if ( method === "replace" ){
method += "With";
}
if ( url && method ) {
targetEl.ajaxStart(function(){
var $el = $(this);
$el
.addClass('ui-loading-inline')
.trigger('inlineLoader', { method: method })
.height( $el.height() );
});
// Same-Origin
if ( !$.mobile.path.isSameDomain(url) ) {
return true;
}
$.get( url, function( resp ) {
var rscript = /<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,
data = $( $("<div/>").append( resp.replace( rscript, "" ) ).find( load ) )
responseEl = !fragment ? $( data.html() ) : data,
normalizePath = function( sel, attr ) {
responseEl.find( sel ).each(function() {
var $el = $(this),
oPath = $el.attr( attr );
$el.attr( attr, $.mobile.path.parseUrl( url ).directory + oPath );
});
};
normalizePath( 'img', 'src' );
normalizePath( 'a', 'href');
setTimeout(function() {
targetEl[ method ]( responseEl.addClass('fade in') );
targetEl.filter( ':jqmData(role="listview")' ).length && targetEl.listview( "refresh" );
targetEl
.removeClass('ui-loading-inline')
.height('auto');
// Page initialize
responseEl.filter( ':jqmData(role="page")' ).length && responseEl.page();
responseEl.trigger( "create" );
}, 300);
});
}
} else {
// Do default action
return true;
}
return false;
});
}
});
$( document ).bind( "inlineLoader", function( e, ui ){
if( ui.method === "html" ) {
//$( e.target ).children().removeClass('fade in').addClass('fade out');
setTimeout(function() {
//$( e.target ).html( "<div class='ui-loader-inline fade in'><span class='ui-icon ui-icon-loading spin'></span></div>" );
$( e.target ).html( "<div class='ui-loader ui-corner-all ui-body-a ui-loader-default'><span class='ui-icon ui-icon-loading'></span></div>" );
}, 300);
}
});
//auto self-init widgets
$( document ).bind( "pagecreate create", function( e ){
$( $.mobile.fetchlink.prototype.options.initSelector, e.target ).fetchlink();
});
})( jQuery );