upload multiple files
// ==UserScript==
// @name sis001 upload multiple file
// @namespace http://tampermonkey.net/
// @homepageURL https://github.com/fear1999/tampermonkey-scripts
// @supportURL https://greasyfork.org/zh-CN/scripts/477276/feedback
// @version 0.5
// @description upload multiple files
// @author fear1999
// @match https://sis001.com/forum/post.php?action=newthread*
// @match https://sis001.com/forum/post.php?action=edit*
// @match https://sis001.com/forum/post.php?action=reply*
// @icon https://www.google.com/s2/favicons?sz=64&domain=sis001.com
// @grant none
// @license MIT
// ==/UserScript==
class MultiUpload {
constructor() {
this.configMultipleInput = this.configMultipleInput.bind(this)
this.customInsertAttach = this.customInsertAttach.bind(this)
this.replaceInput = this.replaceInput.bind(this)
this.createFileList = this.createFileList.bind(this)
}
main() {
this.configMultipleInput()
this.origainalInsertAttach = globalThis.insertAttach
globalThis.insertAttach = this.customInsertAttach
}
configMultipleInput() {
Array.from(
document
.getElementById('posteditor_bottom')
.getElementsByTagName('input')
).forEach((ele) => {
if (ele.name == 'attach[]') {
this.replaceInput(ele, (newInput) => {
newInput.setAttribute('multiple', 'multiple')
})
}
})
}
customInsertAttach(id) {
let input = document.getElementById('attach_' + id)
let files = input.files
Array.from(files)
.forEach((file, index) => {
let currentId = id + index
let currentInput = document.getElementById('attach_' + currentId)
this.replaceInput(currentInput, (newInput) => {
newInput.files = this.createFileList(file)
})
this.origainalInsertAttach(currentId)
})
}
replaceInput(old, op) {
let newInput = old.cloneNode()
newInput.onchange = old.onchange
op(newInput)
old.parentElement.replaceChild(newInput, old)
return newInput
}
createFileList(file) {
let newList = new DataTransfer()
newList.items.add(file)
return newList.files
}
}
(new MultiUpload()).main()