子对象的自定义确认对话框回调
我已经构建了一个自定义确认对话框,可以在用户确认操作时执行回调和参数。
function Confirm( text, callback, params ) { var html = '\ \ Confirm
\ \ \ \ '; 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
而不是window
。 要调用它,我需要调用它: window['location']['replace'].call(..
我该如何处理子对象? 当它们作为字符串传递时。
好像我直接在控制台宽度中调用它: window['location']['replace'].call(window, '../');
它给出了错误: Illegal invocation
。
要获得正确的函数和上下文,您可以执行以下操作:
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(); } }
您需要在沿着对象路径行进时跟踪上下文。 类似下面的代码会起作用,但正如评论中所提到的,您可以使用类似于对象路径的东西来获得一般解决方案。
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
做
context[foo].call(context, params);