【问题标题】:Import javascript dynamically with jQuery?使用 jQuery 动态导入 javascript?
【发布时间】:2009-06-15 16:04:51
【问题描述】:

我正在尝试使用 jQuery 设置小部件框架,因此我需要通过解析小部件的 xhtml 并包含在框架页面中来导入 java 脚本。问题是这可能会导致命名空间的污染。是否可以在运行时将 java 脚本加载到命名空间中?

也许我忽略了一些更好的方法?

谢谢, 皮特

【问题讨论】:

    标签: javascript jquery dynamic


    【解决方案1】:

    正如 Josh Stodola 所说,在运行时创建变量不是问题

    var holdsWidgetUUID = "widgetUUIDValue";
    eval(holdsWidgetUUID + "= (" + data + ")");
    alert(eval(holdsWidgetUUID));
    

    或者如果你喜欢

    var UUID = "widgetUUID";
    var holdsWidgetUUID = "widgetUUIDValue";
    window["widgets"] = new Array();
    window["widgets"][holdsWidgetUUID] = data;
    alert(window["widgets"][holdsWidgetUUID]);
    

    问题是让加载的 javascript 可以像 dynamicvariablename.methodname() 一样调用

    如果您对包含的 javascript 强制执行某种编码实践,我有一个可行的解决方案。也许这会让你朝着正确的方向前进。

    这是一个小部件 javascript (works.js)。请注意,它是一个带有内部定义的字段和方法的 javascript“类”。它本身保持命名空间污染低,并允许我们实现所需的调用形式 x.getInfo()

    function () {
        this.type = 1;
        this.color = "red";
        this.getInfo = function() {
            return this.color + ' ' + this.type + ' widget';
        };
    }
    

    这是在运行时将其包含在命名空间中的文件

    <html>
    <head>
      <title>Widget Magic?</title>
      <script type='text/javascript' src='jquery.js'></script>
      <script type='text/javascript'>
        var UUID = "widgetUUID";
        var holdsWidgetUUID = "widgetUUIDValue";
        window["widgets"] = new Array();
        $.get("works.js", function(data) {
          window["widgets"][holdsWidgetUUID] = eval("(" + data + ")");
          $(document).ready(function() {
            window["widgets"][holdsWidgetUUID] = new (window["widgets"][holdsWidgetUUID])();
            alert(window["widgets"][holdsWidgetUUID].color);
            alert(window["widgets"][holdsWidgetUUID].getInfo());
          });
        });
      </script>
    </head>
    <body>
      <p>Just some stuff</p>
    </body>
    </html>
    

    【讨论】:

    • 这个解释对我帮助很大,谢谢!这种方法对我来说很棒,因为我可以指定小部件 API。
    【解决方案2】:

    你可以做这样的事情......

    var myOtherFramework = null;
    
    $.get("myScript.js", function(data) {
      myOtherFramework = eval("(" + data + ")");
    });
    

    然后像...一样引用它

    myOtherFramework.funcName();
    

    【讨论】:

    • 这就是我正在做的事情;但是,它不起作用,因为我需要在运行时定义 var myOtherFramwork 的名称。例如,javascript 的命名空间需要是小部件实例的 UUID。不幸的是,直到运行时我才知道。
    • 那么就这么简单:eval("placeUUIDhere = (" + data + ")");
    【解决方案3】:

    您加载的 javascript 本身应该已经在使用唯一的命名空间。

    【讨论】:

    • 理想情况下。天空也应该是绿色的。但事实并非如此。这不是一个很有帮助的答案!
    猜你喜欢
    • 2012-06-07
    • 2020-12-30
    • 1970-01-01
    • 2020-04-15
    • 1970-01-01
    • 2018-08-08
    • 2013-09-29
    • 2021-03-03
    • 2016-10-11
    相关资源
    最近更新 更多