2012-08-27 11 views
11

vorrei creare elemento in jQuery/Javascript utilizzando "div.someelement" come questoCreare Elemento in jQuery

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

Ma io non voglio copiare elemento con la stessa classe, mi piacerebbe per crearne uno nuovo.

document.createElement sta creando "<div.somelement>" invece di <div class="someelement">

+0

quindi .. fondamentalmente vuoi un'implementazione [zen coding] (http://code.google.com/p/zen-coding/) in javascript? –

risposta

12

Prova questa:

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

questo creerà un nuovo elemento di marca all'interno di #container e salvarlo come $someelement per un facile riferimento futuro.

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

UPDATE

Si potrebbe clonare l'originale poi svuotarlo. Questo non ha alcun effetto sull'elemento originale.

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

Grazie per la risposta, ma devo creare questo elemento utilizzando "div.someelement", – Matt

+1

@Matt Vedere l'aggiornamento . Perché "hai"? – iambriansreed

+1

Mm Che dire se "div.someelement" non esiste? – Matt

1

Utilizzare questa:

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

Oppure è possibile concatenare insieme i chiamate:

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

EDIT:

Forse ho capito male il domanda, ma questo sarà d'aiuto Per creare un nuovo insieme di elementi, utilizzare clone il metodo di jQuery:

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

Grazie per la risposta, ma non è quello che mi serve. So che c'è questa possibilità, ma non mi soddisfa. Ho un'opzione in Jquery Plugin come someContainer: "div.someelement", e devo creare questo elemento con l'opzione someContainer – Matt

2

È possibile farlo dal seguente:

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

o se non è necessario l'elemento è possibile aggiungerlo direttamente:

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

Vorrei utilizzare il seguente metodo per creare elementi al volo

$("<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"); 
+0

Non conoscevo la proprietà, puoi anche aggiungere testo, gestori di eventi, anche dati, bello! – iambriansreed

+0

Questa è la strada da percorrere se stai impostando più proprietà. Molto più pulito che passare in una lunga stringa. – pdizz

1

In base alla domanda, si desidera utilizzare una sintassi come "div.someelement" per creare un elemento.

Per fare ciò, è necessario creare il proprio parser.

È molto semplice se questa sarà la sintassi esatta.

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

while (cls = parts.shift()) 
    elem.addClass(cls); 

Ma se hai intenzione di fare questo, potresti anche usare metodi nativi.

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

elem.className = parts.join(" "); 

Se si desidera consentire per la sintassi CSS insufficiente e per la creazione di un elemento, quindi si consiglia di guardare il parser regex che Sizzle utilizza, e usarlo per le vostre esigenze.

+0

Ciao, la tua opzione è migliore. Ma non c'è altro modo per farlo? Causa nell'opzione potrebbe essere "div [href = somehref" invece di "div.someelement". – Matt

+0

@Matt: se si desidera una sintassi CSS valida, è necessario un parser di stringa CSS. Il progetto SizzleJS ne ha uno in cui puoi prendere in prestito. Dovrai modificare il codice in base alle tue esigenze. –

+0

@Matt: ho aggiunto un'altra risposta che rende un elemento da una stringa più complessa come hai mostrato. Si prega di vedere quella risposta. –

1

Vorrei utilizzare zen coding for textarea come punto di partenza. La sua sintassi è abbastanza vicina per quello che stai cercando di fare, è un'implementazione ben compresa. Dovresti essere in grado di invocare la trasformazione da una stringa raw piuttosto che da una textarea con un piccolo ritocco.

0

Poiché si sta chiedendo di creare un elemento dalla sintassi css, è necessario utilizzare un parser per interpretare la sintassi.

Ecco un esempio da cui è possibile creare. Questo corrisponderà al nome di un elemento seguito da id, classe o altri attributi. Non coprirà alcuni casi limite, ma funzionerà nella maggior parte dei casi.

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

Quindi creare una funzione per ottenere le parti e creare un elemento.

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"; 
} 

Quindi passare una stringa corretta alla funzione e restituirà l'elemento.

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

var element = elementFromSelector(str); 

Prima di creare l'elemento, le parti appaiono così.

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

Quindi utilizza tali informazioni per creare l'elemento che viene restituito.

0

È sufficiente creare un nuovo elemento per jQuery:

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

se si vuole a attributi di de uso elemento Simplie:

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

Rember per classe utilizzare sempre così "classe", perché la classe è un nome riservato