06.04.2013, 08:06
|
|
Новичок на форуме
|
|
Регистрация: 06.04.2013
Сообщений: 6
|
|
Конструктор для компонента
Необходимо создать DOM-елемент с некоторыми дополнениями. Сейчас использую такую конструкцию:
function Menu(options){
var self = document.createElement('div'),
_items=options.items || [],
_itemsCount=options.itemsCount || _items.length;
// другие свойства ...
function construct(){
var it = document.createElement('ul');
it.className = 'Menu';
for (var i=0;i<_itemsCount;i++){
var item=document.createElement('li');
item.innerHTML = '<p class="MenuItemTitle">'+ _items[i]+'</p>';
// формируем подменю...
it.appendChild(item);
}; //item
self.appendChild(it);
}; //construct
construct();
return self;
};// Menu
Надо переписать фабричную функцию в конструктор: чтоб вместо self использовалось this, а наследование шло через прототипы.
Помогите пожайлуста:
Menu.prototype = document.createElement('div'); //наследуем от Div
function Menu(options){
var self = this,
_items=options.items || [],
_itemsCount=options.itemsCount || _items.length;
// другие свойства ...
function construct(){
var it = document.createElement('ul');
// формируем подменю...
self.appendChild(it); // ОШИБКА!!! Uncaught TypeError: Illegal invocation
}; //construct
construct();
};// Menu
как исправить ошибку?
Последний раз редактировалось Дюрі-бачі, 08.04.2013 в 16:44.
|
|
08.04.2013, 16:51
|
|
Профессор
|
|
Регистрация: 18.01.2013
Сообщений: 1,098
|
|
я вообще вопроса не понял даже не то что кода
|
|
08.04.2013, 21:27
|
|
Новичок на форуме
|
|
Регистрация: 06.04.2013
Сообщений: 6
|
|
Код должен создавать компонент, припустим Меню и быть полноценным объектом. Сейчас я его создаю при помощи фабричной функции (первый код, возвращает полноценный node внутри которого есть меню, можно потом вставить в DOM структуру документа, или сделать JQuery обёртку вокруг него...), но при таком подходе есть проблемы с наследованием, надо переделать чтоб создавалось через конструктор, но у меня не получается.
Последний раз редактировалось Дюрі-бачі, 08.04.2013 в 21:32.
|
|
08.04.2013, 21:33
|
Профессор
|
|
Регистрация: 14.09.2011
Сообщений: 523
|
|
Даже не взирая на ошибки в коде, хочу спросить - в классе Menu на что будет ссылаться this?
|
|
08.04.2013, 21:35
|
х.з
|
|
Регистрация: 21.11.2010
Сообщений: 4,588
|
|
Сообщение от Дюрі-бачі
|
self.appendChild(it); // ОШИБКА!!! Uncaught TypeError: Illegal invocation
|
в первую очередь ответьте, для себя, на вопросы:
на что ссылается this в конструкторе , в объекте?
во что можно можно вставлять будущий элемент Dom дерева?
Все ответы есть в учебнике http://learn.javascript.ru/
P.S что за манера в последнее время , написав ерунду и не получив на неё ответа, не искать ошибки и решения ,а апать со словами : Эчто никто не знает" и т.д?
Последний раз редактировалось dmitriymar, 08.04.2013 в 21:40.
|
|
08.04.2013, 21:46
|
|
Профессор
|
|
Регистрация: 18.01.2013
Сообщений: 1,098
|
|
var __extends = this.__extends || function (d, b) {
function __() { this.constructor = d; }
__.prototype = b.prototype;
d.prototype = new __();
};
var Animal = (function () {
function Animal() { }
Animal.prototype.say = function () {
alert('animal');
};
return Animal;
})();
var Cat = (function (_super) {
__extends(Cat, _super);
function Cat() {
_super.apply(this, arguments);
}
Cat.prototype.say = function () {
_super.prototype.say.call(this);
alert('cat');
};
return Cat;
})(Animal);
new Cat().say()
дает ли тебе этот код что нибудь?
|
|
08.04.2013, 21:59
|
|
Новичок на форуме
|
|
Регистрация: 06.04.2013
Сообщений: 6
|
|
Сообщение от zebra
|
Даже не взирая на ошибки в коде, хочу спросить - в классе Menu на что будет ссылаться this?
|
По идее должен на пустой обьект, прототипом которого есть DIV, соответственно из него должен наследовать childNodes и appendChild. После исполнения конструктора должен быть node со своими методами и свойствами, который потом можно добавить в документ.
megaupload, Ну читал я учебник это работает когда объекты обычные, а вот DOM не работает, или я не понимаю как оно должно работать.
Сообщение от dmitriymar
|
P.S что за манера в последнее время , написав ерунду и не получив на неё ответа, не искать ошибки и решения ,а апать со словами : Эчто никто не знает" и т.д?
|
Извиняюсь, если б я знал как исправить - то исправил бы. Уже пробовал по разному и первый пост редактировал несколько раз соответственно, но не работает ни один из вариантов, например
this = document.createElement('div'),
Последний раз редактировалось Дюрі-бачі, 08.04.2013 в 22:08.
|
|
08.04.2013, 22:18
|
Профессор
|
|
Регистрация: 14.09.2011
Сообщений: 523
|
|
function Menu(opt) {
this.el = document.createElement('div'); // или лучше document.createDocumentFragment()
this.construct(opt);
}
Menu.prototype.construct = function() {
// this.el.append(список)
};
//body.appendChild(new Menu().el)
Лучше как-то так реализуйте
|
|
08.04.2013, 22:52
|
|
Новичок на форуме
|
|
Регистрация: 06.04.2013
Сообщений: 6
|
|
zebra,Спасибо, конечно криво возвращать элемент через свойство, но зато хоть рабочий вариант. Теперь даже не знаю стоит ли переделывать весь код.
P.S. С JS раньше дела не имел, и хотелось как в обычных языках: делаем потомка класса стандартного компонента, дополняем его на свое усмотрение, создаем конкретные экземпляры, а здесь, вижу все абсолютно по другому...
Последний раз редактировалось Дюрі-бачі, 08.04.2013 в 22:55.
|
|
09.04.2013, 00:40
|
|
Новичок на форуме
|
|
Регистрация: 06.04.2013
Сообщений: 6
|
|
Цитата:
|
В стандарте the Option Element есть любопытный короткий синтаксис для создания элемента с тегом option:
option = new Option( text, value, defaultSelected, selected);
|
Вот такого и я хочу достичь.
|
|
|
|