1

我正在嘗試關注不引人注意的JavaScript /優雅降級技術。我想在打開JavaScript和關閉JavaScript時使用不同鏈接提供頁面。如果啓用JavaScript,如何在網頁上生成不同的鏈接?

例如當JavaScript是關閉狀態的鏈接將是

<a href="script.cgi?a=action"> 

並且當開啓JavaScript

<a href="script.cgi?a=action;js=1"> 

(或類似的東西)。

鏈接的兩個版本(使用JavaScript且不使用JavaScript)都會導致服務器端腳本,但具有不同的參數。在關閉JavaScript時要調用的版本在服務器上執行更多操作,因此在那裏檢測JavaScript(例如,通過window.location從非JavaScript的服務器腳本重定向到其他版本)將是徒勞的。

注:我更喜歡解決方案,而不使用像jQuery這樣的JavaScript庫/框架。

+1

我不喜歡假設行動查詢字符串參數將始終存在的脆弱。爲什麼不是一個單獨的參數,例如,js = 1? – RedFilter 2009-07-22 21:33:13

+0

第一個示例中的查詢字符串具有值爲「action」的「a」參數,該部分示例具有相同的內容,但添加了值爲「1」的「js」參數。 (請注意;和&在所有好的查詢字符串處理庫中都是可以互換的)。 – Quentin 2009-07-22 21:56:51

+0

如果你遵循正常的降級,那麼你不應該試圖通知服務器JS可用或不可用。它應該在頁面內部處理,服務器不需要關心。 http://icant.co.uk/articles/pragmatic-progressive-enhancement/是一個很好的指南。 – Quentin 2009-07-22 21:58:16

回答

6

那麼,答案是來渲染頁面正常與非Javascript鏈接。然後獲取Javascript以替換JS = 1版本的鏈接。

var links = document.getElementsByTagName('a'); 
for (var i=0;i<links.length;i++) { 
    links[i].href += ";js=1"; 
} 
1

從非Javascript啓用鏈接開始,然後只需使用一些Javascript代碼修改鏈接到其啓用Javascript的值即可。這確保鏈接始終是正確的版本。例如:

<a id="link_to_change" href="script.cgi?a=action"> 

<script type="text/javascript"> 
    window.onload = function(){ 
     document.getElementById("link_to_change").href += ";js=1"; 
    } 
</script> 
0

如果你只是在做一個鏈接,這已經足夠了:

<a href="script.cgi?a=action" onclick="this.href += ';js=1';"> 
1

一個簡單的解決方案,智能地處理沒有現有查詢字符串的鏈接。

// Get array of all links 
var links = document.getElementsByTagName('a'); 

for (var i=0; i<links.length; i++){ 
    // Add a question mark if link does not already have a querystring. 
    links[i].href += (/\?/.test(links[i].href)) ? '' : '?'; 
    links[i].href += ';js=1'; 
} 
0

在我的網站上,我開發了一個完全非JavaScript版本的網站。我在Django中開發並將頁面的數據傳遞給Django模板變量。我在一個標籤中呈現一個頁面,然後我JSON化這些變量並呈現javascript。

例如,下面是我的網站上一個MapView Django模板:

{% extends "new-base.html" %} {% load markup %} {% load tb_tags %} 

{% block headcontent %} 
    <script type="text/javascript"> 
    var mapData = {{map|jsonify}}; 
    </script> 
{% endblock %} 


{% block content %} 
    {% include "noscript/mapview.html" %} 
{% endblock %} 

及這裏的被使用在無腳本的模板。這是什麼人沒有JS和搜索引擎使用:

{% load tb_tags %} 
<noscript> 
    <link rel="stylesheet" type="text/css" href="/site_media/css/no-js.css"> 
    <style type="text/css"> div.content { padding:10px } </style> 
    <div class=JSWhite> 
    <h1 class=noJS> 
     {% ifequal map.target.id map.places.0.node.id %} 
     <a href="{{map.places.0.pages.0.url}}">{{map.target.name}}</a></h1> 
     {% else %} 
     <a href="{{map.target.url}}">{{map.target.name}}</a></h1> 
     {% endifequal %} 
    {% ifequal map.target.type 'node' %} 
     &nbsp;- {{map.target.ele}} meters <BR> 
    {% endifequal %} 
    <span style ='color:gray; font-size:.8em; font-style:italic'> 
     ({{map.target.la}},{{map.target.lo}})&nbsp; 
    </span> 
    <a class=JSAd target=_blank href=http://www.mytopo.com/searchgeo.cfm?lat={{map.target.la}}&lon={{map.target.lo}}&pid=trailbehind>Buy Topo Map</a> &nbsp;-&nbsp; 
    <a style='font-size:.8em;color:#CC5500' target=_blank href='http://maps.google.com/maps?f=q&source=s_q&hl=en&geocode=&q={{map.target.name}}'>Get Directions</a> 
    {% if map.target.dist %} 
     <BR>{{map.target.dist}} 
    {% endif %} 
    {% if map.target.ascent %} 
     <BR>{{map.target.ascent}} 
    {% endif %} 

    {% for r in map.places %} 
     {% ifequal r.node.id map.target.id %} 
     <BR> 
     {% if r.pages.0 %} 
      {{r.pages.0.summary}} 
     {% endif %} 
     <UL style='list-style:none;margin-left:0; padding-left:0'> 
      {% for key in r.pages %} 
      {% ifnotequal forloop.counter 1 %} 
       <LI><a href={{key.url}}>{{key.title}}</a><BR> 
        {{key.snippet}} 
       </LI> 
      {% endifnotequal %} 
      {% endfor %} 
     </UL> 
    {% endifequal %} 
    {% endfor %} 
    <HR> 
    <strong>(<a href="{{map.target.url}}">All</a> - 
    <a href="{{map.target.url}}hiking/">Hiking</a> - 
    <a href="{{map.target.url}}camping/">Camping</a> - 
    <a href="{{map.target.url}}climbing/">Climbing</a> - 
    <a href="{{map.target.url}}biking/">Biking</a>)</strong><BR> 
    <p> 
    {% if map.places %} 
    <h1>Nearby Adventures</h1> 
    <UL style='list-style:none;margin:0; margin-top:10px;padding-left:0'> 
     {% for r in map.places %} 
     {% ifnotequal r.node.id map.target.id %} 
      <LI><h1> 
     {% if r.node.trip_id %} 
     <a href="{{r.node.url}}">{{r.pages.0.title}}</a></h1> 
     {% else %} 
     <a href="{{r.node.url}}{{activity}}">{{r.pages.0.title}}</a></h1> 
      {% endif %} 
     {% if r.pages.0 %} 
      {% if r.pages.0.activity %} 
      <strong>{{r.pages.0.activity}}</strong> - 
      {% endif %} 
      {{r.pages.0.snippet}} 
    {% endif %} 
    {% endifnotequal %} 
    {% endfor %} 
    {% endif %} 
    </UL> 
    </p> 
    </div> 
</noscript> 
相關問題