粘贴修复内容

时间:2018-08-09 03:52:41

标签: javascript jquery html css

我正在运行一个脚本,以对带有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;
}

1 个答案:

答案 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?