Ввод патчей

Я ищу способ дезинформировать ввод, который я вставляю в браузер, возможно ли это с jQuery?

Мне до сих пор удалось найти это:

$(this).live(pasteEventName, function(e) {
 // this is where i would like to sanitize my input
 return false;
}

К сожалению, мое развитие вызвало визг из-за этой "незначительной" проблемы. Я действительно сделал бы меня счастливым кемпиром, если бы кто-то мог указать мне в правильном направлении.

Ответ 1

Я как бы исправил его, используя следующий код:

$("#editor").live('input paste',function(e){
    if(e.target.id == 'editor') {
        $('<textarea></textarea>').attr('id', 'paste').appendTo('#editMode');
        $("#paste").focus();
        setTimeout($(this).paste, 250);
    }
});

Теперь мне просто нужно сохранить местоположение каретки и добавить в эту позицию, тогда я все установлен... Я думаю:)

Ответ 2

ОК, просто столкнулся с той же проблемой.. Я обошел длинный путь

$('input').on('paste', function () {
  var element = this;
  setTimeout(function () {
    var text = $(element).val();
    // do something with text
  }, 100);
});

Только небольшой тайм-аут до заполнения функции .val() может быть заполнен.

Е.

Ответ 3

Для совместимости с кросс-платформой он должен обрабатывать события oninput и onpropertychange:

$ (something).bind ("input propertychange", function (e) {
    // check for paste as in example above and
    // do something
})

Ответ 4

Фактически вы можете получить значение прямо из события . Его немного тупо, как добраться до него, хотя.

Возвращает false, если вы не хотите, чтобы он прошел.

$(this).on('paste', function(e) {

  var pasteData = e.originalEvent.clipboardData.getData('text')

}

Ответ 5

Хм... Я думаю, вы можете использовать e.clipboardData, чтобы поймать вставляемые данные. Если это не происходит, посмотрите здесь.

$(this).live("paste", function(e) {
    alert(e.clipboardData); // [object Clipboard]
});

Ответ 6

Прослушайте событие вставки и установите прослушиватель событий клавиатуры. На клавиатуре захватите значение и удалите прослушиватель событий keyup.

$('.inputTextArea').bind('paste', function (e){
    $(e.target).keyup(getInput);
});
function getInput(e){
    var inputText = $(e.target).val();
    $(e.target).unbind('keyup');
}

Ответ 7

Это приближается к тому, что вам может понадобиться.

function sanitize(s) {
  return s.replace(/\bfoo\b/g, "~"); 
};

$(function() {
 $(":text, textarea").bind("input paste", function(e) {
   try {
     clipboardData.setData("text",
       sanitize(clipboardData.getData("text"))
     );
   } catch (e) {
     $(this).val( sanitize( $(this).val() ) );
   }
 });
});

Обратите внимание, что когда объект clipboardData не найден (в браузерах, отличных от IE), вы в настоящее время получаете полное значение элемента + значение буфера обмена.

Возможно, вы можете сделать несколько дополнительных шагов, чтобы различить два значения перед входом и после ввода, если вы действительно только после того, какие данные действительно вставлены в элемент.

Ответ 8

Как сравнить исходное значение поля и измененное значение поля и вычесть разницу в качестве вставленного значения? Это правильно вставляет вложенный текст, даже если в поле есть существующий текст.

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);
    });
});

Ответ 9

 $('').bind('input propertychange', function() {....});                      

Это будет работать для события вставки мыши.

Ответ 10

$("#textboxid").on('input propertychange', function () {
    //perform operation
        });

Он будет работать нормально.

Ответ 11

Этот код работает для меня либо вставкой с правого щелчка, либо с прямой копией.

   $('.textbox').on('paste input propertychange', function (e) {
        $(this).val( $(this).val().replace(/[^0-9.]/g, '') );
    })

Когда я вставляю Section 1: Labour Cost, он становится 1 в текстовом поле.

