Rappels de dialog de confirmation personnalisés pour les sous-objects

J’ai construit une boîte de dialog de confirmation personnalisée pouvant prendre en charge un rappel et des parameters à exécuter si l’utilisateur confirme l’action.

function Confirm( text, callback, params ) { var html = '\ \ \ \ '; 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 }); } 

Et un exemple d’appeler cette fonction serait:

Confirm('Are you sure? All your data will be lost!', 'window.location.replace', '../');

Donc, si l’utilisateur confirme cette action, il les redirecta vers la page précédente.

Cependant, cela ne fonctionne pas pour les sous-objects, tels que replace qui appartient à l’ location et non à la window . Pour appeler cela, je devrais l’appeler comme window['location']['replace'].call(.. : window['location']['replace'].call(..

Comment puis-je gérer les sous-objects? Quand ils sont passés comme des chaînes.

Comme si je l’appelais directement dans la largeur de la console: window['location']['replace'].call(window, '../'); cela donne l’erreur: Illegal invocation .

Pour obtenir la fonction et le contexte corrects, vous pouvez faire quelque chose comme ceci:

 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; }); 

puis utilisez-le comme ceci:

 if (callback) { if (params) { if (Array.isArray(params)) { callback.apply(context, params); } else { callback.call(context, params); } } else { callback(); } } 

Vous devez suivre le contexte tout en parcourant le chemin d’object. Quelque chose comme le code ci-dessous fonctionnerait, mais comme mentionné dans le commentaire, vous pouvez utiliser quelque chose comme chemin-object pour une solution générale.

 var context = window, split = callback.split('.'), foo = split.shift(); if(foo == 'window') foo = split.shift(); while(split.length) { context = context[foo]; foo = split.shift(); } 

à la fin de cela, vous aurez le bon context et foo à faire

 context[foo].call(context, params);