2017-08-21 50 views
1

下面是一个功能齐全的工作代码。当我复制粘贴到一个文本文件testFile.html,然后用浏览器打开它工作正常。如何执行js函数onload?

但我想selectCollege功能将initViz功能

后执行权我想这

<body onload="initViz();selectCollege('Engineering');"> . . .

但没有奏效。我怎样才能让selectCollege功能将initViz后执行的对不对?

<!DOCTYPE html> 
<html> 

<head> 
    <title>Select Marks</title> 

    <script type="text/javascript" 
     src="https://public.tableau.com/javascripts/api/tableau-2.min.js"></script> 

    <script type="text/javascript"> 
     var viz, sheet; 

     function initViz() { 
      var containerDiv = document.getElementById("vizContainer"), 
       url = "http://public.tableau.com/views/RegionalSampleWorkbook/College", 
       options = { 
        "Academic Year": "", 
        hideTabs: true, 
        onFirstInteractive: function() { 
         sheet = viz.getWorkbook().getActiveSheet(); 
        } 
       }; 

      viz = new tableau.Viz(containerDiv, url, options); 
     } 

     function selectCollege(college_name) { 
      sheet.selectMarksAsync("College", college_name, tableau.SelectionUpdateType.REPLACE); 
     } 

    </script> 
</head> 

<body onload="initViz();"> 
    <div id="vizContainer"></div> 
    <br />  
    <button onclick="selectCollege('Engineering');">Select a value</button> 

</body> 

</html> 
+3

'<体的onload = “initViz(); selectCollege( '工程');>' - >'<体的onload =” initViz(); selectCollege( '工程'); “>'(请注意丢失的'” '在这个例子中你给) –

+0

为什么只是不加'selectCollege(“工程”)'在initViz结束,如果你之前或DOM已使后要功能 – Frankusky

+0

要看。你可以在不初始化的情况下运行命令 –

回答

2

selectCollege()您尝试访问sheet它在回调函数从tableau.Vizoptions对象,即onFirstInteractive()定义之前。为了解决这个问题,你可以在函数定义sheet后调用该函数:

options = { 
    ... 
    onFirstInteractive: function() { 
    sheet = viz.getWorkbook().getActiveSheet(); 
    selectCollege('Engineering'); 
    } 
}; 

而且根据this forumonFirstInteractive()将被调用一次,当你的tableau.Viz实例首次呈现。

+1

非常感谢。这是唯一可行的答案 – john

3

创建一个新的功能

function init(){ 
    initViz(); 
    selectCollege('Engineering'); 
} 

然后调用init函数

window.onload = init; 
+0

这将使这些函数并行运行,而不是在第一个函数 – Frankusky

+0

之后运行,因为我只需要查看它,window.onload的效果与body的onload相同,但[有很好的理由更喜欢第一个](https://stackoverflow.com/a/191318/1270789)。 –

+0

@Frankusky该陈述是完全无效的。 JavaScript是单线程的,这实际上确实调用'initViz()',然后'selectCollege()'顺序地调用。 –

2

function initViz(college_name) { 
 
//your code 
 

 
      viz = new tableau.Viz(containerDiv, url, options); 
 
      
 
      //then 
 
      selectCollege('engineering'); 
 
     } 
 

 
     function selectCollege(college_name) { 
 
      sheet.selectMarksAsync("College", college_name, tableau.SelectionUpdateType.REPLACE); 
 
     }

使用方法如下

2

这个工程只是一个脚本标签内闭体之前,我

function bar() { 
 
    alert("bar"); 
 
} 
 
function foo() { 
 
    alert("foo"); 
 
}
<!DOCTYPE html> 
 
<html> 
 
<body onload="bar();foo();"> 
 

 
</body> 
 
</html>

0
... 
<body> 
... All other tags.. 
<script> 
//just before closing body 
function(){ 

}() 
</script> 
</body> 
.... 

调用你的函数。

HTML树依次解释。这就是我为SPA添加加载消息的方式。