当前位置: 首页>>建站开发>>正文


香草SP2010安装中的“a is null”错误

webfans 建站开发 , , , 去评论

问题描述

我正在设置SP2010 VM以进行开发测试。我们的vanilla安装没有其他组件存在,并且在Chrome和Firefox中引发了JS错误。在Firefox(第13版)中:

a is null
http://hovmdvmrg06/_layouts/sp.ui.rte.js?rev=aTi1rujCmyK4y06NVUncdQ%3D%3D
Line 2

在Chrome中(当前):

Uncaught TypeError: Cannot call method 'parentElement' of null /_layouts/sp.ui.rte.js?rev=aTi1rujCmyK4y06NVUncdQ%3D%3D:2

这是我测试一些我正在研究的JS的主要阻碍因素,我对错误的搜索并没有改变。我不知道它是否相关,但IE有一个HTML警告:

HTML1114: Codepage unicode from (UNICODE byte order mark) overrides conflicting codepage windows-1252 from (11)

Opera 11似乎也没有抛出错误。

最佳解决办法

你也可以用这种方式修复。

SP.SOD.executeFunc('sp.ui.rte.js', null, function () {
    if (/var \$v_0 = RTE\.Selection\.getSelectionRange\(\);[\r\n\t ]*var \$v_1 = \$v_0\.parentElement\(\);/.test(RTE.Canvas.checkCurrentFocus.toString())) {
        var _oldCheckCurrentFocus = RTE.Canvas.checkCurrentFocus;
        RTE.Canvas.checkCurrentFocus = function () {   
            if(RTE.Selection.getSelectionRange())
                return _oldCheckCurrentFocus();
        };
    }
});

使用SP.SOD.executeFunc等到RTE库加载后,一旦加载你首先保存原始实现然后测试它是否仍然有使用正则表达式的bug,如果有错误你覆盖原始函数的版本不会导致错误。

但请注意,我没有完全覆盖它,新函数检查RTE.Selection.getSelectionRange()是否返回有效对象,如果它执行了旧实现,否则函数结束。

这样我们就不会对本机代码造成太多混乱,如果微软修复它,你的代码将不再自动覆盖它们的功能。如果Microsoft更改了功能但保留了错误,我们保证在选择存在时我们将继续执行最新的实现。

次佳解决办法

我在SP.UI.RTE.js文件中看到了Microsoft仍未解决的错误。要在我看到这样的行为的环境中修复它,我将以下JavaScript添加到母版页:

    function fixRTEBug() {
    if (typeof RTE.Canvas.checkCurrentFocus !== 'undefined') {
        RTE.Canvas.checkCurrentFocus = function() {ULSkay:;
            var $v_0 = RTE.Selection.getSelectionRange();
            if ($v_0) { //this is different from SP to avoid error in console
                var $v_1 = $v_0.parentElement();
                if (RTE.Canvas.isInEditable($v_1) && !RTE.Cursor.get_range().isValid()) {
                    RTE.Cursor.updateRangeToCurrentSelection();
                    RTE.Cursor.update();
                }
            }
        }
    }

    // This Fix for parentElement bug in RTE should survive Service Packs and CU's
    function SubstituteRTERangeParentElement() {
        var originalRTERangeParentElement = RTE.Range.prototype.parentElement;
        RTE.Range.prototype.parentElement = function () {
            try {
                originalRTERangeParentElement();
            } catch (e) { }
        }
    }
    SubstituteRTERangeParentElement();
}

ExecuteOrDelayUntilScriptLoaded(fixRTEBug, "sp.ui.rte.js");

参考资料

本文由朵颐IT整理自网络, 文章地址: https://duoyit.com/article/2515.html,转载请务必附带本地址声明。