Я на начальной стадии создания объекта в виде плагина, который создает и контролирует набор элементов DIV
и INPUT
.Цель состоит в том, чтобы несколько экземпляров делали одно и то же, но каждый экземпляр только для своих собственных DIV и INPUT.
Часть первая работает нормально, как показано желтой точкой во фрагменте.
Теперьтолько когда я создаю второй экземпляр, первый (красная точка) перестает работать.Первый объект все еще существует, и я могу обратиться и установить его параметры, только анимация, которой он должен управлять, остановлена.Таким образом, либо eventListener для нового ввода не работает, когда существуют два объекта, либо неправильный способ инициализации объекта.Здесь мне нужна помощь.
Я задаю этот вопрос, прежде чем я продолжу делать синтаксический анализатор объекта более сложным, поскольку в дальнейшем он должен анализировать и делать более сложные множественные входные данные.
Как правильно разделить дваэкземпляры контроллера?
фрагмент:
function randomButton(button_id){
if(button_id=='demo_1'){
while(MyObject_1.val()==MyObject_1.rand()){}
}
if(button_id=='demo_2'){
end = MyObject_2.rand();
start = (end-MyObject_2.rand()).toFixed(2);
if(start<0){start=0;}
MyObject_2.val(end+" , "+start);
}
}
function alertObjectInfo(object){
text = "";
if (null == object || "object" != typeof object) return object;
for (var attr in object) {
if (object.hasOwnProperty(attr)) text += (object[attr]+"\n");
}
alert(text);
}
/* start of of the plug-in code */
var MyPlugin = ( function (element, id) {
if(id===undefined){ // if no ID is provided genetate a hex string as ID
id = ("OBJ-"+(new Date).getTime().toString(16)+"_"+(new Date).getMilliseconds().toString(16));
}
element.addEventListener('change', function () {
/* this part of the code will only run if the element input value is changed */
parser.input = this.value;
parser.run();
object.draw(parser.result);
});
defaults = [];
defaults['size'] = 24;
defaults['radius'] = 12;
defaults['padding'] = 4;
defaults['bgcolor'] = 'orange';
defaults['color'] = 'yellow';
defaults['transition'] = '1s';
/* the part below is the parser engine that converts the input */
parser = {
input : null,
result : null,
mode : 'single', // default is single
run : ( function( value ) {
if(value){this.input = value;} // use value as new input if a value is provided
if(this.mode==='single' || this.mode==false || this.mode===undefined){
// parse as a single floating point value
this.mode = 'single'; // reset mode in case it was undefined
this.result = parseFloat(this.input);
if(this.result > 1){this.result = 1;}
if(this.result < 0){this.result = 0;}
return this.result;
}
if(this.mode==='double' || this.mode==2){
// parse as two seperete floating point values
/* to be continued */
}
})
};
/* the code below creates an object we can talk to and that will manage sprites */
var object = {
id : id, // optional identifier string useful for debugging
init : false, // the switch to test if initialise is already done
element : element, // the html element we take out input from
sprites : [], // the array of sprite elements generated by this object
parser : parser, // the input parser engine
/* the object's internal functions */
draw : function() {
/* the main to draw and move all sprites */
if(this.init==false){alert('error: object is not properly initialised');return false;}
this.sprites[1].style.width = (this.parser.result*100)+"%";
},
show : function() {
/* the show all sprites function */
element.parentNode.style.display = 'inline';
},
hide : function() {
/* the hide all sprites function */
element.parentNode.style.display = 'none';
},
val : function( value ) {
/* the set or get value function */
if(value===undefined){
return element.value;
}else{
element.value = value;
element.dispatchEvent(new Event('change'));
}
},
rand : function( maxVal, minVal, decVal ) {
/* create and set a random value */
if(minVal===undefined){minVal = 0;} // default minimum value
if(maxVal===undefined){maxVal = 1;} // default maximum value
if(decVal===undefined){decVal = 2;} // default decimal precision
if(maxVal < minVal){ // invert minimum and maximum if incorrect
offVal = maxVal;
maxVal = minVal;
minVal = offVal;
}
offVal = 1; // set or reset offVal
for (i = 0; i < decVal; i++) {
offVal = offVal/10;
}
r = (Math.random())*((maxVal+offVal)-(minVal)) + minVal;
if(r>maxVal){r=maxVal;}
p = Math.pow(10, decVal);
r = Math.floor(r*p) / p;
element.value = r;
element.dispatchEvent(new Event('change'));
return r;
},
initialise : function() {
if(this.init==false){
/* this part will initialise everything with default values once */
wrapper = element.parentNode;
container = document.createElement("div");
container.style.backgroundColor = defaults['bgcolor'];
container.style.height = defaults['size']+'px';
container.style.padding = defaults['padding']+'px';
container.style.boxSizing = 'border-box';
relativeRad = (defaults['size']/2)+'px';
container.style.borderRadius = (relativeRad+' '+relativeRad+' '+relativeRad+' '+relativeRad);
wrapper.appendChild(container);
this.sprites.push(container);
mover = document.createElement("div");
mover.style.backgroundColor = 'inherit';
mover.align = 'right'; // not yet controled by defaults
mover.style.width = '0%'; // start at 0% always
mover.style.minWidth = (defaults['size']-(defaults['padding']*2))+'px';
mover.style.transition = defaults['transition'];
container.appendChild(mover);
this.sprites.push(mover);
sprite = document.createElement("div");
sprite.style.backgroundColor = defaults['color'];
sprite.style.height = (defaults['size']-(defaults['padding']*2))+'px';
sprite.style.width = (defaults['size']-(defaults['padding']*2))+'px';
sprite.style.minWidth = (defaults['size']-(defaults['padding']*2))+'px';
sprite.style.display = 'block';
sprite.style.boxSizing = 'border-box';
relativeRad = (defaults['size']/3)+'px';
sprite.style.borderRadius = (relativeRad+' '+relativeRad+' '+relativeRad+' '+relativeRad);
sprite.style.transition = defaults['transition'];
sprite.innerHTML = ' ';
mover.appendChild(sprite);
this.sprites.push(sprite);
this.init = true;
return this.init;
}
}
};
object.initialise();
return object;
});
/* end of of the plug-in code */
/* MyPlugin init */
var MyObject_1 = new MyPlugin(document.getElementById("demo_input_1"),'Object_1');
var MyObject_2 = new MyPlugin(document.getElementById("demo_input_2"),'Object_2');
// test if we can address sprites of the first object after creating a second object
MyObject_1.sprites[2].style.backgroundColor = 'red';
.item-wrap{
background-color: #999;
border:0;
border-radius: 8px;
padding: 16px;
margin-bottom: 8px;
}
.demo_input{
border:0;
color:white;
font-size:18px;
padding:8px;
background-color:transparent;
width:100%;
box-sizing:border-box;
text-align:left
}
.item-text{
border:0;
color:white;
font-size:18px;
font-family:Avenir, Tahoma, sans-serif;
padding-left:4px;
padding-top:8px;
width:100%;
box-sizing:border-box;
text-align:left
}
<div class="item-wrap">
<div class="item-text">
<strong>Progress animation based on double values (Beta)</strong><br>
<small>The first value still sends the animation to a relative point between 0 and 1.
The second value streches the animated sprite to an offset starting point.</small><br>
</div>
<div id="demo_1_wrap" class="demo">
<input id="demo_input_2" class="demo_input" type="text" value="0 , 0">
</div>
<p>
<input type="button" name="show" value="show object" onClick="MyObject_2.show()">
<input type="button" name="hide" value="hide object" onClick="MyObject_2.hide()">
<input style="float:right" type="button" name="alert" value="alert object" onClick="alertObjectInfo(MyObject_2)">
<input type="button" name="rand" value="set random" id="demo_2" onClick="randomButton(this.id)">
</p>
</div>
<div class="item-wrap">
<div class="item-text">
<strong>Progress animation based on a single value input</strong><br>
<small>The input value sends the animation to a relative point between 0 and 1.
Empty or wrong input does nothing, where 1 or higher shows the animation at 100%</small><br>
</div>
<div id="demo_1_wrap" class="demo">
<input id="demo_input_1" class="demo_input" type="text" value="0">
</div>
<p>
<input type="button" name="show" value="show object" onClick="MyObject_1.show()">
<input type="button" name="hide" value="hide object" onClick="MyObject_1.hide()">
<input type="button" name="demo_" value="set random" id="demo_1" onClick="randomButton(this.id)">
<input style="float:right" type="button" name="alert" value="alert object" onClick="alertObjectInfo(MyObject_1)">
</p>
</div>
Ожидаемым результатом будет «MyObject_1», контролирующий все элементы внутри DIV с меткой ID «demo_1_wrap» и второй экземпляр «MyObject_2»сделать то же самое для идентификатора DIV с меткой "demo_2_wrap".