document.execCommand不会在IE11中展开

时间:2015-12-29 14:14:37

标签: javascript html5 internet-explorer-11 wysiwyg

我正在尝试将iframe(在designMode中)用作富文本编辑器。

<iframe name="richTextField" id="richTextField" class="rte"></iframe>

我还有一个按钮,可以通过调用javascript函数iBold在iframe中加粗/解开文本。

<a href="javascript:iBold()" type="button" value="bold"><img src="/images/bold.gif" id="boldButton"/></a>

function iBold()
{
    richTextField.document.execCommand('bold');
    console.log(window.frames['richTextField'].document.body.innerHTML);
}

粗体按钮适用于大多数情况,但有一种情况不起作用(在IE11中)。如果我在iframe中选择(突出显示)文本的一小部分,我可以加粗它并用粗体按钮解开它,但是如果我在iframe中选择所有文本,我可以加粗它,但我永远不能解开它。在那之后,文本永远是大胆的;无论我选择/突出显示什么,execCommand都不会解开任何东西。注意:它当然适用于Firefox。

http://jsbin.com/hiwetumobo/1/edit?html,js,output

1 个答案:

答案 0 :(得分:0)

这不是最好的解决方案,但至少可以使用以下方法。

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;

public class BlockingByteArrayInputStream extends ByteArrayInputStream {
    private CountDownLatch latch;

    public BlockingByteArrayInputStream(byte[] buf) {
        super(buf);
        latch = new CountDownLatch(1);
    }

    @Override
    public synchronized int read() {
        int read = super.read();
        if (read == -1) {
            waitForUnblock();
        }
        return read;
    }

    @Override
    public int read(byte[] b) throws IOException {
        int read = super.read(b);
        if (read == -1) {
            waitForUnblock();
        }
        return read;
    }

    @Override
    public synchronized int read(byte[] b, int off, int len) {
        int read = super.read(b, off, len);
        if (read == -1) {
            waitForUnblock();
        }
        return read;
    }

    private void waitForUnblock() {
        try {
            latch.await(10, TimeUnit.SECONDS);
        } catch (InterruptedException e) {
            throw new RuntimeException("safeAwait interrupted");
        }
    }

    @Override
    public void close() throws IOException {
        super.close();
        latch.countDown();
    }
}