我已经构建了一个自定义确认对话框,可以在用户确认操作时执行回调和参数。
function Confirm( text, callback, params )
{
var html = '\
<div class="modal-header clearfix">\
<h1 class="title">Confirm</h1>\
</div>\
<div class="modal-content">\
<p>' + ( text != null ? text : 'Are you sure you want to do this?' ) + '</p>\
</div>\
<div class="modal-footer clearfix">\
<div class="float-right">\
<div class="btn-group">\
<button class="btn ajax-modal-close">Cancel</button>\
</div>\
<div class="btn-group">\
<button class="btn important confirm">Ok</button>\
</div>\
</div>\
</div>\
';
Modal.dataModal(html, 640, 320); // Custom Modal framework
$('.confirm').click(function(e){
e.preventDefault();
if(callback)
{
if(params)
{
callback = callback.replace(/window./gi, ''); // remove window. prefix so we can call the callback on the window object below
if(Array.isArray(params))
{
window[callback].apply(window, params);
}
else
{
window[callback].call(window, params);
}
}
else
{
window[callback]();
}
}
Modal.closeModal( $('.Modal').last() ); // Custom Modal framework
});
}
调用此函数的一个例子是:
Confirm('Are you sure? All your data will be lost!', 'window.location.replace', '../');
因此,如果用户确认此操作,则会将其重定向到上一页。
但是,这对子对象不起作用,例如属于replace
而非location
的{{1}}。要调用它,我需要将其称为:window
如何处理子对象?当它们作为字符串传递时。
好像我直接在控制台宽度中调用它:window['location']['replace'].call(..
它会出错:window['location']['replace'].call(window, '../');
。
答案 0 :(得分:1)
要获得正确的功能和上下文,您可以执行以下操作:
var func_parts = callback.split("."),
context = callback = window;
$.each( func_parts, function(index){
if( this != "window" ) callback = callback[this];
if( index == func_parts.length - 2 ) context = callback;
});
然后像这样使用它:
if (callback) {
if (params) {
if (Array.isArray(params)) {
callback.apply(context, params);
} else {
callback.call(context, params);
}
} else {
callback();
}
}
答案 1 :(得分:1)
您需要在沿着对象路径行进时跟踪上下文。 类似下面的代码会起作用,但正如评论中所提到的,您可以使用类似object-path的内容来获得一般解决方案。
@override
public void onDestroy(){
//your bluetooth disconnection code
}
在这结束时,您将拥有正确的var context = window,
split = callback.split('.'),
foo = split.shift();
if(foo == 'window')
foo = split.shift();
while(split.length)
{
context = context[foo];
foo = split.shift();
}
和context
来做
foo