2015-06-23 49 views
4

我有一個具有單獨的標籤負載JS時可見

<div id="maintabs"> 
    <ul id='mainTabNav'> 
     <li><a href="#maintabs-1">Tab 1</a></li> 
     <li><a href="#maintabs-2">Tab 2</a></li> 
    </ul> 
    <div id="maintabs-1"> 
     <p><?php require_once VIEW_DIR."somewhere/tab1.phtml"; ?></p> 
    </div> 
    <div id="maintabs-2"> 
     <p><?php require_once VIEW_DIR."somewhere/tab2.phtml"; ?></p> 
    </div> 
</div> 

每個標籤一個PHTML頁/頁具有一個js源特定於這樣

<script src="js/tab<num>.js"></script> 

在頁的頁標頭加載雖然每個JavaScript文件正在加載。有沒有辦法只加載當前打開的標籤的js?當一個新的選項卡打開,然後js重新加載只有當前選項卡的js?

+0

如果您點擊後在標籤中加載內容(ajax)會怎麼樣?並在此內容將'加載相應的行。 – sitilge

+0

我的印象是,加載的腳本仍然存在,它們的功能。說tab1.js有一個函數foo(),tab2.js有一個函數foo()。如果我在選項卡2上,tab1.js中的第一個foo會在第一次加載後首先被調用嗎?我想刪除以前加載的js,所以調用foo()只會到達tab2.js foo函數 – depperm

3

您可以使用類似jQuery.getScript()這樣的動態加載適當的JavaScript的每個主選項卡上保持單擊事件。

$('div[id^="#maintabs"]').click(function(e){ 
    var tabno = $(this).index(); 
    $.getScript("js/tab"+tabno); 
}); 

我想這個問題的陷阱是,你似乎想要所有以前的JavaScript被洗掉,一旦最新的JS文件被加載。我不確定這是否可行,或者您是否有副作用。

此外,這可以完全用香草JS完成,但很好,節省時間。

2

你就不能把這樣的:到你的地方/標籤*一個.phtml

<script src="js/tab<num>.js"></script> 

+0

每個頁面都有這個問題,正如問題中提到的那樣,但他們正在從主頁面上立即加載。我只想加載它們,當一個標籤是可見的 – depperm

1

使用純JavaScript中使用的頁面數,我相信這是可能的,如果你使用的加載頁面AJAX。

本教程http://code.tutsplus.com/tutorials/how-to-load-in-and-animate-content-with-jquery--net-26演示了將主頁(我稱之爲索引頁)加載到另一個頁面(我稱之爲子頁面)的方法。據我所知,如果您在子頁面中包含關聯的腳本標記而不是索引頁面,那麼它們是動態的,因爲它們在子頁面加載時加載,並在子頁面卸載時卸載。

我之前在我自己的項目中使用了本教程的修改版本,我沒有像教程中顯示的那樣創建與索引頁面具有相同內容的子頁面,而是僅使用整個子html文件僅針對子頁面的內容。

這裏是基於把你的代碼的例子:

indexScript.js:

/* When index.html is loaded and ready */ 
$(document).ready(function() { 

    /* Handels on-click of menu buttons */ 
    $('#mainTabNav a').click(function(){ 

     /* Getting the linked page */ 
     var toLoad = $(this).attr('href'); 

     /* Hiding content and calling loadContent function - creates animation*/ 
     $('#contentDiv').hide('slow', loadContent); 

     /* Injects content to contentDiv div tag */ 
     function loadContent(){ 
      $('#contentDiv').load(toLoad, '', showNewContent); 
     } 

     /* Shows contentDiv div */ 
     function showNewContent() { 
      $('#contentDiv').show('normal'); 
     } 

     demonstratePageChange(); //For testing - you can remove this 

     /* In order to stop the browser actually navigating to the page */ 
     return false; 

    }); 

    /* Initial Load - load first child page by simulation of clicking on it*/ 
    $('#maintabs_1').click(); 

}); 

/* To demonstrate the respective JS script is loaded as needed */ 
function demonstratePageChange() { 
    setTimeout(function(){ 
     alert(testMsg); //Alerts the message from resepctive child page script 
    }, 3000); 
} 

的index.html:

<!DOCTYPE html> 
<html> 

<head></head> 

<body> 

    <div id='maintabs'> 
     <ul id='mainTabNav'> 
      <a id='maintabs_1' href='childA.html'><li>Tab 1</li></a> 
      <a id='maintabs_2' href='childB.html'><li>Tab 2</li></a> 
     </ul> 
    </div> 

    <div id='contentWrapper'> 
     <div id='contentDiv'></div> 
    </div> 

</body> 

<script type='text/javascript' src='jquery-2.1.1.min.js'></script> 
<script type='text/javascript' src='indexScript.js'></script> 

</html> 

childA。HTML:

<div id='maintabs-1' class='contentBody'> 
    <script type='text/javascript' src='childAScript.js'></script> 
    Child A - Page 
</div> 

childAScript.js:

console.log("childAScript has been loaded"); 
var testMsg = "This is Child A"; 

childB.html:

<div id='maintabs-2' class='contentBody'> 
    <script type='text/javascript' src='childBScript.js'></script> 
    Child B - Page 
</div> 

childBScript.js:

console.log("childBScript has been loaded"); 
var testMsg = "This is Child B!!!!"; 

然而,有幾件事情要考慮使用這種方法:

  1. 這種特殊的方法需要的jQuery
  2. 此方法不支持重載,你不得不代碼在IE中,如果你在選項卡,你需要的。存儲該事實並刷新,返回標籤2.
  3. 本地測試 - 據我所知,只有FF在本地測試時支持此功能。例如,如果您想在Chrome上測試此功能,則需要將其上傳到服務器上,然後才能正常工作。這是由於「XMLHttpRequest無法加載」錯誤,如果您在本地嘗試此操作。

我希望這可以幫助和解決您的問題。

+0

注意:包含在index.html中的任何JS文件都是全局的,即所有的子頁面都可以訪問它。 – Johnbastian

0

使用AMD requirejs也可以做到這一點。雖然我更喜歡AMD模塊,但可以使用純js [即定義()]。對於我的應用程序,取決於用戶的操作,代碼會即時下載,從而減輕負載。一個onclick事件在調用requirejs的選項卡控件上觸發,腳本被下載並調用它。 Psuedo示例:

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

$(document).ready(function() { 
//Assuming using jQuery, use document.getElementById and what not otherwise 

$('#maintabs-1').click(function(e) { 
    require(['/js/tabnum1.js'], function (tab1) { 
     tab1(doStuff); 
    }); 
}); 

} 

對多個選項卡使用for循環。另外,我嘗試將盡可能多的處理(無數據存儲和服務器驗證(顯然)]放入客戶端。