【问题标题】:getScript in noconflict-mode无冲突模式下的 getScript
【发布时间】:2015-03-22 12:48:42
【问题描述】:

由于 Wordpress 在非冲突模式下加载 jQuery,我必须将我的脚本包装在 jQuery(function($){...})

父脚本按预期执行。 但是,我有条件地通过 getScript 加载第二个脚本:

$.getScript('js/2nd.js').done(function() {
   editElem();
});

我还需要将所有内容都包含在“2nd.js”中吗?如果我不这样做,什么都不会发生 - Chromes 控制台中甚至不会引发错误。如果我包装它,它会说“editElem 未定义”——尽管我的“2nd.js”当然定义了它。

感谢您的见解。

【问题讨论】:

  • 几个月前我遇到了同样的问题。我的解决方案是,定义函数(在你的情况下为editElem),如 var tmpFnc = new Function('alert(\'hello\')');并在使用 tmpFnc() 加载脚本后调用 tmpFnc; .这就像 eval('alert(\'hello\')');希望这对您有所帮助。
  • 哇,这不是很漂亮吗?我的 2nd.js 里面有很多大功能...
  • 可能是你有任何运行时冲突。我查看了当前的项目代码。我有几个功能,这取决于用户权限。 $.getScript 由像这样的另一个先前函数触发... function login_action(){ $.getScript('core/login/login_action.js.php'); login_display_fadeout();这有效。不用担心 .php,它会生成 javascript 输出。
  • 这是在无冲突模式下运行的吗?除了无冲突模式,我没有任何问题!
  • 很高兴,会这样做

标签: jquery getscript


【解决方案1】:

最好还是包装它——noconflict 模式的目标是即使$ 变量被另一个库占用,你的代码也能正常工作。但是,正如您所发现的,您的全局函数一旦在闭包中就不再是全局的!

全局变量不被认为是 JavaScript 最好的成就,这个案例就是一个很好的例子;像 RequireJS(可能是 extended for lazy loading?)这样的模块加载器可以让生活变得更轻松。

也就是说,如果您只有两个文件并且只想从 2nd.js 导出函数,则无需任何额外的库即可:

(function ($) {
    // ... define your functions
    function editElem () {
    }
    function otherFunc () {
    }
    function privateFunc () {
    }

    // export any functions needed by scripts outside this file.
    window.LazyUtils = {
        editElem: editElem,
        otherFunc: otherFunc
    };
}( jQuery ));

之后,您应该可以从您的第一个 JS 文件、控制台或任何地方调用 LazyUtils.editElem()。该模块的名称由您决定——“LazyUtils”只是一个示例。

【讨论】:

  • 唐,我必须尽快尝试。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-08-24
  • 1970-01-01
  • 2014-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-23
相关资源
最近更新 更多