jQuery прив’язується до події вставки, як отримати вміст пасти


75

У мене є плагін jquery token tagit, і я хочу прив’язати до події вставки, щоб правильно додавати елементи.

Я можу прив’язати подію вставлення так:

    .bind("paste", paste_input)

...

function paste_input(e) {
    console.log(e)
    return false;
}

Як я можу отримати фактичне вставлене значення вмісту?

Відповіді:


145

Існує подія, яка працює в сучасних браузерах. Ви можете отримати доступ до вставлених даних за допомогою getDataфункції на clipboardDataоб’єкті.

$("#textareaid").bind("paste", function(e){
    // access the clipboard using the api
    var pastedData = e.originalEvent.clipboardData.getData('text');
    alert(pastedData);
} );

Зверніть увагу, що прив’язка та відв’язування застаріли станом на jQuery 3. Переважним викликом є on .

Усі сучасні браузери підтримують API буфера обміну .

Дивіться також: У Jquery Як обробляти пасту?


7
Цей код видасть помилку на var pastedData =лінії: Uncaught TypeError: Cannot read property 'getData' of undefined. Вам потрібно змінити e.clipboardDataна e.originalEvent.clipboardData. Я підозрюю, що jquery обгортає фактичну подію вставки в власну подію - не цитуйте мене з цього приводу.
FireWing, веде

1
e.originalEvent.clipboardData.getData('text/plain')працював у мене
Шрідхар

3
на випадок, якщо вам це потрібно, рішення для IE:window.clipboardData.getData('text')
DdW

Ви можете додати обробники подій до подій pasteта inputподій, встановити прапор у pasteобробнику подій та перевірити наявність цього прапора в inputобробнику подій. У ньому this.valueзначення є вставленим значенням, і це працює в IE11.
Niloct

19

Як щодо цього: http://jsfiddle.net/5bNx4/

Будь ласка, використовуйте .on якщо ви використовуєте jq1.7 та ін.

Поведінка: Коли ви вводите що-небудь або paste небудь на 1-му текстовому майданчику, внизу teaxtarea захоплює канавку.

Відпочинок Сподіваюся, це допоможе справі. :)

Корисне посилання =>

Як ви обробляєте oncut, oncopy та onpaste у jQuery?

Введіть вставну пасту

код

$(document).ready(function() {
    var $editor    = $('#editor');
    var $clipboard = $('<textarea />').insertAfter($editor);

    if(!document.execCommand('StyleWithCSS', false, false)) {
        document.execCommand('UseCSS', false, true);
    }

    $editor.on('paste, keydown', function() {
        var $self = $(this);            
        setTimeout(function(){ 
            var $content = $self.html();             
            $clipboard.val($content);
        },100);
     });
});

1
@Raminson Так, я був undefinedна кілька днів у innit:P
Tats_innit

1
Він не обслуговує вставку контекстного меню (клацання правою кнопкою миші + вставка), є якісь ідеї щодо цього?
0_o

11

Нещодавно мені потрібно було зробити щось подібне до цього. Я використовував наступний дизайн, щоб отримати доступ до елемента вставлення та значення. демонстрація jsFiddle

$('body').on('paste', 'input, textarea', function (e)
{
    setTimeout(function ()
    {
        //currentTarget added in jQuery 1.3
        alert($(e.currentTarget).val());
        //do stuff
    },0);
});

6

Інший підхід: ця inputподія також зафіксує pasteподію.

$('textarea').bind('input', function () {
    setTimeout(function () { 
        console.log('input event handled including paste event');
    }, 0);
});

2
$(document).ready(function() {
    $("#editor").bind('paste', function (e){
        $(e.target).keyup(getInput);
    });

    function getInput(e){
        var inputText = $(e.target).html(); /*$(e.target).val();*/
        alert(inputText);
        $(e.target).unbind('keyup');
    }
});

2

Це працює у всьому браузері, щоб отримати вставлене значення. А також до створення загального методу для всього текстового поля.

$("#textareaid").bind("paste", function(e){       
    var pastedData = e.target.value;
    alert(pastedData);
} )

1
e.target.valueможливо , буде потрібно setTimeout stackoverflow.com/a/1503425/577052
Бернхард Доблер

1

Ви можете порівняти початкове значення поля та змінене значення поля та вирахувати різницю як вставлене значення. Це правильно ловить вставлений текст, навіть якщо в полі є наявний текст.

http://jsfiddle.net/6b7sK/

function text_diff(first, second) {
    var start = 0;
    while (start < first.length && first[start] == second[start]) {
        ++start;
    }
    var end = 0;
    while (first.length - end > start && first[first.length - end - 1] == second[second.length - end - 1]) {
        ++end;
    }
    end = second.length - end;
    return second.substr(start, end - start);
}
$('textarea').bind('paste', function () {
    var self = $(this);
    var orig = self.val();
    setTimeout(function () {
        var pasted = text_diff(orig, $(self).val());
        console.log(pasted);
    });
});

1

Здавалося б, до цієї події clipboardDataприєднано якесь властивість (воно може бути вкладене в originalEventвластивість). clipboardDataМістить масив елементів , і кожен з цих елементів має getAsString()функцію, яку можна викликати. Це повертає рядкове представлення того, що є в елементі.

Ці елементи також мають getAsFile()функцію, а також деякі інші, що стосуються браузера (наприклад, у браузерах webkit є webkitGetAsEntry()функція).

Для моїх цілей мені знадобилося рядкове значення того, що вставляється. Отже, я зробив щось подібне до цього:

$(element).bind("paste", function (e) {
    e.originalEvent.clipboardData.items[0].getAsString(function (pStringRepresentation) {
        debugger; 
        // pStringRepresentation now contains the string representation of what was pasted.
        // This does not include HTML or any markup. Essentially jQuery's $(element).text()
        // function result.
    });
});

Ви захочете виконати ітерацію по елементах, зберігаючи результат об’єднання рядків.

Той факт, що існує безліч предметів, змушує мене думати, що потрібно буде зробити більше роботи, аналізуючи кожен предмет. Ви також захочете зробити деякі перевірки нуля / значення.


1
Не могли б ви позначити, до яких браузерів це стосується?
Оуен Бересфорд,

1

У сучасних браузерах це просто: просто використовуйте подію input разом з атрибутом inputType :

$(document).on('input', 'input, textarea', function(e){
  if (e.originalEvent.inputType == 'insertFromPaste') {
    alert($(this).val());
  }
});

https://codepen.io/anon/pen/jJOWxg

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.