2017-08-21 52 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添加加載消息的方式。