0

我正在使用 nicedit.js 所见即所得库,并且插入链接的按钮出现问题。

单击按钮会弹出一个面板,您可以在其中输入 url 和标题,然后单击提交:链接应该插入到您的光标位置。但我在 IE8 中收到以下错误:

ln.innerHTML 为 null 或不是对象


错误行是:

if (this.ln.innerHTML == tmp) {


完整代码

var nicLinkButton = nicEditorAdvancedButton.extend({    
addPane : function() {
    this.ln = this.ne.selectedInstance.selElm().parentTag('A');
    this.addForm({
        '' : {type : 'title', txt : 'Add/Edit Link'},
        'href' : {type : 'text', txt : 'URL', value : 'http://', style : {width: '150px'}},
        'title' : {type : 'text', txt : 'Title'},
        'target' : {type : 'select', txt : 'Open In', options : {'' : 'Current Window', '_blank' : 'New Window'},style : {width : '100px'}}
    },this.ln);
},

submit : function(e) {        

    var url = this.inputs['href'].value;
    if(url == "http://" || url == "") {
        alert("You must enter a URL to Create a Link");
        return false;
    }
    this.removePane();

    if(!this.ln) {
        var tmp = 'javascript:nicTemp();';
        this.ne.nicCommand("createlink",tmp);
        this.ln = this.findElm('A','href',tmp);
        // set the link text to the title or the url if there is no text selected
        if (this.ln.innerHTML == tmp) {
            this.ln.innerHTML = this.inputs['title'].value || url;
        };
    }
    if(this.ln) {
        var oldTitle = this.ln.title;
        this.ln.setAttributes({
            href : this.inputs['href'].value,
            title : this.inputs['title'].value,
            target : this.inputs['target'].options[this.inputs['target'].selectedIndex].value
        });
        // set the link text to the title or the url if the old text was the old title
        if (this.ln.innerHTML == oldTitle) {
            this.ln.innerHTML = this.inputs['title'].value || this.inputs['href'].value;
        };
    }
}

});

即使 nicedit.com 主页上的示例也没有插入链接,尽管它也没有显示此错误。

4

3 回答 3

0

未选择文本时会出现此问题

在没有选择文本的情况下,我对 nicEdit 的技巧是将通过“添加链接”表单给出的标题粘贴到文档中并选择它,然后其余代码在选择文本时工作。

我使用以下链接中描述的函数 pasteHtmlAtCaret 来粘贴标题

在 contenteditable div 中的插入符号处插入 html

var selected = getSelected();
if (selected == '')
    pasteHtmlAtCaret(this.inputs['title'].value,true);
if(!this.ln) {
    var tmp = 'javascript:nicTemp();';
    this.ne.nicCommand("createlink",tmp);
    this.ln = this.findElm('A','href',tmp);
    // set the link text to the title or the url if there is no text selected
    if (!this.ln.innerHTML || this.ln.innerHTML == tmp) {
        this.ln.innerHTML = this.inputs['title'].value || url;
    };
}

getSelected 也是一个简单的函数,如下所示

function getSelected()
{
    if (document.selection)
        return document.selection.createRange().text;
    else
        return window.getSelection();
}
于 2013-08-24T18:32:07.960 回答
0

Internet Explorer 处理innerHTML 的方式与其他浏览器不同,尤其是在您讨论表格元素时。请参阅此处进行讨论。

根据您的具体情况,有各种各样的修复 -这个建议涵盖了大多数情况。或者,如果您想与 IE 兼容,您可能必须删除并重新创建表格元素,而不是更新它们的 innerHTML。

于 2012-03-22T21:41:57.017 回答
0

一些简单的防御逻辑应该起作用:

    if (!this.ln.innerHTML || this.ln.innerHTML == tmp) {
        this.ln.innerHTML = this.inputs['title'].value || url;
    };
于 2012-03-22T21:42:00.313 回答