IE8: ln.innerHTML имеет значение null или не является объектом

Я использую библиотеку wysiwyg 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 не вставляет ссылку, хотя и не показывает эту ошибку.


person Quadrant6    schedule 22.03.2012    source источник


Ответы (3)


Internet Explorer не обрабатывает innerHTML так же, как другие браузеры, особенно если вы говорите об элементах таблицы. См. здесь для обсуждение.

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

person blueberryfields    schedule 22.03.2012

Некоторая простая защитная логика должна работать:

    if (!this.ln.innerHTML || this.ln.innerHTML == tmp) {
        this.ln.innerHTML = this.inputs['title'].value || url;
    };
person AlienWebguy    schedule 22.03.2012

Эта проблема возникает, когда текст не выбран

мой трюк для nicEdit, в ситуации, когда текст не выделен, заключается в том, чтобы вставить заголовок, указанный в форме «Добавить ссылку», в документ и выбрать его, тогда остальной код работает так же, как и при выделении текста.

Я использовал функцию pasteHtmlAtCaret, описанную в следующей ссылке, чтобы вставить заголовок

Вставьте html в курсор в редактируемом контенте div

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();
}
person Ahmad    schedule 24.08.2013