使用先前加载的dom元素中定义的javascript变量

时间:2013-05-07 13:02:36

标签: javascript jquery asp.net signalr

我有一个包含以下几行脚本的容器页面:

var connection = $.connection.hub.start();

我在容器页面中动态加载了多个部分。如何在动态加载的部分视图中使用connection变量。例如:

connection
    .pipe(init)
    .done(function () {
        console.log("hey");
    });

我动态加载的视图中的上述代码段显示:

Uncaught ReferenceError: connection is not defined

提前致谢,

1 个答案:

答案 0 :(得分:1)

正如我们帮助理解的那样,如果你将它存储到window.connection中,它隐式地在javacript中创建了一个窗口对象的成员变量。

Javascript允许您“动态”创建功能和成员变量,这些功能强大但很容易被滥用。我个人尝试创建一些按全局命名空间中声明的目的分隔的全局对象。

您可以通过以下方式执行相同操作(如果使用jquery):

$().ready(function() {
   var g_someGlobalState = true;
   var g_someGlobalCounter = 0;
   // etc.
});

我认为这通常是不好的做法,因为这些声明对所有javascript库都是全局的,并且您可能有命名冲突。通常最好将自定义命名空间应用于您的代码,以确保不会发生冲突。

我使用jquery中的helper命名空间函数执行此操作,我从以下位置获取: http://elegantcode.com/2011/01/26/basic-javascript-part-8-namespaces/

$().ready(function() {

  function namespace(namespaceString) {
    var parts = namespaceString.split('.'),
      parent = window,
      currentPart = '';

    for (var i = 0, length = parts.length; i < length; i++) {
      currentPart = parts[i];
      parent[currentPart] = parent[currentPart] || {};
      parent = parent[currentPart];
    }

    return parent;
  }

  // Declare global storage
  var MyAppName_GlobalSettings = namespace('MyAppName.Settings');

  // Assign variables
  MyAppName_GlobalSettings.connection = $.connection.hub.start();

});

现在,在此javascript页面中,只要您想要访问此连接,就可以参考MyAppName_GlobalSettings.connection