onclick = object.method
Ребят, код упростил, проблема только в том месте где комментарий, в других местах синтаксические и прочие ошибки не ищите, все работает там.
Вот код:
function SimpleInput() {
this.addSymbol = function(symb) {
console.log(symb);
}
}
function SimpleKeypad(inputObj) {
this.inputObj = inputObj;
this.html = '';
this.create = function() {
for (var i = 0; i < 10; i++) {
this.html = this.html + "<div onclick='" + this.inputObj(i) +"; return false;' >"+ i + "</div>"; // вот здесь хочу чтобы привязался вызов функции, а она вызывается сразу при создании объекта. в html-коде же остается только onclick="undefined; return false;". Помню там какая-то тонкость при написании этой строчки, что-то да как-то надо в кавычки взять. Кстати, пока писал это вспомнил что делал ранее вызов метода объекта в setInterval и там эту тонкость и встречал. щас глянем.
}
document.getElementById('asdfasdf').innerHTML = this.html;
}
}
$(document).ready(function(){
SCR3_input = new SimpleInput();
SCR3_input.create();
SCR3_keypad = new SimpleKeypad();
SCR3_keypad.create(SCR3_input);
});
|
"<div onclick='this.inputObj(" + i + "); return false;'>"
|
ммммммм.... помоему пробывал. но все равно перепроверю...
|
В данном случае корректнее будет привязывать обработчик не через инлайновый атрибут onclick, а через Javascript-свойство onclick динамически создаваемого объекта HTMLDivElement. Или при помощи методов добавления слушателя.
Например,
function SimpleKeypad(inputObj) {
this.inputObj = inputObj;
this.html = '';
this.create = function() {
var div, frag = document.createDocumentFragment();
for (var i = 0; i < 10; i++) {
div = frag.appendChild(document.createElement("div"));
div.onclick = (function(foo, j) { return function() { foo(j); }; })(this.inputObj, i);
}
document.getElementById('asdfasdf').innerHTML = "";
document.getElementById('asdfasdf').appendChild(frag);
}
}
|
Вот это всяко правильнее, спасибо. А вот это
Цитата:
|
Только не понятно что это за комбинация такая:
div.onclick = (function(foo, j) { return function() { foo(j); }; })(this.inputObj, i);
. зачем такая громоздкость, вместо
div.onclick = (function(foo, j) { return this.inputObj(j); });
и что это вообще обозначает ??? |
Цитата:
|
Цитата:
|
как-то быстро :) у меня на это два дня ушло
|
Цитата:
Тут еще один вопросик, если можно - здесь же. Внутри функции create:
this.create = function() {
var div, frag = document.createDocumentFragment();
for (var i = 0; i < 10; i++) {
div = frag.appendChild(document.createElement("div"));
div.onclick = (function(foo, j) { return function() {
/*здесь хочу обратиться к this.SecondMethodOfMyClass(), но вылетает мол "эт не функция". Т.е. не видит этот метод, хотя он втутри этого же "класса" объявлен */
foo(j);
}; })(this.inputObj, i);
}
document.getElementById('asdfasdf').innerHTML = "";
document.getElementById('asdfasdf').appendChild(frag);
};
this.SecondMethodOfMyClass() = function() {
return 1;
}
|
this.secondMetodOfYourClass = function(){
return 1;
}
//или
this.create = function(){
//blah blah
div.onclick = (function(yourClass){
return function(){
alert(yourClass.secondMetodOfYourClass());
}
}(this))
}
//или
var yourClass = this;
this.create = function(){
//blah blah
div.onclick = function(){
alert(yourClass.secondMetodOfYourClass());
}
}
Еще: если вы создаете класс, то скорее всего экземпляров его будет несколько, тогда наверно лучше сделать так? объявить методы в прототипе
function myClass(value){
this.value = value;
}
myClass.prototype = {
method: function(){
return this.value;
},
create: function(){
//blah blah
var div = document.createElement("DIV");
div.onclick = function(that){
return function(){
alert(that.method());
}
}(this)
//...... blah blah
}
}
Мне так больше нравится, получается что эти методы не определяются в каждом экземпляре, а они статичные, общие для всех экземпляров, методы, которые пользуются приватными переменными в конструкторе естественно |
вот второй пример мне тоже более по душе. плюсь я маленько вник по этой статье.
спасибо :) |
| Часовой пояс GMT +3, время: 02:42. |