繁体   English   中英

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

[英]Overriding getOffsetParent() function in prototype.js in a separate file

我正在尝试对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
});

尝试以这种方式覆盖方法

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
});

极客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
});

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM