Не знаете, как разработать функциональность JavaScript / jQuery, которая использует XML для создания объектов HTML - PullRequest
0 голосов
/ 03 июня 2010

Я использую JavScript и jQuery для чтения XML-документа и последующего использования информации из XML для создания объектов HTML.

Все основные узлы "C" в документе XML имеют атрибут type, и в зависимости от типа я хочу запустить функцию, которая создаст новый html-объект, используя другие атрибуты, назначенные этому конкретному узлу "C". .

В настоящее время у меня есть цикл for, который извлекает каждый узел 'C' из XML, а также его атрибуты (например, ширина, высота, x, y).

Также внутри цикла for у меня есть оператор if, который проверяет атрибут 'type' текущего обрабатываемого узла 'C' и в зависимости от типа запускает другую функцию, которая затем создает новый объект HTML с атрибутами, которые были извлечены из XML.

Проблема в том, что может быть более одного узла 'C' одного и того же типа, например, когда я создаю функцию, которая будет запускаться при обнаружении узла 'C' типа '= 1', Я не могу использовать 'var p = document.createElement('p')', потому что, если узел «C» того же типа появится позже в цикле, он будет конфликтовать и переопределять этот элемент с только что созданной переменной.

Я не совсем уверен, как подойти к этому?

Вот весь мой сценарий. Если вы хотите, чтобы я уточнил какие-либо детали, пожалуйста, спросите, я уверен, что это написано не самым лучшим образом:

    var arrayIds = new Array();
$(document).ready(function(){
  $.ajax({
    type: "GET",
    url: "question.xml",
    dataType: "xml",
    success: function(xml)
    {
                  $(xml).find("C").each(function(){
                        arrayIds.push($(this).attr('ID'));
                  });


                  var svgTag = document.createElement('SVG');
                  // Create question type objects
                  function ctyp3(x,y,width,height,baC)
                  {
                      alert('test');
                      var r = document.createElement('rect');
                      r.x = x;
                      r.y = y;
                      r.width = width;
                      r.height = height;
                      r.fillcolor = baC;
                      svgTag.appendChild(r);
                  }

                  // Extract question data from XML
                  var questions = [];
                  for (j=0; j<arrayIds.length; j++)
                  { 
                    $(xml).find("C[ID='" + arrayIds[j] + "']").each(function(){
                        // pass values
                        questions[j] = {
                            typ: $(this).attr('typ'),
                            width: $(this).find("I").attr('wid'),
                            height: $(this).find("I").attr('hei'),
                            x: $(this).find("I").attr('x'),
                            y: $(this).find("I").attr('x'),
                            baC: $(this).find("I").attr('baC'),
                            boC: $(this).find("I").attr('boC'),
                            boW: $(this).find("I").attr('boW')
                        }

                        alert($(this).attr('typ'));

                        if ($(this).attr('typ') == '3')
                        {
                            ctyp3(x,y,width,height,baC);
                            // alert('pass');
                        } else {
                            // Add here
                            // alert('fail');
                        }
                    });
                  }
    }
  });
});

Ответы [ 2 ]

2 голосов
/ 03 июня 2010

Мой пример использует функцию $ .each () в jQuery и добавляет элемент к тегу <body>, используя цепочечную функцию, чтобы вам никогда не приходилось создавать переменную p.

Несмотря на то, что автор опубликовал пример кода после того, как был написан мой, я оставлю его здесь на случай, если кто-то еще сможет извлечь из него пользу.

Посмотреть на jsFiddler: http://jsfiddle.net/gKN4V/

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Untitled Document</title>
<script type="text/javascript" 
  src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.0/jquery.min.js"></script>
<script type="text/javascript">
  var xmlString = '<root>'
  + '<C type="1" x="25" y="30" text="My cool div" />'
  + '<C type="2" x="50" y="75" text="My other div" />'
  + '<C type="1" x="100" y="10" text="My fun div" />'
  + '<C type="2" x="150" y="150" text="My awesome div" />'
  + '</root>';

$(function() {
  var xml = $(xmlString);
  $("C", xml).each(function(i,o) {
    var node = $(o);

    switch(node.attr("type")) {

      case "1" :
        $("<p />", { 
          "class" : "type1",
          css : {
            left :node.attr("x") + "px",
            top : node.attr("y") + "px"
          }
        }).text(node.attr("text")).appendTo("body");
        break;

        case "2":
          $("<div />", { 
            "class" : "type2",
            css : {
              left :node.attr("x") + "px",
              top : node.attr("y") + "px"
            }
          }).text(node.attr("text")).appendTo("body");
                            break;
      }

    });
  });

</script>
<style type="text/css">
  .type1 {
    position: absolute;
    border: solid 1px gray;
    font: normal 12px Arial, Helvetica, sans-serif;
  }
  .type2 {
    position: absolute;
    border: solid 1px green;
    font: bold 12px Arial, Helvetica, sans-serif;
    color: green;
  }
</style>
</head>
<body>
</body>
</html>
0 голосов
/ 03 июня 2010

Я не могу использовать 'var p = document.createElement('p')', потому что если позже в цикле появится узел 'C' того же типа, он будет конфликтовать и переопределять этот элемент

Просто неиспользовать фиксированные имена переменных.Позвольте вашему циклу вместо этого добавлять элементы в массив:

var elementList = [];
var Cs = xml.getElementByTagName("C");
for (var i=0; i<Cs.length; i++) {
  elementList.push( whateverYourFunctionIsThatCreatesHtmlNodes(Cs[i]) );
}

или добавлять их прямо в DOM в теле цикла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...