如何使HTML文本字段只读,但也可滚动?

时间:2011-11-29 09:00:06

标签: html field readonly scrollable

我有一个HTML文本字段,我已经做了READONLY。然而,事实上,该领域只有100像素宽。例如,我有一个句子没有显示在100个像素中。由于它的READONLY它不可滚动。

换句话说。我怎么还能让这个字段不可编辑。但是,也可以使那些不适合该领域的较长字符串可见?

谢谢!

6 个答案:

答案 0 :(得分:4)

您可以使用一些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';
    }

令人讨厌的是,IE中也不支持addEventListener,所以你需要创建一个单独处理它的函数(将它添加到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;
}

答案 1 :(得分:2)

不要让textarea只读。这就是我所做的:

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

,然后在你的JavaScript中,使用jQuery:

$('#mytextarea').keypress(function(event){
    event.preventDefault();
});

答案 2 :(得分:0)

CSS属性overflow设置滚动行为,例如overflow: auto仅在内容超出区域时显示滚动条。使用overflow: scroll,您每次都会获得滚动条。

答案 3 :(得分:0)

为容器div文本定义高度并使用overflow:auto类似于下面的css代码。

.yoruclass{
width:100px;
height:100px;/* stop text to go beyond the define height */
overflow:hidden;/* making text div scrollable */
}

答案 4 :(得分:0)

使用Textarea而不是输入文本字段。你无法将滚动添加到文本字段

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

答案 5 :(得分:0)

如果http://jsfiddle.net/msmailbox/jBGne/这就是您所需要的,那么您可以尝试使用div。

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

用css

#alo
{
    width:100px;
    overflow-x:scroll;
    overflow-y:hidden;
}