Safari не позволяет функции завершить работу перед выгрузкой страницы? - PullRequest
0 голосов
/ 15 сентября 2011
function log(name, value)
{
    mylog.push({'name':name, 'value':value});
}

function flush()
{   
    for (i = 0 ; i < mylog.length ; i++){
        url_str += '&n[]=' + mylog[i].name + '&v[]=' + mylog[i].value;
    }
    url_str += '&r='+Math.floor(Math.random() * 100000);

    var img = new Image();
    var url = 'http://somedomain.com/pixel.php?' + url_str;
    img.src = url;
}

if (window.attachEvent) 
    window.attachEvent('onunload', flush);
else if (window.addEventListener) 
    window.addEventListener('unload', flush, false);

Я работаю над кодом, который отслеживает взаимодействие пользователя с целью поиска горячих точек на странице.Большая часть этого уже сделана и работает в большинстве браузеров, но в настоящее время я нахожусь в тупике на Safari 5.0.5 / Mac 10.6 (кстати, его также можно скопировать с Safari 5.0.1 на Windows XP).Часть, которая доставляет мне трудности - это щелчки по ссылкам во время передачи страниц.Например, приведенный ниже код приводит меня к someotherpage.html:

<form onclick="log('LINK_CLICKED', 'some other page'); this.submit();" action="someotherpage.html">Some other page</form>

Сайт переводит меня к someotherpage.html во всех браузерах, но только Safari 5.0.5 / Mac 10.6 не показывает LINK_CLICKED вжурналы.После некоторой проверки консоли в инспекторе Safari я обнаружил, что в Safari произошла ошибка «не удалось загрузить ресурс».Я подозреваю, что это потому, что хотя URL можно было вызвать, браузер решил перейти на (?).

В любом случае, я пробовал событие beforeunload и использовал setTimeout, чтобы задержать выгрузку страницы.Я думаю об изменении формы HTML в целом, но это будет довольно трудоемко.Тем не менее, я открыт для этого, если у кого-то нет идей, которые пропустили мое внимание.Любые предложения о том, как это может работать в Safari 5.0.5 (Mac 10.6)?

1 Ответ

1 голос
/ 15 сентября 2011

Я думаю, что вы просто сталкиваетесь с состоянием гонки, которое может быть облегчено с помощью обратного вызова при нагрузке на пиксели прилипания.

function log(name, value, callback)
{
    mylog.push({'name':name, 'value':value, 'callback':callback});
}


function flush()
{   
    for (i = 0 ; i < mylog.length ; i++){
        url_str += '&n[]=' + mylog[i].name + '&v[]=' + mylog[i].value;
    }
    url_str += '&r='+Math.floor(Math.random() * 100000);

    var img = new Image();
    img.onload = logReady;
    var url = 'http://somedomain.com/pixel.php?' + url_str;
    img.src = url;
}

function logReady()
{
  for (i = 0 ; i < mylog.length ; i++){
       mylog[i].callback();
    }
}



<form onclick="log('LINK_CLICKED', 'some other page', function() { form.submit(); });" action="someotherpage.html">Some other page</form>
...