2015-06-12 2 views
0

ПРОБЛЕМАSnap.load() Функция обратного вызова срабатывает слишком поздно в Safari

В моем коде MySymbolsObject.js - код сообщается инлайн только для примера - установить window.onload событие для того, чтобы Snap.load() файл SVG и сохранить узел фрагмента ГСВ в Symbols.resources

последний инлайн <script> установлен второй window.onload событий, содержащий код, который использует узел SVG, сохраненный в Symbols.resources

В Firefox работает безупречная печать узла в консоли, в Safari Symbols.resources печатается как исходное значение 0 в консоли.

I ПРОВЕРЕНО

  • в консоли Safari, после того, как страница полностью загружает Symbols.resources содержит узел.

  • ожидаемый порядок выполнения двух onload events соблюдается в обоих браузерах.

Я думаю, что Snap.load() работает асинхронно, так он имеет непредсказуемое поведение в разных браузерах.

Как решить проблему в Safari?

<html> 
<head> 

    <script type="text/javascript" src="snap.svg-min.js"></script> 


    <script type="text/javascript" src="MySymbolsObject.js"> 

     setEvent(window, 'load', function(){ 
      Snap.load('pathToFile.svg', function(svgFrag){ 
       Symbols.resources = svgFrag; 
      }); 
     }); 

     Symbols = { 
      resources : 0, 
      ... 
     } 

    </script> 


    <script type="text/javascript"> 

     onload = function(){ 
      console.log(Symbols.resources) 
     } 

    </script> 

</head> 

<body> ... </body> 

</html> 
+1

Этот связанный с этим вопрос может помочь: [Что делает скрипт-Tag с СРК И содержанием в виду?] (Http://stackoverflow.com/questions/6528325/what-does-a-script-tag-with -src-and-content-mean) – Roberto

+0

Спасибо @Roberto, на самом деле второй скрипт-тег не имеет контента, я здесь просто показываю код _MySymbolsObject.js_ для примера. –

ответ

0

Я нашел способ, чтобы отложить выполнение window.onload кода до Symbols.resources готов.

Фактический код перемещается в function main(), window.onload просто проверяет повторно на Symbols.resources, чтобы быть готовым и, наконец, позвонить main().

onload = function(){ 
    if(Symbols.resources) main(); 
    else setTimeout(window.onload, 10000); 
} 

function main(){ 
    console.log(Symbols.resources); 
}