OOP JavaScript – Créez un objet Div personnalisé

Je commence avec OOP en JavaScript. Je veux créer un "panneau" personnalisé. Voici ce que j'ai jusqu'ici:

function ShinyPanel(css, attributes) { this.container = $(document.createElement("div")).addClass("shinyPanel"); this.titleBar = $(document.createElement("div")).addClass("shinyPanelTitleBar").appendTo(this.container); this.topShine = $(document.createElement("div")).addClass("shinyPanelTopShine").appendTo(this.container); this.leftShine = $(document.createElement("div")).addClass("shinyPanelLeftShine").appendTo(this.container); this.content = $(document.createElement("div")).addClass("shinyPanelContent").appendTo(this.container); if (!css) css = {}; if (!attributes) attributes = {}; this.css = css; $(this.container).css(this.css); this.title = attributes["title"]; $(this.titleBar).html(this.title); } 

Maintenant, je peux instancier cet objet et l'ajouter au corps via quelque chose comme ceci:

 var panel = new ShinyPanel({position:"absolute", top:"25%", width:"300px", height:"200px"}, {title:"Test"}); $("body").append(panel.container); 

Ma question est, est-ce qu'il y a un moyen pour moi de faire de l'objet lui-même un div, éliminant ainsi la nécessité d'un «conteneur» div? Ensuite, je pourrais simplement appeler $("body").append(panel); .

Ce n'est pas trop grave pour moi d'avoir le conteneur div là, c'est plus juste pour moi … voulant apprendre la bonne façon de faire les choses.

J'ai essayé this = document.createElement("div"); , Mais j'ai eu une erreur: invalid assignment left-hand side .

Ce que vous décrivez, c'est essentiellement ce que le cadre d'IU peut accomplir.

Consultez la documentation de l'usine de widgets pour commencer:

http://wiki.jqueryui.com/w/page/12138135/Widget%20factory

Je suggère d'avoir une méthode ShinyPanel qui gère ce ShinyPanel . Dites, ne demandez pas.

 function ShinyPanel(css, attributes) { ... this.appendTo = function (to) { $(to).append(this.container); } 

Vous pouvez renvoyer this.container directement à partir de votre fonction de constructeur, en supposant que vous n'utiliserez aucune des autres propriétés que vous avez ajoutées.

Pour ce faire, je pense que vous devriez le changer pour être une méthode d'usine, plutôt qu'un constructeur (c.-à-d. Ne pas utiliser de new plus – bien qu'il y ait plus que cela).

Lorsque tout ce que vous voulez faire est de l'ajouter au corps, au lieu de renvoyer un objet, vous pouvez simplement renvoyer une chaîne avec votre panneau.

Quelque chose comme ça:

 function shinyPanel(css, attributes) { ... all the stuff you did before return this.container } 

En outre, si vous souhaitez atteindre une certaine vitesse dans cette fonction shinyPanel de votre shinyPanel , vous pouvez essayer d'ajouter des chaînes de votre balisage, puis utilisez uniquement une fois.

Consultez également un tableau en tant que support pour votre chaîne de retour, puis utilisez .join('') lorsque vous le renvoyez.

Plus d'informations: http://www.learningjquery.com/2009/03/43439-reasons-to-use-append-correctly