在一个单独的文件中覆盖prototype.js中的getOffsetParent()函数

时间:2014-05-28 20:29:09

标签: javascript internet-explorer-8 prototypejs mixins

我正在尝试将一个补丁应用于prototype.js来修复IE8到IE10的布局问题。我需要在单独的文件中应用此补丁,因为prototype.js是我们的cms中的核心文件之一。我尝试了很多方法,但我尝试的所有补丁都被忽略了,原始文件中的功能仍在使用中。下面是我可以使它工作的最接近的代码。下面的函数正在执行而不是原始函数,但是,其中的函数不起作用导致脚本无法工作。有什么建议?我试图将https://github.com/sstephenson/prototype/issues/156中的补丁应用到单独的文件中。我的文件prototype-patch.js在prototype.js之后加载。

Element.getOffsetParent = Element.getOffsetParent.wrap(function (element) {
element = $(element);
alert(element);
if (isDocument(element) || isDetached(element) || isBody(element) || isHtml(element))
    return $(document.body);
alert('test2');
var isInline = (Element.getStyle(element, 'display') === 'inline');
if (!isInline && element.offsetParent && Element.visible(element)) return $(element.offsetParent);
while ((element = element.parentNode) && element !== document.body) {
    if (Element.getStyle(element, 'position') !== 'static') {
        return isHtml(element) ? $(document.body) : $(element);
    }
}
return $(document.body);
});

Element.addMethods({
    getOffsetParent: Element.getOffsetParent
});

2 个答案:

答案 0 :(得分:0)

尝试以这种方式覆盖方法

var getOffsetParent = function (element) {
    element = $(element);
    if (isDocument(element) || isDetached(element) || isBody(element) || isHtml(element))
        return $(document.body);
    var isInline = (Element.getStyle(element, 'display') === 'inline');
    if (!isInline && element.offsetParent && Element.visible(element)) return  

    $(element.offsetParent);
    while ((element = element.parentNode) && element !== document.body) {
        if (Element.getStyle(element, 'position') !== 'static') {
            return isHtml(element) ? $(document.body) : $(element);
        }
    }
    return $(document.body);
};

Element.addMethods({
    getOffsetParent: getOffsetParent
});

答案 1 :(得分:0)

Geek Num的回答让我朝着正确的方向前进。我必须添加4个功能才能使其正常工作。

function isBody(element) {
    return element.nodeName.toUpperCase() === 'BODY';
}

function isHtml(element) {
    return element.nodeName.toUpperCase() === 'HTML';
}

function isDocument(element) {
    return element.nodeType === Node.DOCUMENT_NODE;
}

function isDetached(element) {
    return element !== document.body && !Element.descendantOf(element, document.body);
}

var getOffsetParent = function (element) {
element = $(element);
if (isDocument(element) || isDetached(element) || isBody(element) || isHtml(element))
    return $(document.body);
var isInline = (Element.getStyle(element, 'display') === 'inline');
if (!isInline && element.offsetParent && Element.visible(element)) return $(element.offsetParent);
while ((element = element.parentNode) && element !== document.body) {
    if (Element.getStyle(element, 'position') !== 'static') {
        return isHtml(element) ? $(document.body) : $(element);
    }
}
return $(document.body);
};

Element.addMethods({
    getOffsetParent: getOffsetParent
});