zclip: ссылка на элемент отправителя в обратном вызове afterCopy
У меня есть несколько кнопок "копировать код" на одной странице. У каждого кода есть своя кнопка.
вот мой основной HTML:
<a id="1" href="#" class="small-white-btn copyme">Copy Source</a>
<div id="code-1" style="display:none;">html source code goes here</div>
<div class="msg1"></div>
<a id="2" href="#" class="small-white-btn copyme">Copy Source</a>
<div id="code-2" style="display:none;">html source code goes here</div>
<div class="msg2"></div>
Мой zclip jquery выглядит так:
$('.copyme').zclip({
path: 'http://www.steamdev.com/zclip/js/ZeroClipboard.swf',
copy: function () {
var id = $(this).attr('id');
var copythis = $('#code-' + id).text();
return copythis;
},
afterCopy: function () {
$("div.msg" + id).html("<p>Source Code Copied</p>");
}
});
Это работает, однако я не могу вставить сообщение в div class="msg"
тег.
Как я могу настроить таргетинг на var id, добавить его в div msg и отобразить на странице при нажатии кнопки.
2 ответа
Причина, по которой вы не можете получить доступ к id
переменная, которую вы создали в copy
функция от afterCopy
потому что переменные, определенные внутри функции, ограничены этой функцией. Однако это легко преодолевается.
Нет необходимости сохранять значение из $(this).attr('id')
в качестве глобальной переменной, когда copy
функция вызывается, потому что вы можете так же легко получить идентификатор вызывающего элемента в afterCopy
функция с использованием того же точного выражения: т.е.
afterCopy: function () {
var id = $(this).attr('id');
}
Это отвечает на ваш первоначальный вопрос, но есть гораздо лучший способ определить, какие элементы выбрать. Вместо того чтобы полагаться на ID
поле, чтобы никогда не изменяться и используя его для создания идентификатора другого элемента, вы можете просто сохранить точный идентификатор вашего текста копии и скопировать элементы сообщения в виде пользовательских атрибутов data-* на вашем .copyme
anchor
, как это:
<a data-copy="#code-1" data-copy-msg="#msg1" class="copyme">Copy Source 1</a>
Затем в copy
Функция, вы можете получить этот атрибут и передать его в селектор jQuery, чтобы получить текстовое значение для копирования, например так:
copy: function () {
var copySelector = $(this).data('copy');
return $(copySelector).text();
}
Вы можете справиться с afterCopy
событие так же. Ты можешь использовать this
вместо того, чтобы хранить идентификатор в памяти. Возьмите селектор, куда вы хотите, чтобы сообщение отправлялось, и примените к нему html, например так:
afterCopy: function () {
var copyMsgSelector = $(this).data('copy-msg');
$(copyMsgSelector).html("Source Code Copied");
}
Рабочая демонстрация в скрипке
Так что все это будет выглядеть так:
HTML:
<a data-copy="#code-1" data-copy-msg="#msg1"
href="#" class="copyme" >Copy Source 1</a>
<div id="code-1" style="display:none;">source code 1</div>
<span id="msg1"></span>
<br/>
<a data-copy="#code-2" data-copy-msg="#msg2"
href="#" class="copyme" >Copy Source 2</a>
<div id="code-2" style="display:none;">source code 2</div>
<span id="msg2"></span>
JavaScript:
$('.copyme').zclip({
path: 'http://www.steamdev.com/zclip/js/ZeroClipboard.swf',
copy: function () {
var copySelector = $(this).data('copy');
return $(copySelector).text();
},
afterCopy: function () {
var copyMsgSelector = $(this).data('copy-msg');
$(copyMsgSelector).html("Source Code Copied");
}
});
Вы объявляете var id внутри функции, так что это закрытая переменная, которая уничтожается после завершения работы функции. Вам нужно объявить переменную вне вашей функции; затем при запуске вы можете присвоить и сохранить значение.
попробуй это:
var id;
$('.copyme').zclip({
path: 'http://www.steamdev.com/zclip/js/ZeroClipboard.swf',
copy: function () {
id = $(this).attr('id');
var copythis = $('#code-' + id).text();
return copythis;
},
afterCopy: function () {
$("div.msg" + id).html("<p>Source Code Copied</p>");
}
});