Actualización: Como esto no ha sido respondido, estoy cambiando la pregunta un poco. Los comentarios sobre la publicación en el blog de Dean vinculado a continuación indican que esta técnica no funciona en Safari.¿Es segura la técnica de "caja de arena iframe"?
Mi pregunta ahora es: ¿funciona la técnica descrita a continuación * en los navegadores modernos y, en particular, alguien puede confirmar si funciona en Safari?
Aquí hay una más reciente blog post. Se dice en un momento:
nativosespacio aislado ... son compatibles con una variedad de navegadores, incluyendo ... Safari 2.0+
... pero luego dice que la técnica es iframe " compatible con todos los navegadores más importantes, excepto Safari, "y el retroceso que muestra implica hacer cosas raras con constructores falsificados y __proto__
que parece un poco hacky.
Casi me resulta difícil de creer que dos ventanas diferentes en realidad podrían compartir el mismo, por ejemplo, Object.prototype. ¿Qué sucede con los iframes de dominios cruzados? Si modifico prototipos en un marco, ¿se modifican los prototipos del otro marco? Esto parece una preocupación obvia de seguridad. Alguien por favor arroje algo de luz sobre esta situación.
* Por "trabajo" me refiero a My.Object != Object
, por lo que los prototipos se pueden modificar en una ventana sin afectar a la otra.
Post original
Sé que esto se ha hecho antes, pero tengo una solución específica en mente, y quiero saber si este tipo de solución se ha discutido antes y donde podría aprender qué tan confiable y bien aceptado es.
La cuestión es cómo extender los tipos nativos en javascript sin interferir en realidad con los tipos en sí mismos, por lo que simplemente alterar Array.prototype no es bueno (quizás otro código esté usando for..in con matrices). Crear un falso constructor que devuelva una matriz nativa con algunas funciones añadidas no parece una buena solución, ya que ampliar los objetos nativos parece mejor. Pero tampoco puede hacer la extensión de estilo normal de javascript dummy function switcharoo con tipos nativos, porque obtendrá errores como "push no es genérico" cuando intente llamar a funciones nativas.
Entonces, la solución que tengo en mente funciona así: cree otra ventana, agregue funcionalidad a prototipos de constructores nativos en esa ventana, y use esos constructores en su programa.
Este ejemplo se extiende Array
como My.Array
con una función each
y String
como My.String
con una función de alert
.
var My = (function(){
// create an iframe to get a separate global scope
var iframe = document.createElement('iframe');
iframe.style.height = '0px';
iframe.style.width = '0px';
iframe.style.border = 'none';
iframe.style.position = 'absolute';
iframe.style.left = '-99999px';
document.documentElement.appendChild(iframe);
var My = iframe.contentWindow;
My.String.prototype.alert = function(){
alert(this);
}
My.Array.prototype.each = function(callback){
for (var i=0, l=this.length; i<l; i++) {
callback(this[i], i);
}
}
return My;
}());
Una vez más, mi pregunta es si este enfoque se ha discutido antes, cómo se llama, dónde puedo encontrar más información, etc. Me gustaría saber si hay una manera más clara para conseguir otro ámbito global sin usar un iframe, o si es posible, esto fracasará por algún motivo en ciertos motores de JavaScript, o si alguien piensa que es una idea particularmente mala o lo que sea.
Actualización: Creo que la gente está llamando a este tipo de cosas una caja de arena iframe, que no debe confundirse con el atributo iframe caja de arena HTML5.
relacionados:
http://dean.edwards.name/weblog/2006/11/hooray/
http://webreflection.blogspot.com/2008/03/javascript-arrayobject.html
Conseguir un objeto de la ventana limpia es un uso legítimo de iframes, aunque esta técnica es la más utilizada para obtener * * deshacerse de esos métodos adicionales entonces para agregarlos ... – hugomg
missingno, tenemos información disponible sobre cualquier cosa usando actualmente ¿esta tecnica? Tiene un montón de ramificaciones extrañas e imagino que debe haber alguna discusión en la lista de correo en algún lado si se está usando –
Recuerdo haber leído una [presentación] (http://www.slideshare.net/benvinegar/modern-iframe-programming -8281214) de un chico de Disqus. Usan este tipo de truco ya que necesitan poder insertar su código básicamente en cualquier lugar. – hugomg