#javascript
#javascript
Вопрос:
Я не могу разобраться в этом и пытаюсь часами. У меня есть JSP, который выглядит следующим образом:
Моя цель — установить выбранный флажок и нажать на copy selected url
кнопку, и он должен иметь возможность копировать все уникальные URL по порядку. Затем я мог бы вставить его куда угодно, я хочу.
Это моя страница JSP:
<table class="filesTbl">
<tr>
<th width="1%">
Checkbox
</th>
<th width="1%">
No
</th>
<th width="20%">
File Name
</th>
<th width="50%">
Unique URL
</th>
<th width="1%">
Edit
</th>
<th width="1%">
Copy
</th>
<th width="1%">
Email
</th>
</tr>
<%
//need to input logic to populate data on each row
int counter=0;
int tally=0;
String[] split = request.getParameter("nodeID").split(",",0);
for(int i=0;i<split.length;i ){
long file=Long.parseLong(split[i]);
List files = fileFacade.list_items(file);
for (Iterator rstltr = files.iterator(); rstltr.hasNext();) {
Fmedia fv = (Fmedia) rstltr.next();
Node nd = nodeFacade.get(fv.getNodeid(), false);
// Fmedia fm = fileFacade.get_file(fv.getNodeid());
int count = 0;
count ;
long fileid= nd.getNodeid();
SettingsFacadeLocal settingFacade = (SettingsFacadeLocal)ctx.lookup("java:comp/env/settings");
String redirectURL = settingFacade.get("SERVER_URL").getAtval();
//declare a timestamp for unique URL
// String timeStamp=new SimpleDateFormat("yyyy.MM.dd.HH.mm.ss").format(new java.util.Date());
// String hash = org.apache.commons.codec.digest.DigestUtils.sha256Hex(timeStamp);
SecureRandom secureRandom=new SecureRandom();
byte[] token = new byte[12];
secureRandom.nextBytes(token);
String hash= new BigInteger(1, token).toString(12);
%>
<tbody>
<tr>
<td width="5%">
<script>
function checkRow(element){
try {
var checked = $(element).is(':checked');
var rowCount = $(element).attr('rowcount');
var classRow = 'rowOut';
if(checked==true){
<%=nd.getNodeid()%>
}
if(rowCount % 2 == 1){
classRow = "rowOver";
}
}catch(err){
alert(err);
}
}
function copymultiplelink() {
var selectedFiles = $('.fileCheck:checked');
if(selectedFiles.length < 1 ){
alert("Please select at least one file.");
return false;
}
var $fileChecks = $('.fileCheck:checked');
$fileChecks.each(function() {
alert(<%out.print(nd.getNodeid());%>);
});
}
</script>
<!--Display Checkbox -->
<input type="checkbox" class="fileCheck" id="<%=tally=tally 1%>" onclick="checkRow(this)" />amp;nbsp;
</td>
<td>
<!--Display No -->
<% counter=counter 1;
out.print(counter);
%>
</td>
<td width="28%">
<!-- Display Filename -->
<%=nd.getNodedesc()%>
</td>
<td width="100%">
<!-- Display URL -->
<%=redirectURL "/repository/file/view/viewPDF.jsp?f0=" nd.getNodeid() "amp;ts=" hash%>
<%
fileFacade.insert_url(nd.getNodeid(),"f0=" nd.getNodeid() "amp;ts=" hash);
//fileFacade.insert_url(nd.getNodeid(),"{syscont url}/repository/file/view/viewPDF.jsp?{url});
%>
</td>
<td>
<!-- Display EDIT/DEL -->
</td>
<td> <!-- Display COPY feature -->
<input type="button" value="Copy URL" onclick="copyURL('<%=redirectURL "/repository/file/view/viewPDF.jsp?f0=" nd.getNodeid() "amp;ts=" hash%>')">
</td>
</tr>
</tbody>
<%}}
%>
<script>
function copyURL(url) {
var copyText = url;
var el = document.createElement('textarea');
el.value = copyText;
el.setAttribute('readonly', '');
el.style = {
position: 'absolute',
left: '-9999px'
};
document.body.appendChild(el);
el.select();
document.execCommand('copy');
document.body.removeChild(el);
alert("You have copied the URL");
}
</script>
</table>
</div>
<!--Copy button to copy multiple links -->
<div class="wrapper">
<input type="button" value="Copy Selected URL" onclick="copymultiplelink()">
</div>
<style>
.wrapper {
position: absolute;
top: 90%;
left: 5%;
}
</style>
</body>
Я написал функцию javascript copymultiplelink()
, чтобы иметь возможность определять каждый URL, привязанный к каждому флажку, но, по-видимому, я мог захватить только один из файлов, но не более одного, если я проверил два.
Есть идеи, как я мог бы решить эту дилемму?
Я ценю это.
Редактировать:
Это мой способ:
<script>
function copymultiplelink() {
var selectedFiles = $('.fileCheck:checked');
if(selectedFiles.length < 1 ){
alert("Please select at least one file.");
return false;
}
var filesList = [];
var $fileChecks = $('.fileCheck:checked');
$fileChecks.each(function() {
filesList.push($(this).val());
});
alert("You have copied " filesList.length " URL");
copyURL(filesList);
}
</script>
<!--Display Checkbox -->
<input type="checkbox" class="fileCheck" id="<%=tally=tally 1%>" value="<%=redirectURL "/repository/file/view/viewPDF.jsp?f0=" nd.getNodeid() "amp;ts=" hash%>" />amp;nbsp;
</td>
Ответ №1:
Вы могли бы сохранить массив отмеченных значений и соответствующим образом обновить его в checkRow
функции. В вашей copymultiplelink
функции вы можете выполнить итерацию по массиву и добавить redirectURI
каждую запись в пустую строку и выполнить copyURL(<GENERATED STRING>)
Определите переменную с именем var checkedRowArray = []
. Измените свою checkRow
функцию на
function checkRow(element) {
try {
var checked = $(element).is(':checked');
var rowCount = $(element).attr('rowcount');
var classRow = 'rowOut';
var nodeId = <%=nd.getNodeid()%>;
if (checked == true) {
checkedRowArray.push(nodeId);
} else {
checkedRowArray = checkedRowArray.filter(function(x) {
x !== nodeId;
})
}
if (rowCount % 2 == 1) {
classRow = "rowOver";
}
} catch (err) {
alert(err);
}
}
checkedRowArray
Переменная теперь содержит запись всех выбранных узлов.
copymultiplelink
функция:
function copymultiplelink () {
var copiedURLs = '';
for (var i in checkedRowArray) {
var node = checkedRowArray[i];
copiedURLs = `${<GET THE REDIRECT URL FROM NODEID>}n`;
}
copyURL(copiedURLs);
}
Комментарии:
1. Как это выглядит, я не уверен, что вы имеете в виду.?
2. Пожалуйста, помогите, я не мог понять это в течение нескольких часов.
3. Я сделал это по-другому, хотите увидеть мой ответ? Я не использовал функцию checkrow
4. Единственная проблема с моим решением — всплывающее предупреждение о том, сколько раз я устанавливаю флажок
5. Да, у вас должен быть
alert
вызов где-то в функции, от которой вы можете избавиться, я думаю.