【问题标题】:Snap.load() callback function triggered too late in SafariSnap.load() 回调函数在 Safari 中触发得太晚
【发布时间】:2015-08-28 20:49:45
【问题描述】:

问题

在我的代码中 MySymbolsObject.js - 内联报告的代码仅用于示例目的 - 设置 window.onload 事件以便 Snap.load() 一个 svg 文件并将 svg 片段节点保存在 Symbols.resources

最后一个内联<script> 设置了第二个window.onload 事件,其中包含使用保存在Symbols.resources 中的svg 节点的代码

在 Firefox 中,它可以完美地在控制台中打印节点,而在 Safari 中,Symbols.resources 在控制台中打印为其原始值 0。

我检查了

  • 在 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>

【问题讨论】:

标签: javascript svg safari snap.svg


【解决方案1】:

我找到了一种方法来推迟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 );
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多