需求
有一堆复制按钮和待复制的文本(复制按钮和文本一一对应)
<script>
Succubus.FetchJSON('包含待复制文本的文件.json')
.then(data=>{
var color_value_list = Array(data.length)
for(var color_index = 0; color_index < data.length; color_index++){
color_value_list[color_index] = data[color_index]['value']
}
document.getElementsByClassName('palette')[0].innerHTML += colorContainerWrite(data)
...
})
</script>
其中省略号部分是添加复制操作的函数/方法。
JSON数据格式:
{
{
"name": "灵梦红",
"value": "#DE3C31"
},
...
}
我们需要复制其中的"value"
。
尝试
#1
export function ClipboardCopyByClass(class_id: string, text: Array<string>, success_event_curse: CallableFunction = (function () { }), failed_event_curse: CallableFunction = (function () { console.log('Clipboard Write Failed.') })) {
var elements = document.getElementsByClassName(class_id)
for (var i = 0; i < elements.length; i++) {
var element = elements.item(i) as HTMLElement
var use_text = ''
if(i >= text.length){
use_text = text[text.length - 1]
}else{
use_text = text[i]
}
element.addEventListener('click', (function () {
navigator.clipboard.writeText(use_text)
.then(
() => {
success_event_curse()
},
() => {
failed_event_curse()
}
)
}))
}
}
然后发现无论按下什么按钮,复制出来的文本都是text[text.length - 1
#2
我认为是深浅拷贝的问题,于是将代码换成了这样子
export function JSON_DeepCopy(obj: Array<any> | string | number) {
return JSON.parse(JSON.stringify(obj))
}
export function ClipboardCopyByClass(class_id: string, text: Array<string>, success_event_curse: CallableFunction = (function () { }), failed_event_curse: CallableFunction = (function () { console.log('Clipboard Write Failed.') })) {
var elements = document.getElementsByClassName(class_id)
for (var i = 0; i < elements.length; i++) {
var element = elements.item(i) as HTMLElement
element.addEventListener('click', (function () {
navigator.clipboard.writeText(i < text.length ? text[i] : text[text.length - 1])
.then(
() => {
success_event_curse()
},
() => {
failed_event_curse()
}
)
}))
}
}
问题依旧存在
#3
「会不会是作用域的问题?」
export class CBCopy {
text_array: Array<string>
constructor(text_array: Array<string>) {
this.text_array = JSON_DeepCopy(text_array)
}
add_copy(
element_class: string,
success_event_curse: CallableFunction = (function () { }),
failed_event_curse: CallableFunction = (function () { console.log('Clipboard Write Failed.') })
) {
var element_collection = document.getElementsByClassName(element_class)
for (var i = 0; i < element_collection.length; i++) {
let element = <HTMLElement>element_collection[i]
element.onclick = (() => {
let p = this.text_array[i]
navigator.clipboard.writeText(p)
.then(
() => {
console.log(p)
success_event_curse()
},
() => {
failed_event_curse()
}
)
})
}
}
}
然后...复制了一堆undefined...
所以
- 这三份代码的问题各自出在哪里?
- 又应该如何正确地使每一个按钮都能够复制出正确的文本呢?
谢谢。(两个问题解决采纳)