我有幾個SSI在我的站點內的許多頁面上重複 - 特別是我的導航樹,它允許用戶展開或摺疊樹中的節點。防止刷新SSI
我想避免加載相同的.shtml文件,如果它已經加載到上一頁 - 這種方式當用戶點擊我的導航樹中的一個條目,整個樹不刷新到目標頁面(這導致用戶的當前節點被摺疊)。關於如何讓這種情況發生的任何想法?
我有幾個SSI在我的站點內的許多頁面上重複 - 特別是我的導航樹,它允許用戶展開或摺疊樹中的節點。防止刷新SSI
我想避免加載相同的.shtml文件,如果它已經加載到上一頁 - 這種方式當用戶點擊我的導航樹中的一個條目,整個樹不刷新到目標頁面(這導致用戶的當前節點被摺疊)。關於如何讓這種情況發生的任何想法?
一種方法是將導航樹放在一個單獨的框架(而不是一個iframe)中,這會帶來它自己的問題;由於包含在服務器端發生,因此包含內容中導致頁面刷新的任何內容都將刷新整個頁面,而不考慮通過SSI包含的內容以及不包含的內容。將樹放入其自己的框架中,並將其鏈接修改爲指向內容框架,這樣您就不會遇到這個問題 - 當然,使用框架來解決此問題只會給您帶來另一個問題。
稍微好一點的選擇是使用cookie和Javascript來記錄樹的哪些節點被擴展。您可以將點擊處理程序綁定到每個節點擴展器/收縮器,以更新表示樹狀態的Javascript對象,並且在每個單擊事件中,將該對象平鋪爲字符串並通過document.cookie存儲它。這樣,您可以將樹狀態持久保存到下一頁加載中,其中onload處理程序可以展開cookie中列出的節點,以將樹返回到單擊頁面重新加載鏈接時的狀態。
假設存在jQuery,或者具有本機JSON支持的瀏覽器或加載了相同的庫,您的節點擴展器/收縮器控件實現爲<a>帶有「節點控制」類的標記, ,對擴展節點的控制具有「擴展」類(大概由預先存在的點擊處理程序給出),並且每個控件都具有唯一標識其在樹中的位置的id屬性。
// begin "persistent-node-state.js"
window.nodesExpanded = {};
// do the following on document load completion:
jQuery(document).ready(function() {
// check for a nodesExpanded value in the cookie
var cookieMatch = document.cookie.match(/nodesExpanded=(.*?)\;/);
if (cookieMatch) { // no nodesExpanded cookie found -- do nothing
// we found a nodesExpanded cookie; let's unserialize its value into
// window.nodesExpanded
window.nodesExpanded = JSON.parse(cookieMatch[1]);
};
// iterate through the nodesExpanded object's keys, which are IDs of controls whose
// nodes we want to expand (if we didn't find a cookie, then window.nodesExpanded
// is an empty object, making this loop a very complicated no-op)
for (node_id in nodesExpanded) {
// call the pre-existing click handler to expand the node
jQuery('a.node_control#' + node_id).click();
};
// now that that's done, give each node control an additional click handler which
// puts its state into window.nodesExpanded and updates the cookie
jQuery('a.node-control').click(function(i,el) {
var node_id = jQuery(el).attr('id');
// if this control's node is expanded...
if (jQuery(el).hasClass('expanded')) {
// ...then add the control's id as a key in window.nodesExpanded...
window.nodesExpanded[node_id] = true;
}
else {
// ...otherwise remove any existing key in window.nodesExpanded with this
// node's ID
window.nodesExpanded[node_id] = undefined;
};
// store the updated state in the cookie so it'll persist across page loads
document.cookie('nodesExpanded=' + JSON.stringify(window.nodesExpanded));
});
});
// end "persistent-node-state.js"
當然,所有這一切都可以在不jQuery的做,但它並不需要花很多錢加載庫 - 您甚至不必下載它,但可以load it from Google's CDN - 它使所有與Javascript相關的事情都變得更加容易,除非你需要支持非常古老的(例如IE6之前的)瀏覽器,或者具有一般性質的東西,否則沒有很好的理由不這樣做。
類似地,所有各種線索(即如何識別節點展開/收縮控制,如何判斷它是否展開,如何觸發導致節點展開或收縮的事件,& c)。根據需要修改;在沒有網站鏈接或一些示例代碼的情況下,很難定製一個適合您情況的示例,所以我儘可能地通用了一些東西,同時仍然展示了基本想法,並且不應該太難編輯以品嚐。
服務器端包括就是服務器端。如果您在多個頁面中包含相同的包含文件,則每次都會包含它。 Apache(或IIS)將會看到這一點。另一方面,如果在構建單個「頁面」時多個包含文件中包含相同的文件,則可以在包含的文件中設置變量,並在文件包含的每個位置對其進行測試。我用一個配置文件來爲我的網站設置全局變量。
我想這樣的事情將不得不發生。我想我也可以使用sessionStorage在導航樹中存儲用戶的當前節點。 – billypilgrim
當然,但是當你不需要的時候爲什麼會產生HTML5依賴?我的意思是,你使用的是SSI,你已經牢牢紮根於過去 –