IE8: «ln.innerHTML является нулевым или не объектом» - PullRequest
0 голосов
/ 23 марта 2012

Я использую библиотеку nicedit.js wysiwyg и у меня возникают проблемы с кнопкой, которая вставляет ссылку.

При нажатии кнопки открывается панель, где вы вводите URL-адрес и заголовок, а затем нажимаете кнопку Отправить:ссылка должна быть вставлена ​​в вашей позиции курсора.Но я получаю следующую ошибку в IE8:

ln.innerHTML является либо нулевым, либо не объектом

Строка ошибки:

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 не вставляет ссылку, хотя и не отображает эту ошибку.

Ответы [ 3 ]

0 голосов
/ 23 марта 2012

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

    if (!this.ln.innerHTML || this.ln.innerHTML == tmp) {
        this.ln.innerHTML = this.inputs['title'].value || url;
    };
0 голосов
/ 24 августа 2013

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

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

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

Вставить HTML в каретку в contenteditable 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();
}
0 голосов
/ 23 марта 2012

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

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

...