【问题标题】:Create Element in Jquery在 Jquery 中创建元素
【发布时间】:2012-08-22 00:10:48
【问题描述】:

我想像这样使用“div.someelement”在 Jquery/Javascript 中创建元素

var SomeElement = $("div.someelement");
$( "#container" ).append( SomeElement );

但我不想复制具有相同类的元素,我想创建一个新的。

document.createElement 正在创建 "<div.somelement>" 而不是 <div class="someelement">

【问题讨论】:

    标签: javascript jquery createelement


    【解决方案1】:

    只需为 jQuery 创建一个新元素:

    var $newElement = $(document.createElement("div"));
    $newElement.appendTo($("body"));
    

    如果你想在属性中简单地使用:

    $newElement.attr({
        id : "someId",
        "class" : "someClass"
    });
    

    按类记住总是这样使用“类”,因为类是保留名称

    【讨论】:

      【解决方案2】:

      由于您询问的是从 css 语法创建元素,因此您需要使用解析器来解释语法。

      这是一个您可以从中构建的示例。这将匹配一个元素名称,后跟 id、类或其他属性。它不会涵盖一些边缘情况,但在大多数情况下都可以使用。

      var elem_regex = /^(\w+)?|(#|\.)([^.#\[]+)|(\[[^\]]+?\])/g
      

      然后制作一个函数来获取零件并创建一个元素。

      function elementFromSelector(str) {
          var match, parts = {}, quote_re = /^("|').+(\1)$/;
          while (match = elem_regex.exec(str)) {
              if (match[1]) 
                  parts.name = match[1];
              else if (match[2] === ".") {
                  if (!parts.clss) 
                      parts.clss = [];
                  parts.clss.push(match[3]);
              } else if (match[2] === "#")
                  parts.id = match[3];
              else if (match[4]) {
                  var attr_parts = match[4].slice(1,-1).split("="),
                      val = attr_parts.slice(1).join("");
                  parts[attr_parts[0]] = quote_re.test(val) ? val.slice(1,-1) : val;
              }
              else throw "Unknown match";
          }
          if (parts.name) {
              var elem = document.createElement(parts.name);
              delete parts.name;
              for (var p in parts)
                  if (p === "clss")
                      elem.className = parts[p].join(" ");
                  else
                      elem[p] = parts[p];
              return elem;
          } else throw "No element name at beginning of string";
      }
      

      然后将适当的字符串传递给函数,它会返回元素。

      var str = 'input#the_id.firstClass.secondClass[type="text"][value="aValue"]';
      
      var element = elementFromSelector(str);
      

      在创建元素之前,部件看起来像这样。

      {
          "name": "input",
          "id": "the_id",
          "clss": [
              "firstClass",
              "secondClass"
          ],
          "type": "text",
          "value": "aValue"
      }
      

      然后它使用该信息来创建返回的元素。

      【讨论】:

        【解决方案3】:

        我会使用zen coding for textarea 作为起点。它的语法对于您正在尝试做的事情足够接近,它是一个很好理解的实现。您应该能够从原始字符串而不是从文本区域调用转换。

        【讨论】:

          【解决方案4】:

          试试这个:

          var $someelement = $('<div class="someelement"/>').appendTo('#container');
          

          这将在#container 内部创建一个全新的元素并将其保存为$someelement 以方便以后参考。

          http://api.jquery.com/jQuery/#jQuery2

          更新

          您可以克隆原始文件,然后将其清空。这根本不会影响原始元素。

          var $someelement = $('div.someelement').clone().empty().appendTo('#container');
          

          【讨论】:

          • 感谢您的回答,但我必须使用 "div.someelement" 创建此元素,
          • 嗯,如果“div.someelement”不存在怎么办?
          • @Matt:你为什么接受一个与你在问题中提出的问题不相符的答案?
          【解决方案5】:

          使用这个:

          var someElement = $("<div></div>");
          someElement.addClass("someelement");
          $("#container").append(someElement);
          

          或者您可以将调用链接在一起:

          $("#container").append(
              $("<div></div>")
              .addClass("someelement")
          );
          

          编辑:

          也许我误解了这个问题,也许这会有所帮助。要创建一组新元素,请使用 jQuery 的 clone 方法:

          $("div.someelement").clone().appendTo("#container");
          

          【讨论】:

          • 感谢您的回答,但这不是我需要的。我知道有这种可能性,但我并不满意。我在 Jquery 插件中有一些选项,例如 someContainer:“div.someelement”,我必须通过 someContainer 选项创建这个元素
          【解决方案6】:

          根据您想使用"div.someelement" 之类的语法来创建元素的问题。

          为此,您需要制作自己的解析器。

          如果这就是确切的语法,那就很简单了。

          var str = "div.someelement",
              parts = str.split("."),
              elem = $("<" + parts.shift() + ">"),
              cls;
          
          while (cls = parts.shift())
              elem.addClass(cls);
          

          但如果你要这样做,你不妨使用本机方法。

          var str = "div.someelement",
              parts = str.split("."),
              elem = document.createElement(parts.shift());
          
          elem.className = parts.join(" ");
          

          如果您希望使用完整的 CSS 语法来创建元素,那么您可能需要查看 Sizzle 使用的正则表达式解析器,并根据您的需要使用它。

          【讨论】:

          • 您好,您的选择更好。但是没有其他方法可以做到这一点吗?选项中的原因可能是“div[href=somehref”而不是“div.someelement”。
          • @Matt:如果你想要任何有效的 CSS 语法,那么你需要一个 CSS 字符串解析器。 SizzleJS 项目有一个内置的,你可以借用。您需要根据需要修改代码。
          • @Matt:我添加了另一个答案,它从更复杂的字符串中生成元素,就像你展示的那样。请看那个答案。
          【解决方案7】:

          我会使用以下方法即时创建元素

          $("<div/>",{
              "class" : "someelement",
              // .. you can go on and add properties
              "css" : {
                  "color" : "red"
              },
              "click" : function(){
                  alert("you just clicked me!!");
              },
              "data" : {
                 "foo" : "bar"
              }
          }).appendTo("#container");
          

          【讨论】:

          • 从来不知道属性的东西,你还可以添加文本,事件处理程序,甚至数据,太好了!
          • 这是设置多个属性的方法。比传入长字符串要干净得多。
          【解决方案8】:

          您可以通过以下方式做到这一点:

          var newElement = $('<div class="someelement"></div>');
          $('#container').append(newElement);
          

          或者如果您不需要该元素,您可以直接附加它:

          $('#container').append('<div class="someelement"></div>');
          

          【讨论】:

            猜你喜欢
            • 2018-05-21
            • 2012-03-24
            • 1970-01-01
            • 2012-07-19
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多