Хороший способ доступа к динамическим именам строк, содержащих объекты (например, object.subobject.property)
function ReadValue(varname)
{
var v=varname.split(".");
var o=window;
if(!v.length)
return undefined;
for(var i=0;i<v.length-1;i++)
o=o[v[i]];
return o[v[v.length-1]];
}
function AssignValue(varname,value)
{
var v=varname.split(".");
var o=window;
if(!v.length)
return;
for(var i=0;i<v.length-1;i++)
o=o[v[i]];
o[v[v.length-1]]=value;
}
Пример:
ReadValue("object.subobject.property");
WriteValue("object.subobject.property",5);
eval работает для чтения значение, но значение записи немного сложнее.
Более продвинутая версия (создайте подклассы, если они не существуют, и разрешает объекты вместо глобальных переменных)
function ReadValue(varname,o=window)
{
if(typeof(varname)==="undefined" || typeof(o)==="undefined" || o===null)
return undefined;
var v=varname.split(".");
if(!v.length)
return undefined;
for(var i=0;i<v.length-1;i++)
{
if(o[v[i]]===null || typeof(o[v[i]])==="undefined")
o[v[i]]={};
o=o[v[i]];
}
if(typeof(o[v[v.length-1]])==="undefined")
return undefined;
else
return o[v[v.length-1]];
}
function AssignValue(varname,value,o=window)
{
if(typeof(varname)==="undefined" || typeof(o)==="undefined" || o===null)
return;
var v=varname.split(".");
if(!v.length)
return;
for(var i=0;i<v.length-1;i++)
{
if(o[v[i]]===null || typeof(o[v[i]])==="undefined")
o[v[i]]={};
o=o[v[i]];
}
o[v[v.length-1]]=value;
}
Пример:
ReadValue("object.subobject.property",o);
WriteValue("object.subobject.property",5,o);
Это то же самое, что o.object.subobject.property
Вы были близки, однако пара вещей пошла наперекосяк. Во-первых, DOM оценивается по порядку, поэтому обработчик onclick не знал о вашей функции, так как она была объявлена после элемента; это вызвало Uncaught ReferenceError: copyPassage не определено .
Далее, неправильный метод был использован для фактического выбора текста. Вы использовали .select()
, что вызвало Uncaught TypeError: copyText.select не является функцией .
Вместо этого вы должны использовать selectAllChildren
MDN sup> .
Смотрите это в действии здесь:
<script>
function copyPassage() {
var copyText = document.getElementById("generated-text");
window.getSelection().selectAllChildren(copyText);
document.execCommand("copy");
alert("Copied the text: " + copyText.innerText);
}
</script>
<button onclick="copyPassage()" class="copy-button">Copy text</button>
<div class="border">
<div id="generated-text">
<div class='placeholder-div'>Harry Potter</div>
</div>
</div>