存根全局命名空间以启用延迟脚本加载

时间:2010-09-23 12:57:12

标签: javascript jquery

我正在使用jQuery UI和一些其他JS库,这些库总共构成了相当大的JS(甚至缩小和组合)。我的想法是不在页面中包含脚本标记,而是删除我定义的所有函数以及jQuery的$符号,这样我在页面上的内联JS仍然可以调用它们但会点击存根。然后,存根将加载.js文件并实际调用该函数。现在的问题是:

如何将窗口对象/全局对象上的所有函数调用重定向到我的自定义函数?

我不习惯使用动态语言,所以在JS中如何做到这一点的一些建议将不胜感激。

2 个答案:

答案 0 :(得分:1)

如前所述......这可能是徒劳无功的。除非你是一名研究员并且正在为此付出代价(而且只是这样),否则我会花时间研究我的实际产品和/或重构,以便页面需要更少的不同JS库(例如。仅使用jquery) ,而不是jquery + yui)

但是,

编辑,我想是为了实际回答这个问题。只需在javascript中设置即可轻松替换任何功能。例如......

$ = function(searchString) {
    // if this method is called
    // and jquery hasn't been loaded yet
    // load jquery (which will overwrite all of your local jquery functions with its own
};

延迟加载.js文件的方法在整个网络中都有详细记录,例如: http://ajaxpatterns.org/On-Demand_Javascript

答案 1 :(得分:1)

问题的根源是使用库依赖的内联JS。我们有一个旧的遗留站点,在Smarty模板中有一堆内联JS。我最终修改了Smarty,以便我可以捕获JS调用,然后在页脚中输出它们。看起来像这样

<!-- mySubContent.inc.html -->
<div id="theTabs">
  <ul><li><!--
    ...
  --></li></ul>
  <div id="tab1"><!--
    ...
  --></div>
</div>
{capture_js}
  $("#theTabs").tabs();
{/capture_js}

<!-- footer.inc.html -->
  <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
  <script type="text/javascript">
    {render_captured_js}
  </script>
</body>
</html>

无论如何,如果你现在不能重构代码库,也许会让你知道如何解决你的内联JS问题。哦,请阅读 - http://developer.yahoo.net/blog/archives/2007/07/high_performanc_5.html