我正在运行一个脚本,以对带有contenteditable的div中的粘贴文本进行清理。效果很好,但是在FF中,如果将文本复制到div或div之间,则删除了换行符。有什么解决办法吗?如果我从其他来源粘贴文本,则换行符是完整的。除了以下解决方案外,我还接受其他解决方案。
import random
user = (str(random.randint(1, 9999999999999999999)) + str(input()))
import time
time.sleep(1)
print ("Please enter your password")
passw = str(input())
import random
import webbrowser
from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver.common.keys import Keys
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
NumberOfEntries = int(input("Please enter the amount of accs you would like: "))
counter = 1
for x in range(0, NumberOfEntries):
print('Entry ', counter)
counter = counter + 1
options = Options()
options.add_argument('--headless')
browser = webdriver.Chrome(options=options)
browser.get('https://www.instagram.com/')
email = browser.find_element_by_name("emailOrPhone")
name = browser.find_element_by_name("fullName")
username = browser.find_element_by_name("username")
password = browser.find_element_by_name("password")
// Paste fix for contenteditable
$(document).on('paste', '[contenteditable]', function (e) {
e.preventDefault();
if (window.clipboardData) {
content = window.clipboardData.getData('Text');
if (window.getSelection) {
var selObj = window.getSelection();
var selRange = selObj.getRangeAt(0);
selRange.deleteContents();
selRange.insertNode(document.createTextNode(content));
}
} else if (e.originalEvent.clipboardData) {
content = (e.originalEvent || e).clipboardData.getData('text/plain');
document.execCommand('insertText', false, content);
}
});
div {
white-space: pre-wrap;
}
答案 0 :(得分:4)
如所承诺的,这是在问题的评论中讨论的这种实现的可行解决方案。
在使用Selection and Range API(https://developer.mozilla.org/en-US/docs/Web/API/Range)时,我发现Range对象具有toString()方法,因此我想对其进行测试,以查看是否在此处,之前或之后修剪了换行符。>
幸运的是,我发现FF Range对象中的toString()方法不会修剪换行符。
因此,这是我的代码和小提琴,用于覆盖默认的复制功能,(在复制事件中)覆盖剪贴板中的内容。
a = [3, 4, 5]
b = [1, 2, 3, 4, 5]
$(document).on('copy', '[contenteditable]', function (e) {
e = e.originalEvent;
var selectedText = window.getSelection();
console.log("original copied text\n--------\n", selectedText.toString());
var range = selectedText.getRangeAt(0);
var selectedTextReplacement = range.toString()
console.log("replacement in clipboard\n--------\n", selectedTextReplacement);
e.clipboardData.setData('text/plain', selectedTextReplacement);
e.preventDefault(); // default behaviour is to copy any selected text
});
// Paste fix for contenteditable
$(document).on('paste', '[contenteditable]', function (e) {
e.preventDefault();
if (window.clipboardData) {
content = window.clipboardData.getData('Text');
if (window.getSelection) {
var selObj = window.getSelection();
var selRange = selObj.getRangeAt(0);
selRange.deleteContents();
selRange.insertNode(document.createTextNode(content));
}
} else if (e.originalEvent.clipboardData) {
content = (e.originalEvent || e).clipboardData.getData('text/plain');
document.execCommand('insertText', false, content);
}
});
div {
white-space: pre-wrap;
}
我还对边缘和镀铬进行了粗略测试,并且覆盖了“不会弄乱它们”的功能,因此也许您可以保留它以控制复制某些内容时它们在做什么。
最后,我仍然有一个问题一直在我脑海里大喊: 如果您不想在前端元素中使用html,为什么还要使用contenteditable div而不是textarea?