【问题标题】:Alternatives to global variables?全局变量的替代品?
【发布时间】:2012-01-19 19:59:17
【问题描述】:

我正在努力思考全局变量的替代方案。

有问题的情况是我需要在一个 XML 中查找值并与另一个 XML(或更多)进行比较。由于 XML JQuery 本身就是一个函数,而其下的操作是函数内部的函数(呃),我无法从 2 个深度函数中获取值并在全局范围内使用它。

所以目前我无法从 1 个文件中获取 XML 值并使用它过滤另一个 XML 文件,这就是我需要帮助的地方。

我收到了 3 个 XML 文件。

文件 1 - categories.xml - 包含类别映射 比如……

<CAT>
      <OA1>True</OA1>
      <OA2>False</OA2>
      <OA3>True</OA3>
      <EP1>True</EP1>
      <EP2>False</EP2>
      <EP3>False</EP3>
</CAT>

文件 2 = oa.xml - 包含每个 OA 记录的值 比如……

<OA>
      <Name>Name 1</Name>
      <City>City</City>
      <State>ST</State>
</OA>

等等……

文件 3 = EP.xml - 包含每个 EP 记录的值 复制代码

<EP>
      <object 1></object1>
      <object 2></object2>
      <object 3></object3>
</EP>

现在,当我开始时,我认为我可以做的是允许用户选择一个类别,并根据该选择返回 2 个包含映射到该类别的值的表。

我的问题是,当 JQuery 开始解析 XML 时,它会在一个函数中进行解析(在我见过的所有示例中),所以我不知道如何在一个函数中设置一个变量并在下一个使用的函数中使用它打开第二个文件,或第三个。

这是我现在拥有的: 复制代码

<script>
      var catid = ""; // I thought this, being outside of the function would be a global varaible
      OA1 = ""; // I tried it with and without var in front
      var OAid = "";
      $(document).ready(function(){ //When opening an XML we do it in a function
        $.ajax({
            type: "GET",
            url: "xml/categories.xml",
            dataType: "xml",
            success: function(xml) {
                $(xml).find('Cat').each(function(){
                                                //Next 2 rows don't matter b/c I can't use their values outside 
                                                //of the function
                  var catid = $(this).find('Catid').text(); 
                  var OA1 = $(this).find('OA1').text();

                  $('<div class="page-wrap"></div>').html('<table><tr><td>' + catid +'</td><td>OA1 '+ OA1 +'</td></tr></table></div>').appendTo('#page-wrap');

                });
        }
       });
      });
//The only way I know how to open up the next XML, start all over again
      $(document).ready(function(){
        $.ajax({
            type: "GET",
            url: "xml/OA.xml",
            dataType: "xml",
            success: function(xml) {
                $(xml).find('OAData').each(function(){
                  var OAid = $(this).find('OAid').text();
                  $('<div class="page-wrap"></div>').html('<table><tr><td>OA ID is '+ OAid +'</td></tr></table></div>').appendTo('#page-wrap');

                });
            }
          });
         });
</script>
//Somebody shoot me

任何建议都将不胜感激 - 我什至无法考虑变量问题的比较操作 b/c。

有没有办法比较 2 个 XML 文件而我只是想念它,或者你能推荐一个使用某种临时位置的解决方案吗?

【问题讨论】:

  • 只需将第二个 $.ajax 移动到第一个的成功回调内部,您就可以访问这两个变量。
  • 就全局变量的替代品而言,我推荐data()方法api.jquery.com/jQuery.data

标签: javascript jquery xml xml-parsing


【解决方案1】:

因此,采纳@Kevin B 的建议并对其进行一些改进,如果将这些函数分解为单独的函数,则可以轻松地将值传递给不同的成功处理函数。

<script>
      var catid = ""; // I thought this, being outside of the function would be a global varaible
      OA1 = ""; // I tried it with and without var in front
      var OAid = "";
      $(document).ready(function(){ //When opening an XML we do it in a function
        $.ajax({
            type: "GET",
            url: "xml/categories.xml",
            dataType: "xml",
            success: function(xml) {
                $(xml).find('Cat').each(function(){
                                                //Next 2 rows don't matter b/c I can't use their values outside 
                                                //of the function
                  var catid = $(this).find('Catid').text(); 
                  var OA1 = $(this).find('OA1').text();

                  $('<div class="page-wrap"></div>').html('<table><tr><td>' + catid +'</td><td>OA1 '+ OA1 +'</td></tr></table></div>').appendTo('#page-wrap');

                });
              $.ajax({
                type: "GET",
                url: "xml/OA.xml",
                dataType: "xml",
                success: function(xml) { getCategoriesSuccess(xml, catid, OA1, OAid); }
              });
            }
       });
      });

      function getCategoriesSuccess(xml, catid, OA1, OAid) {
        $(xml).find('Cat').each(function(){
                                        //Next 2 rows don't matter b/c I can't use their values outside 
                                        //of the function
          var catid = $(this).find('Catid').text(); 
          var OA1 = $(this).find('OA1').text();

          $('<div class="page-wrap"></div>').html('<table><tr><td>' + catid +'</td><td>OA1 '+ OA1 +'</td></tr></table></div>').appendTo('#page-wrap');

        });
        $.ajax({
            type: "GET",
            url: "xml/OA.xml",
            dataType: "xml",
            success: function(xml) { getOASuccess(xml, OAid); }
          });
         });        
      }

      function getOASuccess(xml, OAid){
        $(xml).find('OAData').each(function(){
          var OAid = $(this).find('OAid').text();
          $('<div class="page-wrap"></div>').html('<table><tr><td>OA ID is '+ OAid +'</td></tr></table></div>').appendTo('#page-wrap');
        });
      }
</script>

因此,在您的$(document).ready()ajax 调用的success 处理程序中,您按照@Kevin B 的建议进行第二次ajax 调用。您可以通过在成功处理程序中包装函数调用来向此传递其他数据。我将在第一次调用中传递第二个嵌套函数调用(在getCategoriesSuccess 内)所需的数据,以便它可用于第二次调用。这就是我在第一个嵌套函数调用中传递OAid 的原因,因为getOASuccess 内部需要它。

我确信还有其他方法可以做到这一点,但这会给您的成功处理程序带来一些灵活性。

我希望这会有所帮助。如果还有其他问题,请告诉我,我会相应地更新我的答案。祝你好运!

【讨论】:

    猜你喜欢
    • 2012-12-09
    • 1970-01-01
    • 2017-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-13
    • 2021-09-10
    • 1970-01-01
    相关资源
    最近更新 更多