В настоящее время мы изучаем некоторые материалы по Javascript на курсе в университете.Для этого мы реализуем библиотеку для общих задач, таких как show (), hide (), write и тому подобное.
В настоящее время я работаю с реализацией, такой как:
var myLib_maker = function () {
/*
private scope
*/
var debuggingMode=true;
var currentElement=null;
/*
end private scope
*/
return {
getElement: function (id) {
var o;
if (typeof id === 'string') { o = document.getElementById(id); }
if (!!(o && o.nodeType !== 1)) {
throw {
name: 'Type Error',
message: 'Wrong node type at id: '+id
}
}
currentElement=o;
return this;
},
getCurrentElement: function() {
console.log(currentElement)
return currentElement;
},
isVisible: function () {
return this.getCurrentElement().style.display.toLowerCase() === "block";
},
show: function () {
this.debug("show "+this.getCurrentElement())
this.getCurrentElement().style.display = "block";
return this;
},
hide: function () {
this.debug("hide "+this.getCurrentElement())
this.getCurrentElement().style.display = "none";
return this;
},
toggle: function() {
this.debug("toggle "+this.getCurrentElement())
this.isVisible() ? this.hide(): this.show();
return this;
},
write: function (content){
this.debug("write to"+this.getCurrentElement().id);
var tg = this.getCurrentElement().tagName.toLowerCase();
if (tg === 'input' || tg === 'textarea') {
currentElement.value = content;
} else {
currentElement.innerHTML = content;
}
return this
},
debug: function (what) {
if (debuggingMode===true){
console.log("[DEBUG] "+what);
}
return this;
}
};
}
var myLib=myLib_maker();
Чем у меня естьвнешняя функция (для тестирования) для переключения содержимого 2 текстовых областей.
function switchEditors(id1, id2){
c1=myLib.getElement(id1).getCurrentElement().value;
c2=myLib.getElement(id2).getCurrentElement().value;
myLib.getElement(id1).write(c2)
myLib.getElement(id2).write(c1)
}
Сначала я попробовал следующий код, который, очевидно, не работает, потому что я перезаписываю свой приватный currentElement и поэтому всегда пишу в id2
function switchEditors(id1, id2){
tmp=myLib.getElement(id1).getCurrentElement().value
myLib.getElement(id1).write(myLib.getElement(id2).getCurrentElement().value)
myLib.getElement(id2).write(tmp)
}
Но то, что я действительно хотел изначально, это не использование закрытой переменной currentElement.Первая реализация метода write расширила объект Element
Element.prototype.write= function (content){
var tg = this.tagName.toLowerCase();
if (tg === 'input' || tg === 'textarea') {
this.value = content;
} else {
this.innerHTML = content;
}
return this;
}
, и такая функция getElement вернула
document.getElementById(id)
Я хочу каскадирование (надеюсь, это правильное слово -> я имею в видуmyLib.getElement ("myid"). show (). hide () вещь конкатенации) и получение прямого доступа ко всем атрибутам Element, но мы не должны использовать глобальную область видимости для нашей библиотеки, поэтому я должен каким-либо образом инкапсулировать свою библиотеку.
Так есть ли элегантный способ использовать каскадную вещь и иметь возможность получить прямой доступ ко всем атрибутам объекта-элемента без реализации каждого метода в глобальной области видимости элемента?
Илимоя работа написана совершенно неправильно и должна быть совершенно другой.Если так, просто скажи мне, я ценю любую помощь.(Я пытался выяснить, как jQuery на самом деле реализует эти вещи, но не понял, как это делается ... слишком много кода ... :))
Я надеюсь, что описал свои пожелания итребования.Если нет, пожалуйста, запросите более подробную информацию.