Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
张重言
rails
提交
9ef4b70b
R
rails
项目概览
张重言
/
rails
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
R
rails
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
9ef4b70b
编写于
4月 29, 2011
作者:
S
Santiago Pastorino
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Update jquery-ujs and prototype-ujs
上级
50762641
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
290 addition
and
160 deletion
+290
-160
railties/lib/rails/generators/rails/app/templates/vendor/assets/javascripts/jquery_ujs.js
...ils/app/templates/vendor/assets/javascripts/jquery_ujs.js
+280
-144
railties/lib/rails/generators/rails/app/templates/vendor/assets/javascripts/prototype_ujs.js
.../app/templates/vendor/assets/javascripts/prototype_ujs.js
+10
-16
未找到文件。
railties/lib/rails/generators/rails/app/templates/vendor/assets/javascripts/jquery_ujs.js
浏览文件 @
9ef4b70b
...
...
@@ -3,151 +3,287 @@
*
* Requires jQuery 1.4.3 or later.
* https://github.com/rails/jquery-ujs
* Uploading file using rails.js
* =============================
*
* By default, browsers do not allow files to be uploaded via AJAX. As a result, if there are any non-blank file fields
* in the remote form, this adapter aborts the AJAX submission and allows the form to submit through standard means.
*
* The `ajax:aborted:file` event allows you to bind your own handler to process the form submission however you wish.
*
* Ex:
* $('form').live('ajax:aborted:file', function(event, elements){
* // Implement own remote file-transfer handler here for non-blank file inputs passed in `elements`.
* // Returning false in this handler tells rails.js to disallow standard form submission
* return false;
* });
*
* The `ajax:aborted:file` event is fired when a file-type input is detected with a non-blank value.
*
* Third-party tools can use this hook to detect when an AJAX file upload is attempted, and then use
* techniques like the iframe method to upload the file instead.
*
* Required fields in rails.js
* ===========================
*
* If any blank required inputs (required="required") are detected in the remote form, the whole form submission
* is canceled. Note that this is unlike file inputs, which still allow standard (non-AJAX) form submission.
*
* The `ajax:aborted:required` event allows you to bind your own handler to inform the user of blank required inputs.
*
* !! Note that Opera does not fire the form's submit event if there are blank required inputs, so this event may never
* get fired in Opera. This event is what causes other browsers to exhibit the same submit-aborting behavior.
*
* Ex:
* $('form').live('ajax:aborted:required', function(event, elements){
* // Returning false in this handler tells rails.js to submit the form anyway.
* // The blank required inputs are passed to this function in `elements`.
* return ! confirm("Would you like to submit the form with missing info?");
* });
*/
(
function
(
$
)
{
// Triggers an event on an element and returns the event result
function
fire
(
obj
,
name
,
data
)
{
var
event
=
new
$
.
Event
(
name
);
obj
.
trigger
(
event
,
data
);
return
event
.
result
!==
false
;
}
// Submits "remote" forms and links with ajax
function
handleRemote
(
element
)
{
var
method
,
url
,
data
,
dataType
=
element
.
attr
(
'
data-type
'
)
||
(
$
.
ajaxSettings
&&
$
.
ajaxSettings
.
dataType
);
if
(
element
.
is
(
'
form
'
))
{
method
=
element
.
attr
(
'
method
'
);
url
=
element
.
attr
(
'
action
'
);
data
=
element
.
serializeArray
();
// memoized value from clicked submit button
var
button
=
element
.
data
(
'
ujs:submit-button
'
);
if
(
button
)
{
data
.
push
(
button
);
element
.
data
(
'
ujs:submit-button
'
,
null
);
}
}
else
{
method
=
element
.
attr
(
'
data-method
'
);
url
=
element
.
attr
(
'
href
'
);
csrf_token
=
$
(
'
meta[name=csrf-token]
'
).
attr
(
'
content
'
);
csrf_param
=
$
(
'
meta[name=csrf-param]
'
).
attr
(
'
content
'
);
data
=
{};
data
[
csrf_param
]
=
csrf_token
;
}
$
.
ajax
({
url
:
url
,
type
:
method
||
'
GET
'
,
data
:
data
,
dataType
:
dataType
,
// stopping the "ajax:beforeSend" event will cancel the ajax request
beforeSend
:
function
(
xhr
,
settings
)
{
if
(
settings
.
dataType
===
undefined
)
{
xhr
.
setRequestHeader
(
'
accept
'
,
'
*/*;q=0.5,
'
+
settings
.
accepts
.
script
);
}
return
fire
(
element
,
'
ajax:beforeSend
'
,
[
xhr
,
settings
]);
},
success
:
function
(
data
,
status
,
xhr
)
{
element
.
trigger
(
'
ajax:success
'
,
[
data
,
status
,
xhr
]);
},
complete
:
function
(
xhr
,
status
)
{
element
.
trigger
(
'
ajax:complete
'
,
[
xhr
,
status
]);
},
error
:
function
(
xhr
,
status
,
error
)
{
element
.
trigger
(
'
ajax:error
'
,
[
xhr
,
status
,
error
]);
}
});
}
// Handles "data-method" on links such as:
// <a href="/users/5" data-method="delete" rel="nofollow" data-confirm="Are you sure?">Delete</a>
function
handleMethod
(
link
)
{
var
href
=
link
.
attr
(
'
href
'
),
method
=
link
.
attr
(
'
data-method
'
),
csrf_token
=
$
(
'
meta[name=csrf-token]
'
).
attr
(
'
content
'
),
csrf_param
=
$
(
'
meta[name=csrf-param]
'
).
attr
(
'
content
'
),
form
=
$
(
'
<form method="post" action="
'
+
href
+
'
"></form>
'
),
metadata_input
=
'
<input name="_method" value="
'
+
method
+
'
" type="hidden" />
'
;
if
(
csrf_param
!==
undefined
&&
csrf_token
!==
undefined
)
{
metadata_input
+=
'
<input name="
'
+
csrf_param
+
'
" value="
'
+
csrf_token
+
'
" type="hidden" />
'
;
}
form
.
hide
().
append
(
metadata_input
).
appendTo
(
'
body
'
);
form
.
submit
();
}
function
disableFormElements
(
form
)
{
form
.
find
(
'
input[data-disable-with]
'
).
each
(
function
()
{
var
input
=
$
(
this
);
input
.
data
(
'
ujs:enable-with
'
,
input
.
val
())
.
val
(
input
.
attr
(
'
data-disable-with
'
))
.
attr
(
'
disabled
'
,
'
disabled
'
);
});
}
function
enableFormElements
(
form
)
{
form
.
find
(
'
input[data-disable-with]
'
).
each
(
function
()
{
var
input
=
$
(
this
);
input
.
val
(
input
.
data
(
'
ujs:enable-with
'
)).
removeAttr
(
'
disabled
'
);
});
}
function
allowAction
(
element
)
{
var
message
=
element
.
attr
(
'
data-confirm
'
);
return
!
message
||
(
fire
(
element
,
'
confirm
'
)
&&
confirm
(
message
));
}
function
requiredValuesMissing
(
form
)
{
var
missing
=
false
;
form
.
find
(
'
input[name][required]
'
).
each
(
function
()
{
if
(
!
$
(
this
).
val
())
missing
=
true
;
});
return
missing
;
}
$
(
'
a[data-confirm], a[data-method], a[data-remote]
'
).
live
(
'
click.rails
'
,
function
(
e
)
{
var
link
=
$
(
this
);
if
(
!
allowAction
(
link
))
return
false
;
if
(
link
.
attr
(
'
data-remote
'
)
!=
undefined
)
{
handleRemote
(
link
);
return
false
;
}
else
if
(
link
.
attr
(
'
data-method
'
))
{
handleMethod
(
link
);
return
false
;
}
});
$
(
'
form
'
).
live
(
'
submit.rails
'
,
function
(
e
)
{
var
form
=
$
(
this
),
remote
=
form
.
attr
(
'
data-remote
'
)
!=
undefined
;
if
(
!
allowAction
(
form
))
return
false
;
// skip other logic when required values are missing
if
(
requiredValuesMissing
(
form
))
return
!
remote
;
if
(
remote
)
{
handleRemote
(
form
);
return
false
;
}
else
{
disableFormElements
(
form
);
}
});
$
(
'
form input[type=submit], form button[type=submit], form button:not([type])
'
).
live
(
'
click.rails
'
,
function
()
{
var
button
=
$
(
this
);
if
(
!
allowAction
(
button
))
return
false
;
// register the pressed submit button
var
name
=
button
.
attr
(
'
name
'
),
data
=
name
?
{
name
:
name
,
value
:
button
.
val
()}
:
null
;
button
.
closest
(
'
form
'
).
data
(
'
ujs:submit-button
'
,
data
);
});
$
(
'
form
'
).
live
(
'
ajax:beforeSend.rails
'
,
function
(
event
)
{
if
(
this
==
event
.
target
)
disableFormElements
(
$
(
this
));
});
$
(
'
form
'
).
live
(
'
ajax:complete.rails
'
,
function
(
event
)
{
if
(
this
==
event
.
target
)
enableFormElements
(
$
(
this
));
});
// Shorthand to make it a little easier to call public rails functions from within rails.js
var
rails
;
$
.
rails
=
rails
=
{
// Link elements bound by jquery-ujs
linkClickSelector
:
'
a[data-confirm], a[data-method], a[data-remote]
'
,
// Form elements bound by jquery-ujs
formSubmitSelector
:
'
form
'
,
// Form input elements bound by jquery-ujs
formInputClickSelector
:
'
form input[type=submit], form input[type=image], form button[type=submit], form button:not([type])
'
,
// Form input elements disabled during form submission
disableSelector
:
'
input[data-disable-with], button[data-disable-with], textarea[data-disable-with]
'
,
// Form input elements re-enabled after form submission
enableSelector
:
'
input[data-disable-with]:disabled, button[data-disable-with]:disabled, textarea[data-disable-with]:disabled
'
,
// Form required input elements
requiredInputSelector
:
'
input[name][required],textarea[name][required]
'
,
// Form file input elements
fileInputSelector
:
'
input:file
'
,
// Make sure that every Ajax request sends the CSRF token
CSRFProtection
:
function
(
xhr
)
{
var
token
=
$
(
'
meta[name="csrf-token"]
'
).
attr
(
'
content
'
);
if
(
token
)
xhr
.
setRequestHeader
(
'
X-CSRF-Token
'
,
token
);
},
// Triggers an event on an element and returns false if the event result is false
fire
:
function
(
obj
,
name
,
data
)
{
var
event
=
$
.
Event
(
name
);
obj
.
trigger
(
event
,
data
);
return
event
.
result
!==
false
;
},
// Submits "remote" forms and links with ajax
handleRemote
:
function
(
element
)
{
var
method
,
url
,
data
,
dataType
=
element
.
data
(
'
type
'
)
||
(
$
.
ajaxSettings
&&
$
.
ajaxSettings
.
dataType
);
if
(
rails
.
fire
(
element
,
'
ajax:before
'
))
{
if
(
element
.
is
(
'
form
'
))
{
method
=
element
.
attr
(
'
method
'
);
url
=
element
.
attr
(
'
action
'
);
data
=
element
.
serializeArray
();
// memoized value from clicked submit button
var
button
=
element
.
data
(
'
ujs:submit-button
'
);
if
(
button
)
{
data
.
push
(
button
);
element
.
data
(
'
ujs:submit-button
'
,
null
);
}
}
else
{
method
=
element
.
data
(
'
method
'
);
url
=
element
.
attr
(
'
href
'
);
data
=
null
;
}
$
.
ajax
({
url
:
url
,
type
:
method
||
'
GET
'
,
data
:
data
,
dataType
:
dataType
,
// stopping the "ajax:beforeSend" event will cancel the ajax request
beforeSend
:
function
(
xhr
,
settings
)
{
if
(
settings
.
dataType
===
undefined
)
{
xhr
.
setRequestHeader
(
'
accept
'
,
'
*/*;q=0.5,
'
+
settings
.
accepts
.
script
);
}
return
rails
.
fire
(
element
,
'
ajax:beforeSend
'
,
[
xhr
,
settings
]);
},
success
:
function
(
data
,
status
,
xhr
)
{
element
.
trigger
(
'
ajax:success
'
,
[
data
,
status
,
xhr
]);
},
complete
:
function
(
xhr
,
status
)
{
element
.
trigger
(
'
ajax:complete
'
,
[
xhr
,
status
]);
},
error
:
function
(
xhr
,
status
,
error
)
{
element
.
trigger
(
'
ajax:error
'
,
[
xhr
,
status
,
error
]);
}
});
}
},
// Handles "data-method" on links such as:
// <a href="/users/5" data-method="delete" rel="nofollow" data-confirm="Are you sure?">Delete</a>
handleMethod
:
function
(
link
)
{
var
href
=
link
.
attr
(
'
href
'
),
method
=
link
.
data
(
'
method
'
),
csrf_token
=
$
(
'
meta[name=csrf-token]
'
).
attr
(
'
content
'
),
csrf_param
=
$
(
'
meta[name=csrf-param]
'
).
attr
(
'
content
'
),
form
=
$
(
'
<form method="post" action="
'
+
href
+
'
"></form>
'
),
metadata_input
=
'
<input name="_method" value="
'
+
method
+
'
" type="hidden" />
'
;
if
(
csrf_param
!==
undefined
&&
csrf_token
!==
undefined
)
{
metadata_input
+=
'
<input name="
'
+
csrf_param
+
'
" value="
'
+
csrf_token
+
'
" type="hidden" />
'
;
}
form
.
hide
().
append
(
metadata_input
).
appendTo
(
'
body
'
);
form
.
submit
();
},
/* Disables form elements:
- Caches element value in 'ujs:enable-with' data store
- Replaces element text with value of 'data-disable-with' attribute
- Adds disabled=disabled attribute
*/
disableFormElements
:
function
(
form
)
{
form
.
find
(
rails
.
disableSelector
).
each
(
function
()
{
var
element
=
$
(
this
),
method
=
element
.
is
(
'
button
'
)
?
'
html
'
:
'
val
'
;
element
.
data
(
'
ujs:enable-with
'
,
element
[
method
]());
element
[
method
](
element
.
data
(
'
disable-with
'
));
element
.
attr
(
'
disabled
'
,
'
disabled
'
);
});
},
/* Re-enables disabled form elements:
- Replaces element text with cached value from 'ujs:enable-with' data store (created in `disableFormElements`)
- Removes disabled attribute
*/
enableFormElements
:
function
(
form
)
{
form
.
find
(
rails
.
enableSelector
).
each
(
function
()
{
var
element
=
$
(
this
),
method
=
element
.
is
(
'
button
'
)
?
'
html
'
:
'
val
'
;
if
(
element
.
data
(
'
ujs:enable-with
'
))
element
[
method
](
element
.
data
(
'
ujs:enable-with
'
));
element
.
removeAttr
(
'
disabled
'
);
});
},
// If message provided in 'data-confirm' attribute, fires `confirm` event and returns result of confirm dialog.
// Attaching a handler to the element's `confirm` event that returns false cancels the confirm dialog.
allowAction
:
function
(
element
)
{
var
message
=
element
.
data
(
'
confirm
'
);
return
!
message
||
(
rails
.
fire
(
element
,
'
confirm
'
)
&&
confirm
(
message
));
},
// Helper function which checks for blank inputs in a form that match the specified CSS selector
blankInputs
:
function
(
form
,
specifiedSelector
,
nonBlank
)
{
var
inputs
=
$
(),
input
,
selector
=
specifiedSelector
||
'
input,textarea
'
;
form
.
find
(
selector
).
each
(
function
()
{
input
=
$
(
this
);
// Collect non-blank inputs if nonBlank option is true, otherwise, collect blank inputs
if
(
nonBlank
?
input
.
val
()
:
!
input
.
val
())
{
inputs
=
inputs
.
add
(
input
);
}
});
return
inputs
.
length
?
inputs
:
false
;
},
// Helper function which checks for non-blank inputs in a form that match the specified CSS selector
nonBlankInputs
:
function
(
form
,
specifiedSelector
)
{
return
rails
.
blankInputs
(
form
,
specifiedSelector
,
true
);
// true specifies nonBlank
},
// Helper function, needed to provide consistent behavior in IE
stopEverything
:
function
(
e
)
{
e
.
stopImmediatePropagation
();
return
false
;
},
// find all the submit events directly bound to the form and
// manually invoke them. If anyone returns false then stop the loop
callFormSubmitBindings
:
function
(
form
)
{
var
events
=
form
.
data
(
'
events
'
),
continuePropagation
=
true
;
if
(
events
!==
undefined
&&
events
[
'
submit
'
]
!==
undefined
)
{
$
.
each
(
events
[
'
submit
'
],
function
(
i
,
obj
){
if
(
typeof
obj
.
handler
===
'
function
'
)
return
continuePropagation
=
obj
.
handler
(
obj
.
data
);
});
}
return
continuePropagation
;
}
};
// ajaxPrefilter is a jQuery 1.5 feature
if
(
'
ajaxPrefilter
'
in
$
)
{
$
.
ajaxPrefilter
(
function
(
options
,
originalOptions
,
xhr
){
rails
.
CSRFProtection
(
xhr
);
});
}
else
{
$
(
document
).
ajaxSend
(
function
(
e
,
xhr
){
rails
.
CSRFProtection
(
xhr
);
});
}
$
(
rails
.
linkClickSelector
).
live
(
'
click.rails
'
,
function
(
e
)
{
var
link
=
$
(
this
);
if
(
!
rails
.
allowAction
(
link
))
return
rails
.
stopEverything
(
e
);
if
(
link
.
data
(
'
remote
'
)
!==
undefined
)
{
rails
.
handleRemote
(
link
);
return
false
;
}
else
if
(
link
.
data
(
'
method
'
))
{
rails
.
handleMethod
(
link
);
return
false
;
}
});
$
(
rails
.
formSubmitSelector
).
live
(
'
submit.rails
'
,
function
(
e
)
{
var
form
=
$
(
this
),
remote
=
form
.
data
(
'
remote
'
)
!==
undefined
,
blankRequiredInputs
=
rails
.
blankInputs
(
form
,
rails
.
requiredInputSelector
),
nonBlankFileInputs
=
rails
.
nonBlankInputs
(
form
,
rails
.
fileInputSelector
);
if
(
!
rails
.
allowAction
(
form
))
return
rails
.
stopEverything
(
e
);
// skip other logic when required values are missing or file upload is present
if
(
blankRequiredInputs
&&
rails
.
fire
(
form
,
'
ajax:aborted:required
'
,
[
blankRequiredInputs
]))
{
return
!
remote
;
}
if
(
remote
)
{
if
(
nonBlankFileInputs
)
{
return
rails
.
fire
(
form
,
'
ajax:aborted:file
'
,
[
nonBlankFileInputs
]);
}
// If browser does not support submit bubbling, then this live-binding will be called before direct
// bindings. Therefore, we should directly call any direct bindings before remotely submitting form.
if
(
!
$
.
support
.
submitBubbles
&&
rails
.
callFormSubmitBindings
(
form
)
===
false
)
return
rails
.
stopEverything
(
e
);
rails
.
handleRemote
(
form
);
return
false
;
}
else
{
// slight timeout so that the submit button gets properly serialized
setTimeout
(
function
(){
rails
.
disableFormElements
(
form
);
},
13
);
}
});
$
(
rails
.
formInputClickSelector
).
live
(
'
click.rails
'
,
function
(
event
)
{
var
button
=
$
(
this
);
if
(
!
rails
.
allowAction
(
button
))
return
rails
.
stopEverything
(
event
);
// register the pressed submit button
var
name
=
button
.
attr
(
'
name
'
),
data
=
name
?
{
name
:
name
,
value
:
button
.
val
()}
:
null
;
button
.
closest
(
'
form
'
).
data
(
'
ujs:submit-button
'
,
data
);
});
$
(
rails
.
formSubmitSelector
).
live
(
'
ajax:beforeSend.rails
'
,
function
(
event
)
{
if
(
this
==
event
.
target
)
rails
.
disableFormElements
(
$
(
this
));
});
$
(
rails
.
formSubmitSelector
).
live
(
'
ajax:complete.rails
'
,
function
(
event
)
{
if
(
this
==
event
.
target
)
rails
.
enableFormElements
(
$
(
this
));
});
})(
jQuery
);
railties/lib/rails/generators/rails/app/templates/vendor/assets/javascripts/prototype_ujs.js
浏览文件 @
9ef4b70b
(
function
()
{
Ajax
.
Responders
.
register
({
onCreate
:
function
(
request
)
{
var
token
=
$$
(
'
meta[name=csrf-token]
'
)[
0
];
if
(
token
)
{
if
(
!
request
.
options
.
requestHeaders
)
request
.
options
.
requestHeaders
=
{};
request
.
options
.
requestHeaders
[
'
X-CSRF-Token
'
]
=
token
.
readAttribute
(
'
content
'
);
}
}
});
// Technique from Juriy Zaytsev
// http://thinkweb2.com/projects/prototype/detecting-event-support-without-browser-sniffing/
function
isEventSupported
(
eventName
)
{
...
...
@@ -189,20 +199,4 @@
document
.
on
(
'
ajax:complete
'
,
'
form
'
,
function
(
event
,
form
)
{
if
(
form
==
event
.
findElement
())
enableFormElements
(
form
);
});
Ajax
.
Responders
.
register
({
onCreate
:
function
(
request
)
{
var
csrf_meta_tag
=
$$
(
'
meta[name=csrf-token]
'
)[
0
];
if
(
csrf_meta_tag
)
{
var
header
=
'
X-CSRF-Token
'
,
token
=
csrf_meta_tag
.
readAttribute
(
'
content
'
);
if
(
!
request
.
options
.
requestHeaders
)
{
request
.
options
.
requestHeaders
=
{};
}
request
.
options
.
requestHeaders
[
header
]
=
token
;
}
}
});
})();
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录