【问题标题】:Call variable from another script in HTML从 HTML 中的另一个脚本调用变量
【发布时间】:2015-07-22 17:15:38
【问题描述】:

我目前有一个 HTML 文件,其中包含一个声明如下的脚本:

<script src="//ajax.googleapis.com/ajax/libs/jquery/2.0.0/jquery.min.js"></script>
  <script type="text/javascript">                         
 $(document).ready(function() {                           
    code.......
    var a = "hello"
});                                             
  </script>              

我正在尝试在 HTML 文件中添加另一个脚本,该脚本将调用此变量“a”。现在,我正在做这样的事情:

<script type="text/javascript">                               
    alert(a);                                                              
</script>

但它没有提醒任何东西。如果我将 a 替换为“hello”之类的字符串,我会收到警报。我把变量叫错了吗?我试过寻找解决方案,但他们都说你应该能够轻松地从另一个脚本调用变量,假设脚本之前已声明和初始化。谢谢。

【问题讨论】:

  • 您的alert() 代码在遇到&lt;script&gt; 块时立即运行。其他东西只会在整个文档被解析/设置后运行,所以基本上你在变量有机会被定义之前发出警报。
  • 是什么都不提醒,还是根本不提醒?
  • 嗨,马克,这是有道理的。我会尝试快速修复。牦牛根本没有警觉。

标签: javascript jquery html variables call


【解决方案1】:

a 声明移到函数之外。

例如,

var a;

$(document).ready(function() {                           
    code.......
    a = "hello"
}); 

后来……

alert(a);

记住变量是函数范围的,所以如果你在函数内部定义它,它在函数外部是不可见的。


基于 cmets 的更新:

因为您现在在尝试与 a 变量交互时遇到了时间问题,我建议您引入事件总线(或其他一些机制)来协调时间。鉴于您已经在使用 jQuery,您可以创建一个简单的总线,如下所示:

var bus = $({});

bus.on('some-event', function() {});
bus.trigger('some-event', ...);

这实际上也有助于更好地组织代码,因为现在您实际上只需要总线是全局的,并且您可以在事件中传递数据,而不是一堆其他随机变量。

例如,

var bus = $({});

$(document).ready(function() {                           
    var a = 'hello';
    bus.trigger('some-event', { a: a });
}); 

然后在你的另一个文件中:

bus.on('some-event', function(e, data) {
    alert(data.a);
});

JSBin example(显然不是分布在多个文件中,但同样的原则适用)。

【讨论】:

  • 嗨,所以我现在可以成功调用该变量,但警报说它是未定义的,所以由于某种原因我猜该变量没有被初始化。为什么会这样?在我的代码中,我实际上是从 .ready() 函数中的文件中获取数据,并在解析数据时创建新变量,因此我不能只在 .ready() 函数之前声明和初始化变量。
  • 听上去,这只是一个执行顺序问题。基本上,在初始化变量之前,您正在等待第一个文件中的 DOM 就绪事件,但在警告变量之前,您不会在第二个文件中等待该事件。您可能需要考虑重新组织代码或引入某种事件总线来处理跨文件计时问题。
  • 啊,是的,这是有道理的。我会做一个快速修复,希望它会好起来。我会让你知道发生了什么!
  • 太棒了。您编辑的信息有效!!!因此,如果我在 ready() 函数中有多个变量,那么我是否必须为每个变量创建一个新触发器,还是必须为每个变量创建一个新的 var 总线?即 var bus2, var bus3, ...等我假设在你只需要一个触发器并可以添加多个变量的地方没有捷径。
  • 不,您只想使用一个事件总线(很可能是整个应用程序,真的)。只需在其中填充您想要的尽可能多的数据。如果/当它有意义时,您当然可以创建新事件,但是如果在 DOM 准备好后您只有一些需要公开的值,您可能只使用单个事件进行初始化。例如,bus.trigger('some-event', { a: 'hello', b: 'world', foo: 'bar' }),然后您将可以在 some-event 处理程序中访问 data.adata.bdata.foo。这是一种可塑性很强的方法。
【解决方案2】:

将您的代码替换为

<script src="//ajax.googleapis.com/ajax/libs/jquery/2.0.0/jquery.min.js"></script>
<script type="text/javascript"> 
    var a="";                        
    $(document).ready(function() {                           
        a = "hello";      
    });                                             
</script> 

现在您可以访问变量a,如下所示。

<script type="text/javascript">                               
    alert(a);                                                              
</script>

您的代码的问题在于,您在 $(document).ready() 内声明了变量 a,这使它成为 ready() 的本地变量。

【讨论】:

  • 在我的代码中,我实际上是从这个 .ready() 函数中的文件中获取数据,并且在解析数据时创建了新变量,所以我不能只在 .ready( ) 功能。无论如何我可以在一个 .ready() 函数中初始化一个变量并在另一个脚本中调用它吗?
  • 无需在ready() 中完成该操作。相反,只需在外部声明它并在内部初始化它,就像在我编辑的 asnwer 中一样。
  • 我认为这是因为我在初始化之前调用了该警报,但我也会尝试您编辑的答案。谢谢!
【解决方案3】:

当您编写内部功能块时,您将其设为局部变量,您可以将变量声明移到功能块之外,如其他答案所说,或者您可以使用:

$(document).ready(function() {                           
    window.a = "hello";
});

及以后:

alert(a);

在这两种情况下,您都将 a 声明为全局变量,不建议这样做。

【讨论】:

  • 您是否建议创建两个单独的 javascript 文件,然后在我的 HTML 文件中调用它们?
  • 并非如此,使用单独的文件不会改变范围,变量可以是全局的或本地的,即使它们位于单独的文件中。您可以定义一个全局对象变量并将其用作应用程序的命名空间。 var myApp = {} 在任何块之外,然后在功能块内部使用 myApp.a = 'Hello world' 并在第二个脚本标签上使用 alert(myApp.a)
  • 一篇非常有趣的关于js命名空间的文章addyosmani.com/blog/essential-js-namespacing
猜你喜欢
  • 2019-01-08
  • 1970-01-01
  • 2018-11-21
  • 1970-01-01
  • 1970-01-01
  • 2011-06-01
  • 2022-08-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多