你可以在浏览器中执行包含的JavaScript吗?

时间:2015-10-20 05:24:37

标签: javascript dom iframe ember.js containers

我希望能够在我的网页上运行JavaScript,并保证可以干净地停止它而不会导致问题。您可以将其视为运行JavaScript,就像它包含在iFrame中一样,但允许它修改并与根DOM交互。这样,如果我删除iFrame,JS就会死掉。

用例/对齐

我想将任何网页变成奇怪的突变SPA。这意味着采用传统的HTML,CSS和JavaScript,然后自己处理页面切换。为了正确地切换页面以避免先前执行JS的工件,我需要确保一个页面的JS不与下一页的JS进行交互。理想情况下,要切换页面,它将遵循以下通用公式:

  1. 使用类似Ember.js的框架加载HTML和CSS
  2. 在包含的环境中加载所有链接的JavaScript,但能够修改根DOM
  3. 当用户点击链接时,停止所有正在运行的JavaScript 并返回步骤1.
  4. 我的想法

    我运行的测试实际上是在全屏幕iframe(like this)中加载网页,这实现了我在执行JavaScript时所需的遏制级别,但它有严重的性能损失。我想要包含的JavaScript,性能损失最小。

    我有一个想法是在下载JavaScript之后,动态地替换实际的代码。我会更改代码而不是引用Window,引用Window.parent

    我并不赞同使用iFrames的想法,但它似乎是最接近"容器"您可以使用JavaScript /浏览器。我喜欢其他选择。

    相关?

    github.com/codeschool/javascript-sandbox

    instantclick.io /

    影子DOM

    迷你跟进:

    构建这样的应用程序是否可行,以便正确处理JS生命周期和页面切换?

1 个答案:

答案 0 :(得分:1)

加载脚本后无法卸载脚本。但是你可以将一些脚本封装在一个对象中,然后创建或销毁这个对象。

例如:

var Robot = function(){
    return{
        sayHello : function(){
            alert("Hello!");
        },
        doSomethingElse : function(){
            alert("I'm doing something else");
        }
    }
}

robot = new Robot();

robot.sayHello(); // Actually alerts "Hello!"

robot = null; // the robot is destroyed.

在您的情况下,如果您通过ajax加载脚本,请在对象中说出这段脚本:

{
    sayHello : function(){
        alert("Hello!");
    },
    doSomethingElse : function(){
        alert("I'm doing something else");
    }
}

然后,您可以将此脚本封装在函数中:

var Robot = null,
    robot = null;

$.get('scriptURL', function(ajaxedScriptObject){
    Robot = function(){ return ajaxedScriptObject; };
    createRobot();
})

function createRobot(){
    robot = new Robot();
    sayHello();
    destroyRobot();
}

function sayHello(){
    robot.sayHello(); // Should alert "Hello!" :)
}

function destroyRobot(){
    robot = null;
}