Как сделать текстовое поле HTML доступным только для чтения, но также с возможностью прокрутки? - PullRequest
6 голосов
/ 29 ноября 2011

У меня есть текстовое поле HTML, которое я сделал ЧИТАТЬ.Дело в том, что поле шириной всего 100 пикселей.И у меня есть предложение, например, которое не отображается в этих 100 пикселях.Так как это ЧИТАЕТ, оно не прокручивается.

Другими словами.Как я могу все еще иметь поле, не редактируемое.Но также сделать так, чтобы более длинные строки, которые не помещались в поле, были доступны для просмотра?

спасибо!

Ответы [ 6 ]

4 голосов
/ 29 ноября 2011

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

Событие JavaScript keypress срабатывает при нажатии клавиши, но не срабатывает для клавиш курсора (по некоторым причинам). Это очень удобно, потому что если вы используете JavaScript для предотвращения действия по умолчанию, вы сортируетесь.

Так что в идеале это было бы то, что вам нужно:

// get all readonly inputs
var readOnlyInputs = document.querySelectorAll('input[readonly]');

// Function to fire when they're clicked
// We would use the focus handler but there is no focus event for readonly objects
function readOnlyClickHandler () {
    // make it not readonly
    this.removeAttribute('readonly');
}
// Function to run when they're blurred (no longer have a cursor
function readOnlyBlurHandler () {
    // make it readonly again
    this.setAttribute('readonly');
}
function readOnlyKeypressHandler (event) {
    // The user has just pressed a key, but we don't want the text to change
    // so we prevent the default action
    event.preventDefault();
}
// Now put it all together by attaching the functions to the events...

// We have to wrap the whole thing in a onload function.
// This is the simplest way of doing this...
document.addEventListener('load', function () {
    // First loop through the objects
    for (var i = 0; i < readOnlyInputs.length; i++) {
        // add a class so that CSS can style it as readonly
        readOnlyInputs[i].classList.add('readonly');
        // Add the functions to the events
        readOnlyInputs[i].addEventListener('click', readOnlyClickHandler);
        readOnlyInputs[i].addEventListener('blur', readOnlyBlurHandler);
        readOnlyInputs[i].addEventListener('keypress', readOnlyKeypressHandler);
    }
});

Просто скопируйте и вставьте это, и оно должно нормально работать в Firefox или Chrome. Код соответствует стандартам , а Internet Explorer - нет. Так что это не будет работать в IE (кроме, может быть, версий 9 и 10 ... не уверен насчет этого). Кроме того, бит classList.add не будет работать во всех, кроме некоторых из самых последних версий браузеров. Таким образом, мы должны изменить эти биты. Сначала мы адаптируем функцию readOnlyKeypressHandler, потому что event.preventDefault() работает не для каждого браузера.

function readOnlyKeypressHandler (event) {
    if (event && event.preventDefault) {
        // This only runs in browsers where event.preventDefault exists,
        // so it won't throw an error
        event.preventDefault();
    }
    // Prevents the default in all other browsers
    return false;
}

Теперь изменим бит classList.

    // add a class so that CSS can style it as readonly
    if (readOnlyInputs[i].classList) {
        readOnlyInputs[i].classList.add('readonly');
    } else {
        readOnlyInputs[i].className += ' readonly';
    }

Досадно, но addEventListener не поддерживается и в IE, поэтому вам нужно создать функцию для обработки этого отдельно (добавить ее над циклом for)

function addEvent(element, eventName, fn) {
    if (element.addEventListener) {
        element.addEventListener(eventName, fn, false);
    } else if (element.attachEvent) {
        // IE requires onclick instead of click, onfocus instead of focus, etc.
        element.attachEvent('on' + eventName, fn);
    } else {
        // Much older browsers
        element['on' + eventName] = fn;
    }
}

Затем измените бит добавления событий:

    addEvent(readOnlyInputs[i], 'click', readOnlyClickHandler);
    addEvent(readOnlyInputs[i], 'blur', readOnlyBlurHandler);
    addEvent(readOnlyInputs[i], 'keypress', readOnlyKeypressHandler);

И дать функции загрузки документа имя вместо вызова в addEventListener:

function docLoadHandler () {
    ...
}

И позвони в конце

addEvent(document, 'load', docLoadHandler);

И как только вы это сделаете, он должен работать во всех браузерах.

Теперь просто используйте CSS для стилизации класса readonly, чтобы убрать контур в браузерах, которые его отображают:

.readonly:focus {
    outline: none;
    cursor: default;
}
2 голосов
/ 19 апреля 2014

Не делайте текстовую область только для чтения.Вот что я сделал:

<textarea id="mytextarea" wrap="off" style="overflow:auto"></textarea>

, затем в вашем JavaScript, используя jQuery:

$('#mytextarea').keypress(function(event){
    event.preventDefault();
});
0 голосов
/ 29 ноября 2011

если http://jsfiddle.net/msmailbox/jBGne/ это то, что вам нужно, вы можете попробовать это с помощью div.

<div id="alo">sfbskdgksfbgkjsfngndflgndfgldfngldfgldfg</div>

с CSS

#alo
{
    width:100px;
    overflow-x:scroll;
    overflow-y:hidden;
}
0 голосов
/ 29 ноября 2011

Используйте текстовое поле вместо текстового поля ввода.Вы не можете добавить прокрутку к текстовому полю

<textarea cols="50" rows="5" ></textarea>

0 голосов
/ 29 ноября 2011

Определите высоту для вашего контейнера div текста и используйте переполнение: автоматически что-то вроде ниже кода CSS.

.yoruclass{
width:100px;
height:100px;/* stop text to go beyond the define height */
overflow:hidden;/* making text div scrollable */
}
0 голосов
/ 29 ноября 2011

Свойство CSS overflow задает поведение прокрутки, например, overflow: auto отображает полосы прокрутки только тогда, когда содержимое выходит за пределы области.С overflow: scroll вы получаете полосы прокрутки каждый раз.

...