【问题标题】:Javascript - Share Variables over different <script> tagsJavascript - 通过不同的 <script> 标签共享变量
【发布时间】:2017-04-17 10:27:25
【问题描述】:

我有一个带有两个&lt;script&gt; 标签的test.html 文件。我需要从一个到另一个共享一个变量..

示例代码:

<script type="text/javascript">
  var test = false;

  function testing() {
    test = true;
    alert('I am inside..');
  }

  testing();
</script>
...
<script type="text/javascript">
  if (test == true) {
    alert('working');
  } else {
    alert('failed');
  }
</script>

输出总是:

我在里面..

失败

我也尝试使用 window 类,但这没关系.. (window.test)

我必须做什么才能获得“工作”警报?

如果有人可以帮助我,谢谢。我看到了一些类似的问题,但答案对我来说不是解决方案。

编辑:

原代码(简体):

<head>
    ...
    <script type="text/javascript" src="detectblocker.js"></script>
    <!-- GitHub: https://github.com/sitexw/BlockAdBlock/ -->
    ...
</head>
<body>
    <script type="text/javascript">
        var blocker = false;

        function adBlockDetected() {
            blocker = true;
            alert('inside');
        }

        if(typeof blockAdBlock === 'undefined') {
            adBlockDetected();
        } else {
            blockAdBlock.onDetected(adBlockDetected);
        }

        blockAdBlock.setOption({
            checkOnLoad: true,
            resetOnEnd: true
        });
    </script>
    <div class="header">
        ...
    </div>
    <div class="content_body">
        <div class="requirs">
            <ul>
                ...
                <script type="text/javascript">
                    if (blocker == true) {
                        document.write("<li>enabled!</li>")
                    } else {
                        document.write("<li>disabled!</li>")
                    }
                </script>
                ...
            </ul>
        </div>
    </div>
    ...
</body>

输出是alert()“inside”和&lt;li&gt;“disabled”..(拦截器已启用..)。 我能看到的唯一区别是在第一个 &lt;script&gt; 标签的末尾:

blockAdBlock.setOption({
    checkOnLoad: true,
    resetOnEnd: true
});

那么为什么 sn-p 可以工作而我的代码却不行呢?令人困惑...

【问题讨论】:

  • 我将您的 sn-p 转换为现场演示,并且……它有效。不管是什么问题,你都没有在你的问题中暴露出来。
  • @xShirase — 从一开始就没有出现这个问题。编辑只是强调它从未出现过。
  • 我复制了该代码并尝试了。效果很好。问题出在哪里?
  • @13loodH4t — 编辑后……它仍然输出“启用”,所以您似乎仍然没有提供minimal reproducible example
  • 如果你点击了if(typeof blockAdBlock === 'undefined')else 分支并且blockAdBlock.onDetected 是异步的(听起来是这样),那么这是this question 的副本。由于您尚未提供minimal reproducible example,因此无法确定。

标签: javascript scope global var


【解决方案1】:

如果你在变量之前不使用var,它就会变成一个全局变量,比如

test = true;

变量test 将在页面期间以及您的下一个脚本和函数中为真。

试试这个:

    <script type="text/javascript">
      var test = false;

      function testing() {
        var test = true;
        alert('I am inside..');
      }

      testing();
    </script>
    ...
    <script type="text/javascript">
      if (test == true) {
        alert('working');
      } else {
        alert('failed');
      }
    </script>

【讨论】:

  • 它不起作用.. as var 在函数内创建一个新的变量范围。
  • "如果你在变量之前不使用 var,它会变成一个全局变量" — test 需要成为一个全局变量,它才能在第二个被读取脚本元素!
  • @alifallahi — 我刚刚在上一条评论中解释了这一点。
  • test 有 false 值,在 testing() 内部它变为 true。所以接近尾声,因为否则最后一个警报将显示失败
  • @alifallahi — 否。test 具有错误值。然后在testing 中创建一个不同的 变量,也称为test 并将true 分配给它。函数结束,第二个test 变量超出范围。然后第二个脚本读取原始的全局变量(仍然是false)。
【解决方案2】:

有两种方法。
1)创建一个隐藏元素并将您的变量从您的第一个脚本设置为该元素的属性。 这是你的隐藏元素

<input type="hidden" id="hiddenVar"/>

并且可以在javascript中设置为

document.getElementById("hiddenVar").setAttribute("myAttr",test)

现在你可以在下一个脚本中得到它

document.getElementById("hiddenVar").getAttribute("myAttr")

2) 通过 .data() 你可以阅读它here

【讨论】:

  • 在 DOM 中推东西是解决这个问题的一种非常复杂的方法。简单地使用变量就可以了……并且在问题中提供的代码中 does 。任何会破坏问题正在使用的方法的东西都可能会破坏 DOM 方法。
  • 隐藏的输入字段对我来说看起来很糟糕,我真的不想使用这个.. for 2) .data() 我会看看.. 谢谢
猜你喜欢
  • 2014-01-22
  • 1970-01-01
  • 2011-09-03
  • 2013-05-08
  • 1970-01-01
  • 1970-01-01
  • 2018-07-30
  • 2014-01-13
  • 1970-01-01
相关资源
最近更新 更多