使用全局变量动态加载javascript



我的项目需要:

  • 将值设置为全局变量
  • 然后加载使用此全局变量的外部JavaScript
  • 然后更改变量并再次加载相同的javascript,而外部javascript看起来像(使用Google Blockly):

    Blockly.Blocks[block_name+'_autogetter_state'] = {
        init: function() {
            this.setName(block_name);
        }
    };
    

全局变量是block_name似乎因为我传递了那个变量,所以它只是传递的变量,而不是它的值。因此,如果我调用javascript两次并将其加载到一些HTML中,那么两个块看起来似乎是一样的。

可能我加载javascript的方式并不重要,我尝试过:

$('#htmlElement').append('<script src="' + jsURL + '" type="text/javascript"></script>');

也可以通过AJAX将其加载到CCD_ 1标签之间的HTML中。

所以导入的代码看起来像:

<script> var block_name='';</script>
<div id="htmlElement">
      <script>
           block_name='A';
           Blockly.Blocks[block_name+'_autogetter_state'] = {
               init: function() {
                   this.setName(block_name);
               }
           };
           block_name='B';
           Blockly.Blocks[block_name+'_autogetter_state'] = {
               init: function() {
                   this.setName(block_name);
               }
           };
       </script>
</div>

而第一个块的名称为B,第二个也是,而第一个应该是A和第二个B。有趣的部分是,当你使用名称为A的块时,它可以工作,所以系统知道名称为A,但显示名称为B。

也有可能,当它们异步加载时,全局变量被A填充了一半,变成了B,而方法后面的函数。块接管并将其注册为B…

但到目前为止,我想确保像我一样将全局变量传递给导入的javascript没有问题……我愿意接受任何建议,因为我的创造力已经在这种情况下消失了。。。

可以使用数组和循环来避免代码重复并提高可扩展性:

var block_names = ['A', 'B'];
block_names.forEach(function(block) {
  Blockly.Blocks[block + '_autogetter_state'] = {
     init: function() {
       this.setName(block);
     }
  };    
});

//edit:block_name到setName fn中的块

最新更新