Создать функцию копирования буфера обмена для сгенерированного текста

Хороший способ доступа к динамическим именам строк, содержащих объекты (например, 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

1
задан Jess Y. 15 January 2019 в 19:07
поделиться

1 ответ

Вы были близки, однако пара вещей пошла наперекосяк. Во-первых, DOM оценивается по порядку, поэтому обработчик onclick не знал о вашей функции, так как она была объявлена ​​после элемента; это вызвало Uncaught ReferenceError: copyPassage не определено .

Далее, неправильный метод был использован для фактического выбора текста. Вы использовали .select(), что вызвало Uncaught TypeError: copyText.select не является функцией .

Вместо этого вы должны использовать selectAllChildren MDN .

Смотрите это в действии здесь:

<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>
    

0
ответ дан Travis J 15 January 2019 в 19:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: