ASP.Net С# WebForms Копирование в буфер обмена не работает из-за кода

У меня есть страница содержимого с главной страницей в ASP.NET У меня есть кнопка, которая запускает код sql и генерирует строку. Затем я устанавливаю текст метки в эту строку, чтобы позже передать ее в JavaScript для копирования строки в буфер обмена.

Нажатие кнопки 1 генерирует строку:

 <asp:Button ID = "Button2" runat = "server" OnClick = "Button2_Click" Text = "Generate List chain" class = "btn btn-default"/>
      <script>

и в коде позади

   protected void Button2_Click(object sender, EventArgs e)
    {
        //SQL code would normally generate the text to store in Label1.Text;
        Label1.Text = "Testing";

       }
       

Затем я могу запустить следующий javascript, нажав кнопку, чтобы скопировать строку в буфер обмена.

 <script>
          function copyToClipboard() {
              var text = document.getElementById('<%= Label1.ClientID %>').innerText;
              
              if (window.clipboardData && window.clipboardData.setData) {
                 return window.clipboardData.setData("Text", text);

              }
              else if (document.queryCommandSupported && document.queryCommandSupported("copy")) {
                  var textarea = document.createElement("textarea");
                  textarea.textContent = text;
                  textarea.style.position = "fixed";  
                  document.body.appendChild(textarea);
                  textarea.select();
                  try {
                      return document.execCommand("copy");  
                  }
                  catch (ex) {
                      console.warn("Copy to clipboard failed.", ex);
                      return prompt("Copy to clipboard: Ctrl+C, Enter", text);
                  }
                  finally {
                      document.body.removeChild(textarea);
                  }
              }
          }

      </script>


   <asp:Button id = "Button3"
   Text = "Copy to ClipBoard"
   OnClientClick = "copyToClipboard();return false;"
       class = "btn btn-default"
   runat = "server"/>

Это работает отлично. Однако для этого требуется нажать кнопку 2, а затем кнопку 3. Я попытался упростить это, запустив код javascript из кода позади:

        protected void Button4_Click(object sender, EventArgs e)
    {
        Label1.Text = "Testing";
        ScriptManager.RegisterStartupScript(this.Page, this.GetType(), "copyToClipboard", "copyToClipboard();", true);

    }

Однако, что бы я ни делал и пока отдельные компоненты работают, их объединение, как в последнем фрагменте кода, не сработает. Я подозреваю, что это связано с тем, что ScriptManager находится на MasterPage, а код, который я перечислил выше, находится на странице Child/Content (?). Любые советы о том, как решить эту проблему, очень ценятся. ЯВЛЯЮСЬ

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
52
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

В ASP.NET вы можете копировать текст в буфер обмена с помощью JavaScript.

Вот пример того, как это реализовать:

1. Добавьте кнопку на страницу ASP.NET:

<asp:Button ID = "btnCopy" runat = "server" Text = "Copy to Clipboard" OnClientClick = "copyToClipboard();" />

2. Напишите функцию JavaScript для копирования текста в буфер обмена:

function copyToClipboard() {
    var copyText = document.getElementById("<%= txtCopy.ClientID %>");
    copyText.select();
    document.execCommand("copy");
    alert("Copied to clipboard: " + copyText.value);
}

Эта функция выбирает текст в текстовом поле ASP.NET с идентификатором «txtCopy», выполняет команду «копировать», чтобы скопировать текст в буфер обмена, и отображает предупреждающее сообщение, указывающее, что текст был скопирован.

3. В файле кода программной части вашей страницы ASP.NET задайте в качестве значения текстового поля текст, который вы хотите скопировать:

protected void Page_Load(object sender, EventArgs e)
{
    txtCopy.Text = "Text to be copied";
}

Это устанавливает значение текстового поля с идентификатором «txtCopy» в текст, который вы хотите скопировать в буфер обмена.

Вот и все! Когда пользователь нажимает кнопку «Копировать в буфер обмена», текст будет скопирован в буфер обмена, и отобразится предупреждающее сообщение. Обратите внимание, что команда «копировать» может работать не во всех браузерах, поэтому вам может потребоваться предоставить альтернативный метод копирования текста.

Единственная часть, которую нужно добавить здесь, как уже отмечалось, это не сработает, как просил автор. Другими словами, вопрос заключался в том, как заставить код, подобный вашему, его и всем другим предложениям здесь, в этой теме, работать с использованием сценария запуска регистрации. Как я заметил в своем ответе, даже ваш код не будет работать таким образом. Другими словами, пользователь должен нажать на эту кнопку, чтобы запустить код, и такой код, например, не может быть запущен автоматически после того, как, скажем, загрузится страница - для этого ДОЛЖЕН быть пользователь, нажимающий кнопку в браузере. работа. Таким образом, вопрос плаката заключался в том, почему его код (или ваш) не работает.

Albert D. Kallal 16.02.2023 00:20

Событие клика:

onclick = "copyOnClipboard('textname')"

JS-код:

function copyOnClipboard(elementID) {
        var copyText = document.getElementById(elementID);
        copyText.select();
        copyText.setSelectionRange(0, 99999);
        document.execCommand("copy");
    }
Ответ принят как подходящий

К сожалению, это не разрешено.

Браузер обнаруживает и хочет получить реальное событие клика, которое произошло на стороне клиента.

Браузер обнаружит, не произошло ли РЕАЛЬНОЕ событие щелчка, и, таким образом, не разрешит функцию копирования буфера обмена.

Без этой безопасности кто-то может посетить любой старый сайт, и этот сайт может внедрить в ваш буфер обмена без ЛЮБОГО взаимодействия с пользователем все, что он захочет.

К сожалению, таким образом, вы должны предоставить, возможно, хороший всплывающий диалог - скажем, хороший jQuery.UI.

Или просто заполните текстовое поле, а рядом с ним есть красивая кнопка «копировать ссылку».

Ваш код в порядке. И, как вы заметили, он протестирован и работает с простой кнопкой на стороне клиента.

Однако для этой функции буфера обмена требуется «реальное» событие щелчка пользователя, и то, которое исходит от браузера на стороне клиента, чтобы это работало.

это мера безопасности браузера, и, таким образом, вставка кода JavaScript в браузер с помощью RegisterStartupScript не может быть использована.

Как уже отмечалось, вы можете внедрить красивый всплывающий диалог (скажем, jQuery.UI) и предложить кнопку + ссылку. Итак, это должно быть событие щелчка на стороне клиента, которое запускает этот код. Как уже отмечалось, здесь нельзя использовать даже метод jQuery.click() или JavaScript .click() кнопки, вставленной RegisterStartupScript для запуска этого кода. Как и сейчас, простой вызов этой процедуры js.

Другие вопросы по теме