Неопределенная ошибка DOM ParentNode в onmouseout - PullRequest
0 голосов
/ 21 июля 2011

Как это,

[ вот небольшая страница, иллюстрирующая мою проблему ] (проблема появляется в Firefox)

Итак, у меня есть функция onmouseout="regress(event, this)", которая проверяет, действительно ли мышь вышла за пределы текущего элемента и любого из его дочерних элементов. ( подробнее о том, почему я это сделал и в чем дело ). Если мышь действительно снаружи, я хочу остановить анимацию на кнопке и сбросить таймер (что я и сделал). И это работает.

Только это не так. В Firefox (протестированном v5.0) это так. Я получаю ошибку, связанную с DOM. parentNode элемента, который вызвал функцию, является "", и тогда его родителем будет "undefined", а затем я получаю ошибку, и код взрывается.

Вот загадочная часть: эта ошибка возникает, только когда мышь действительно выходит из области кнопок. Есть еще один случай, когда срабатывает событие onmouseout (во избежание которого я использую эту функцию). Который переходит от дочернего элемента кнопки к другому дочернему элементу кнопки. В этом случае parentNode работает нормально, переходя от buttonChild к button to buttonParent к blabla to BODY и затем останавливается.

Мой вопрос: почему неопределенная ошибка появляется в одном случае, а не в другом. Имейте в виду, что в Chrome или IE9 нет ошибок. И как мне это исправить?

Это сбивает меня с толку. Спасибо за любую помощь.

Я сбит с толку.

Также здесь есть функция javascript:

function regress(evt, x){
    //if (!e && window.event) 
    if (window.event) 
        var e = window.event;
    else
        var e = evt; //if we got here, you're using Firefox
    var reltg = (e.relatedTarget) ? e.relatedTarget : e.toElement;

    while (reltg.tagName != 'body')
    {   
        //alert(reltg.id+" == " + x.id);
        if (reltg.id == x.id)
        {

            return;
        }
        reltg = reltg.parentNode;
        //alert(reltg.tagName);
    }
    // I'm on true mouseout, do stuff here:
    $("#"+x.id+"ThickParent").stop(true, false);
    $("#"+x.id+"ThickParent").width(0);

    canStartAgain=true;

    stopInterval = true;
    timerValue = 1.50;
    $("#"+x.id+"Timer").html("");
    //thanks to: http://www.webmasterworld.com/javascript/3752159.htm
}

Раскомментируйте //alert(reltg.id+" == " + x.id);, чтобы точно узнать, когда сработал onmouseout и какой элемент reltg.parentNode включен и в какое время.

1 Ответ

2 голосов
/ 21 июля 2011

Я получил эту же проблему несколько месяцев назад.Вы заметите, что при выходе с верхней стороны ошибки не происходит.По какой-то причине тег "body" сужается, чтобы соответствовать внутреннему элементу div, и расширяется до верха, а при переходе к нижнему (или левому, или правому) FF запускает событие со связанной целью, указывающей на тег "html", и вВ вашем цикле условие остановки - это тег "body".Родителем тега «html» является документ, а родительским документом является null, и возникает ошибка, когда вы пытаетесь получить доступ к свойству tagName null.Для достижения ожидаемого результата вы должны изменить условие останова на while (reltg.tagName != 'html') или даже на самое устойчивое к ошибкам значение, как while (reltg && (reltg.tagName != 'body')).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...