Чтобы разрешить только значение float, я использую этот код

 //only decimal
    $('.textbox').keypress(function(e) {
        if(e.which == 46 && $(this).val().indexOf('.') != -1) {
            e.preventDefault();
        } 
       if (e.which == 8 || e.which == 46) {
            return true;
       } else if ( e.which < 48 || e.which > 57) {
            e.preventDefault();
      }
    });

Ответ 12

Смотрите этот пример: http://www.p2e.dk/diverse/detectPaste.htm

Это важно отслеживать каждое изменение с помощью oninput-события, а затем проверяет, имеет ли его вставку сравнение строк. О, и в IE это событие onpaste. Итак:

$ (something).bind ("input paste", function (e) {
    // check for paste as in example above and
    // do something
})

Ответ 14

Этот метод использует содержимое jqueries(). unwrap().

  • Сначала определите событие вставки
  • Добавьте уникальный класс к тегам, которые уже находятся в элементе, в который мы вставляем.
  • После заданного тайм-аута сканирование всех тегов разворачивания содержимого, у которых нет класса, установленного ранее. Примечание. Этот метод не удаляет самозакрывающиеся теги, например
    См. пример ниже.

    //find all children .find('*') and add the class .within .addClass("within") to all tags
    $('#answer_text').find('*').each(function () {
    $(this).addClass("within");
    });
    setTimeout(function() {
    $('#answer_text').find('*').each(function () {
        //if the current child does not have the specified class unwrap its contents
        $(this).not(".within").contents().unwrap();
    });
    }, 0);
    

Ответ 15

Это оказалось довольно иллюзорным. Значение ввода не обновляется до выполнения кода внутри функции события вставки. Я попытался вызывать другие события из функции события вставки, но входное значение все еще не обновляется вставляемым текстом внутри функции любых событий. Это все события, кроме клавишных. Если вы вызываете keyup из функции функции вставки, вы можете дезинфицировать вложенный текст из функции события keyup. как это...

$(':input').live
(
    'input paste',
    function(e)
    {
        $(this).keyup();
    }
);

$(':input').live
(
    'keyup',
    function(e)
    {
        // sanitize pasted text here
    }
);

Здесь есть одна оговорка. В Firefox, если вы reset вводите текст на каждой клавиатуре, если текст длиннее видимой области, разрешенной шириной ввода, то сброс значения на каждом ключевом сломе нарушает функциональность браузера, которая автоматически прокручивает текст до положения каретки в конце текста. Вместо этого текст прокручивается до начала, оставляя карет вне поля зрения.

Ответ 16

Script, чтобы удалить специальные символы из всех полей с полем портлета-ввода-типа класса:

// Remove special chars from input field on paste
jQuery('.portlet-form-input-field').bind('paste', function(e) {
    var textInput = jQuery(this);
    setTimeout(function() {
        textInput.val(replaceSingleEndOfLineCharactersInString(textInput.val()));
    }, 200);
});

function replaceSingleEndOfLineCharactersInString(value) {
    <%
        // deal with end-of-line characters (\n or \r\n) that will affect string length calculation,
        // also remove all non-printable control characters that can cause XML validation errors
    %>
    if (value != "") {
        value = value.replace(/(\x00|\x01|\x02|\x03|\x04|\x05|\x06|\x07|\x08|\x0B|\x0C|\x0E|\x0F|\x10|\x11|\x12|\x13|\x14|\x15|\x16|\x17|\x18|\x19|\x1A|\x1B|\x1C|\x1D|\x1E|\x1F|\x7F)/gm,'');
        return value = value.replace(/(\r\n|\n|\r)/gm,'##').replace(/(\#\#)/gm,"\r\n");
    }
}

Ответ 17

Здесь есть одна оговорка. В Firefox, если вы reset вводите текст на каждой клавиатуре, если текст длиннее видимой области, разрешенной шириной ввода, то сброс значения на каждом ключевом сломе нарушает функциональность браузера, которая автоматически прокручивает текст до положения каретки в конце текста. Вместо этого текст прокручивается до начала, оставляя карет вне поля зрения.

function scroll(elementToBeScrolled) 
{
     //this will reset the scroll to the bottom of the viewable area. 
     elementToBeScrolled.topscroll = elementToBeScrolled.scrollheight;
}