JavaScript'in devre dışı olup olmadığını nasıl tespit edebilirim?


659

Bu sabah kaç kişinin JavaScript'i devre dışı bıraktığını soran bir yazı vardı. Sonra kullanıcının devre dışı olup olmadığını belirlemek için hangi tekniklerin kullanılabileceğini merak etmeye başladım.

JavaScript devre dışı olup olmadığını tespit etmenin bazı kısa / basit yollarını bilen var mı? Niyetim, tarayıcı JS etkin olmadan sitenin düzgün çalışamadığına dair bir uyarı vermektir.

Sonunda onları JS olmadığında çalışabilecek içeriğe yönlendirmek istiyorum, ancak başlamak için bir yer tutucu olarak bu algılamaya ihtiyacım var.


Bu bilgilerle ne yapmak istiyorsunuz? Aldığınız yanıtı değiştirebilir - örneğin, aşamalı geliştirme genellikle JavaScript'in devre dışı bırakıldığını algılamaya çalışmak ve buna göre belirli bir işlem yapmaktan yana olmalıdır.
Jonny Buchanan

aşamalı geliştirme aradığım şey. Bir JS etkin veya yetenekli tarayıcı yokluğunda düzgün çalışacak alternatif içerik onları yönlendirmek istiyorum ot istiyorum.
MikeJ

1
@expiredninja Nicholas Zakas'ın bu yazısı bir yıldan daha eski olmasına rağmen yaklaşık% 2 diyor.
sdleihssirhc

En kolay yol, javascript olmayan siteyi göstermek için noscript kullanmak ve stil görüntüsünü değiştirerek javascript bağımlı öğelerini göstermek için javascript kullanmaktır.
Myforwik

Yanıtlar:


286

JavaScript ile zenginleştirilmiş içerik yayınlayıp yayınlamayacağınıza karar vermeye çalıştığınızı varsayıyorum. En iyi uygulamalar temiz bir şekilde bozulur, böylece site hala JavaScript olmadan çalışır. Ayrıca , öğeyi açıklanamayan bir nedenle kullanmak yerine sunucu tarafı algılamayı kastettiğinizi de varsayıyorum <noscript>.

Sunucu tarafı JavaScript algılaması yapmanın iyi bir yolu yoktur. Alternatif olarak, JavaScript kullanarak bir çerez ayarlamak ve ardından sonraki sayfa görüntülemelerinde sunucu tarafı komut dosyası kullanarak bu çerez için test yapmak mümkündür. Ancak bu, hangi içeriğin yayınlanacağına karar vermek için uygun olmayacaktır, çünkü çerez olmadan ziyaretçileri yeni ziyaretçilerden veya çerezleri engelleyen ziyaretçilerden ayırt edemez.


129
<noscript> Javascript olmayan içeriği belirtmek için en anlamsal olarak doğru yöntemdir - daha sonra javascript'in devre dışı olup olmadığını tespit etmek, etkin olup olmadığını tespit etmek. Bu nedenle, varsayılan olarak "sitemi doğru şekilde kullanmak için javascript'e ihtiyacınız var" mesajını gösterin, ancak hemen onLoad üzerinde bir javascript işleviyle gizleyin.
matt lohkamp

58
@matt lohkamp: Ya da mesajı varsayılan olarak gizleyin ve gösterilmesi için içine bir <style>blok koyun <noscript>(JS etkinse yeniden akış yok). Şaşırtıcı bir şekilde, bu tüm modern tarayıcılarda ve hatta
IE6'da çalışıyor

7
@matt - Bunu bir süredir yapıyordum, ancak mesaj yavaş bağlantılarda bir süre kalıyor, kullanıcıların kafası karışıyor. Burada farklı bir çözüm arıyorum. @Piskvor - üstbilgideki <noscript> etiketi doğrulanmaz ve gövdedeki bir <style> etiketi doğrulanmaz.
Ben

20
... ancak neden doğrulama ile ilgileniyorsunuz? Sadece doğrulamak için mi onaylıyorsunuz? "Doğru" olmayabilir ama eğer çalışır ve "kaputun altında küçük bir kir ile" başarırsa sorun nedir? Endişelenme, yargılamayacağım ;-)
keif

4
<noscript> etiketleri içinde verilen öğelere stil niteliğini (<noscript> <div style = "color: red;"> blahblah </div> </noscript> veya sg. Benzeri) kullanırsanız geçerli kalır. . ANCAK <style> BLOCK öğesini normalde bazı .noscript (veya benzeri) sınıflı öğelerin stilini tanımlayan başlığa koyarsanız ve gövde içinde, <noscript> etiketleri içinde, verilen öğelere yalnızca Önceden tanımlanmış .noscript sınıfı, şöyle: <noscript> <div class = "noscript"> blahblah </div> </noscript>
Sk8erPeter

360

.02 kodumu buraya eklemek istiyorum. % 100 kurşun geçirmez değil, ama bence yeterince iyi.

Sorun, benim için, "bu site Javascript olmadan çok iyi çalışmıyor" mesajı bir tür koyarak tercih edilen örnek ile daha sonra sitenizin Javascript olmadan iyi çalıştığından emin olmak zorunda olmasıdır. Ve bu yola başladıktan sonra, sitenin JS kapalıyken kurşun geçirmez olması gerektiğini anlamaya başlıyorsunuz ve bu ek işin büyük bir parçası.

Yani, gerçekten istediğiniz şey, "JS'yi açın, saçma" yazan bir sayfaya "yeniden yönlendirme" dir. Ancak, elbette, meta yönlendirmeleri güvenilir bir şekilde yapamazsınız. İşte öneri:

<noscript>
    <style type="text/css">
        .pagecontainer {display:none;}
    </style>
    <div class="noscriptmsg">
    You don't have javascript enabled.  Good luck with that.
    </div>
</noscript>

... sitenizdeki tüm içerik "pagecontainer" sınıfının bir bölümü ile sarılır. Daha sonra noscript etiketinin içindeki CSS, tüm sayfa içeriğinizi gizler ve bunun yerine göstermek istediğiniz "JS yok" iletisini görüntüler. Aslında Gmail'in yaptığı şey budur ... ve Google için yeterince iyiyse, küçük sitem için yeterince iyidir.


12
@steve google.com'u doğrulamaya çalıştınız mı? doğrulama sadece belgenin teknik özellik sayfasını ne kadar yakından takip ettiğini belirler, hiçbir şekilde sayfanın kullanılabilirliğini etkilemez.
JKirchartz

71
@JonasGeiregat Web uygulamanız oluşturulduysa ve gerekiyorsa - Javascript'i çalışması için kullanıcıyı Javascript gerektirmeye zorlamanın nesi yanlış? Bu yorumu çok sık duyuyorum, ancak sadece en basit siteler için geçerli. JS olmadan Facebook'u deneyin ve ne olduğunu görün. Uygulamanız Javascript İÇİN oluşturulduysa, kullanıcıların% 99'unun yine de etkinleştirmesini istemenin nesi yanlış?
Lee Benson

19
@ Lee çivi üzerine vurur, sadece destekleyeceğiniz şey üzerine çizgi çizmeden önce kullanıcı için çok şey yapabilirsiniz. Tüm kullanıcıların İnternet özellikli bir cihaza sahip olmasını bekleriz, ayrıca internete erişmeyi reddedenler için sitemin basılı bir sürümünü de uygulamalıyım?
Kolors

14
@Kolors, bu yorumu Mart 2012'de tekrarladım ve bugün bunun iki kat doğru olduğunu iddia ediyorum. O zamandan beri Meteor, Angular.Js, Famo.us ve başlaması için Javascript gerektiren bir sürü muhteşem kütüphanemiz var . JS'yi devre dışı bırakmayı seçen kullanıcıların aslında neyi başarmaya çalıştıklarını merak ediyorum ... açıkça, geri kalanımızla aynı web'de sörf yapmıyorlar ve bir şirketin web sitelerini en küçük boyutta ölçeklendirmesi gerekmiyor. inatçı kullanıcıların alt seti ...
Lee Benson

6
Evet, ve JS'mi etkinleştirmeyi unuttuğum için neden cevabınızı oylayamadığımı merak ettim :-)) Çözümünüzü beğendim ve uyguladım! Teşekkürler!
Garavani

198

noscript blokları JavaScript devre dışı bırakıldığında yürütülür ve genellikle JavaScript'te oluşturduğunuz alternatif içeriği görüntülemek için kullanılır; ör.

<script type="javascript">
    ... construction of ajaxy-link,  setting of "js-enabled" cookie flag, etc..
</script>
<noscript>
    <a href="next_page.php?nojs=1">Next Page</a>
</noscript>

Js içermeyen kullanıcılar next_pagebağlantıyı alacaktır - bir sonraki sayfada bir JS / JS olmayan bağlantı aracılığıyla gelip gelmediklerini öğrenmek için JS ekleyebilir veya yokluğu JS anlamına gelen bir çerez ayarlamaya çalışabilirsiniz. devre dışı. Bu örneklerin her ikisi de oldukça önemsizdir ve manipülasyona açıktır, ancak fikri anlarsınız.

Kaç kullanıcınızın javascript'i devre dışı bıraktığına dair tamamen istatistiksel bir fikir edinmek istiyorsanız, şöyle bir şey yapabilirsiniz:

<noscript>
    <img src="no_js.gif" alt="Javascript not enabled" />
</noscript>

bu görüntünün kaç kez görüntülendiğini görmek için erişim günlüklerinizi kontrol edin. Biraz kaba bir çözüm, ancak kullanıcı tabanınız için yüzde olarak iyi bir fikir verecektir.

Yukarıdaki yaklaşım (görüntü izleme) yalnızca metin içeren tarayıcılar veya js'yi desteklemeyen tarayıcılar için iyi çalışmaz, bu nedenle kullanıcı tabanınız öncelikle bu alana doğru sallanırsa, bu en iyi yaklaşım olmayabilir.


7
Bu çok etkili değil. Örneğin, normalde JavaScript desteği olmayan salt metin tarayıcılara sahip olanları saymaz. En azından, bu resim için önbelleğe almayı devre dışı bırakmalısınız.
Jim

3
JS'yi hiç desteklemeyen tarayıcılar, noscript etiketini görmezden gelip resmi göstermez mi?
LKM

1
@LKM: Nasıl yazıldıklarına bağlı, büyük olasılıkla yazıyorlar, bu yüzden onu 1x1 piksel nokta yaparsınız. Bu seçenek esas olarak sunucu tarafındaki kullanım kalıplarını izlemek içindir, bu yüzden javascript yeteneği olmayan bir kullanıcı tarafından tetiklendiği için hala iyi olur.
ConroyP

Şu anda IE8 ve noscript etiketi ile stil uygularsanız bir hata olduğunu unutmayın ... bkz. Positioniseverything.net/explorer.html
alex

2
ayrıca bu görüntüyü sunucu tarafı komut dosyası olarak sunabilir, mime türünü ayarlayabilir ve bunu kullanıcı hakkında bazı bilgileri günlüğe kaydetmek
JKirchartz

46

Bu benim için işe yaradı: javascript devre dışı bırakılmışsa bir ziyaretçiyi yönlendirir

<noscript><meta http-equiv="refresh" content="0; url=whatyouwant.html" /></noscript>

6
Bu geçersiz. noscript öğeleri meta öğeler içeremez. Hata tarayıcılarını farklı şekillerde gerçekleştirebileceğinden, tüm tarayıcılarda (şu anda test edemediğiniz gelecekteki tarayıcılar dahil) güvenilir bir şekilde çalışmasına güvenmem.
Quentin

15
Bu geçersiz olabilir, ancak Facebook'un koduna bakın, <head> bölümünde aynı çözümü kullanır - bu çok iyi bir çözüm olduğu anlamına gelmez, çünkü Facebook'un kodu geçerli bir koddan çok uzaktır, ancak bu önemli bir yönü olabilecek birçok kullanıcının tarayıcısında çalışır. Ama gerçekten önerilmediği doğru. Bu onların kodu: <noscript> <meta http-equiv = yenileme içeriği = "0; URL = / about / messages /? _ Fb_noscript = 1" /> </noscript>
Sk8erPeter

IE9 (en azından) "META REFRESH'e izin ver" ayarına sahiptir. Ben onu kapatmak pek görünmüyor, ama muhtemelen javascript sevmiyorum olanlar, ama% 100 istiyorsanız, bu değil.
jenson-button-event

HTML5'te geçerlidir.
Naszta

1
Bu, Linkedin'de paylaşmaya çalışırken bağlantıyı yok ediyor, zor yolu bulduk ... bu iyi bir fikir değil.
Linkedin

44

Kullanım durumunuz bir formunuz varsa (örneğin, bir giriş formu) ve sunucu tarafı komut dosyanızda kullanıcının JavaScript'in etkin olup olmadığını bilmesi gerekiyorsa, şöyle bir şey yapabilirsiniz:

<form onsubmit="this.js_enabled.value=1;return true;">
    <input type="hidden" name="js_enabled" value="0">
    <input type="submit" value="go">
</form>

Bu, formu göndermeden önce js_enabled değerini 1 olarak değiştirir. Sunucu tarafı komut dosyanız 0 alırsa JS olmaz. 1 alırsa, JS!


44

Göze batmayan JavaScript yazarak başka bir yoldan gitmenizi öneririm.

JavaScript devre dışı bırakılmış kullanıcılar için projenizin özelliklerinin çalışmasını sağlayın ve işiniz bittiğinde JavaScript kullanıcı arayüzü geliştirmelerinizi uygulayın.

https://en.wikipedia.org/wiki/Unobtrusive_JavaScript


145
Hayat çok kısa. 2012- Javascript'i etkinleştirin veya eve gidin
Yarin

25
"Hayat çok kısa. 2012 - Javascript'i etkinleştirin veya eve gidin!" hiçbir JS durumunda görüntülemek için mükemmel küçük bir mesajdır. günlüğe sadece söylemek o @Yarin

5
Ben de sadece Başar olduğunu söylemek için giriş yaptı! @Yarin. Genel olarak halka açık olmayan küçük bir site yapıyorum (intranet gibi düşünün, ancak bir proje üzerinde çalışmak için bir araya gelen arkadaşlar için). Ben bir spa yapmak ve bir yedek koymak için rahatsız değil. Göze batmayan JavaScript, SPA konseptine koyduğum iş yükünü neredeyse iki katına çıkarır. Knockout, Jquery gibi modern javascript kütüphaneleriyle, her sitenin kolayca "göze batmayan" hale getirilemeyeceğini kabul etmek zorundayız. Javascript web'in geleceğidir.
lassombra

5
@Yarin Hiç bir zaman geri dönüşlere koymadığım bir yaşam için PHP / JS uygulamaları geliştiriyorum ... eğer benimle iletişime geçtikleri biri için işe yaramazsa ve onlara geçmişte yaşamayı bırakıp JS'yi etkinleştirmelerini söylerim.
Sam

2
@ n611x007 - Etik olmayan şeyler, ister sunucu ister istemci tarafı olsun, her cihazda tüm kodlarda gizlenir. Onun hatası kodlamıyor, insanları suçluyor. JS ironic'e karşı bir kampanya buluyorum, çünkü hala internete bağlanmak için 3. taraf bir ISS kullanıyorsunuz, yine de 3. taraf donanım / bellenimli bir bilgisayar kullanıyorsunuz, hala 3. taraf enjeksiyonlar tarafından erişilebilen güvenli olmayan hücre ağları kullanıyorsunuz, hala kullanan bir cep telefonuna sahipsiniz 3. tarafa eklenmemiş bir işletim sistemi, yine de 3. tarafa açık güncelleme hizmeti vb. kullanan bir düz ekran TV kullanın. Tarayıcınızda JS'yi kapatıp kapatmamanıza bakılmaksızın her zaman MITM-ish kanallarının kurbanı olursunuz.
dhaupin

35

<noscript>hatta gerekli değildir ve XHTML'de desteklenmediğinden bahsetmiyorum bile .

Çalışma Örneği :

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">
<html>
<head>
    <title>My website</title>
    <style>
      #site {
          display: none;
      }
    </style>
    <script src="http://code.jquery.com/jquery-latest.min.js "></script>
    <script>
      $(document).ready(function() {
          $("#noJS").hide();
          $("#site").show();
      });
    </script>
</head>
<body>
    <div id="noJS">Please enable JavaScript...</div>
    <div id="site">JavaScript dependent content here...</div>
</body>
</html>

Bu örnekte, JavaScript etkinse siteyi görürsünüz. Değilse, "Lütfen JavaScript'i etkinleştirin" mesajını görürsünüz. JavaScript'in etkin olup olmadığını test etmenin en iyi yolu, JavaScript'i kullanmayı denemektir! Çalışırsa, etkinleştirilir, değilse, o zaman ...


1
Ha, XHTML. O günler ... İşler çok değişti: developer.mozilla.org/en-US/docs/Web/HTML/Element/noscript
Stephan Weinhold

neden jquery kullanın ...
Luis Villavicencio

@StephanWeinhold, JSF XHTML kullanır.
Arash

34

Gövde üzerinde bir .no-js sınıfı kullanın ve .no-js üst sınıfını temel alan javascript olmayan stiller oluşturun. Javascript devre dışı bırakılırsa, tüm javascript olmayan stilleri alırsınız, JS desteği varsa .no-js sınıfı değiştirilir ve her zamanki gibi tüm stilleri verir.

 document.body.className = document.body.className.replace("no-js","js");

HTML5 boilerplate'te kullanılan hile http://html5boilerplate.com/ modernizr aracılığıyla ancak sınıfları değiştirmek için bir satır javascript kullanabilirsiniz

noscript etiketleri tamam ama neden css ile yapılabilecek olduğunda html'nizde ekstra şeyler var


5
Birisi .nojssınıftan bahsetmeden önce bu kadar uzun sürdü inanamıyorum ! Bu en kusursuz yaklaşımlardan biri ve noscriptutanç verici.
Musa

15

sadece biraz zor ama (hairbo bana fikir verdi)

CSS:

.pagecontainer {
  display: none;
}

JS:

function load() {
  document.getElementById('noscriptmsg').style.display = "none";
  document.getElementById('load').style.display = "block";
  /* rest of js*/
}

HTML:

<body onload="load();">

  <div class="pagecontainer" id="load">
    Page loading....
  </div>
  <div id="noscriptmsg">
    You don't have javascript enabled. Good luck with that.
  </div>

</body>

her durumda işe yarar değil mi? noscript etiketi desteklenmiyor olsa bile (sadece bazı css gerekli) herhangi biri css olmayan bir çözüm biliyor mu?


13

Gizli bir alanın değerini ayarlamak için basit bir JS snippet'i kullanabilirsiniz. Geri gönderildiğinde JS'nin etkin olup olmadığını biliyorsunuz.

Veya hızlı bir şekilde kapattığınız (ancak bu görünebilir) bir açılır pencere açmayı deneyebilirsiniz.

Ayrıca, JS devre dışı bırakılmış tarayıcılara metin göstermek için kullanabileceğiniz NOSCRIPT etiketine sahipsiniz.


Bu iyi bir cevap değil. İlk çözüm bir sayfanın yeniden yüklenmesini ve form gönderilmesini gerektirir. İkinci çözüm bir açılır pencere (ack!) Açar ve "hızlı" olarak kapatır - istemci tarafından? -1
Ben

Bazen bir sitenin JS etkinleştirilmiş olup olmadığı sunucu tarafını bilmeniz gerekir, bu yüzden bir şeyi geri göndermek dışında nasıl yapabileceğinizi göremiyorum. Bir pop-up çirkin nad katılıyorum Bu konuda gerçekten emin değilim ama kullanıcı bu rahatsız değil böylece ekranın görünür alanı dışında bir açılır pencere açmak mümkün olmalıdır. Zarif değil ama işe yarıyor ve sayfa yeniden yüklenmiyor.
rslite

Spambotlar da gizli bir alana mesaj gönderir.
Janis Veinbergs

13

Noscript etiketine bir göz atmak isteyeceksiniz.

<script type="text/javascript">
...some javascript script to insert data...
</script>
<noscript>
   <p>Access the <a href="http://someplace.com/data">data.</a></p>
</noscript>

12

Noscript etiketi iyi çalışır, ancak esas olarak noscript bir istemci tarafı kontrolü olduğundan, gereksiz her JS dosyasına hizmet vermeye devam etmek için her ek sayfa isteğini gerektirir.

JS ile bir çerez ayarlayabilirsiniz, ancak başka birinin işaret ettiği gibi, bu başarısız olabilir. İdeal olarak, JS istemci tarafını algılamak istersiniz ve çerezleri kullanmadan, söz konusu kullanıcı için JS'nin etkin olduğunu gösteren bir oturum sunucusu tarafı ayarlayın.

Bir olasılık, src özelliğinin aslında bir sunucu tarafı komut dosyası olduğu JavaScript kullanarak 1x1 resmi dinamik olarak eklemektir. Bu komut dosyasının yaptığı, JS'nin etkinleştirildiği geçerli kullanıcı oturumuna ($ _SESSION ['js_enabled']) kaydedilir. Daha sonra tarayıcıya 1x1 boş bir görüntü çıktısı alabilirsiniz. Komut dosyası, JS'yi devre dışı bırakmış kullanıcılar için çalışmaz ve bu nedenle $ _SESSION ['js_enabled'] ayarlanmaz. Ardından, bu kullanıcıya sunulan diğer sayfalar için tüm harici JS dosyalarınızı dahil edip etmeyeceğinize karar verebilirsiniz, ancak bazı kullanıcılarınız NoScript Firefox eklentisini kullanıyor olabilir veya JS içeriyor olabilir. başka bir nedenle geçici olarak devre dışı bırakıldı.

Ek HTTP isteğinin sayfanızın oluşturulmasını yavaşlatmaması için bu kontrolü muhtemelen sayfanızın sonuna yakın bir yere eklemek isteyeceksiniz.


12

Bunu her sayfanın HEAD etiketine ekleyin.

<noscript>
        <meta http-equiv="refresh" runat="server" id="mtaJSCheck" content="0;logon.aspx" />
</noscript>

Yani:

<head>
    <noscript>
        <meta http-equiv="refresh" runat="server" id="mtaJSCheck" content="0;logon.aspx" />
    </noscript>
</head>

Jay sayesinde.


12

Her zaman tarayıcıya bakmak için değerli bir şey vermek istediğimden sık sık bu numarayı kullanıyorum:

İlk olarak, sayfanın düzgün çalışması için JavaScript'e ihtiyaç duyan herhangi bir kısmı (getElementById çağrıları yoluyla değiştirilen pasif HTML öğeleri dahil), kullanılabilir ISN'T javaScript olduğu varsayımıyla olduğu gibi kullanılabilir olacak şekilde tasarlanmıştır. (sanki orada değilmiş gibi tasarlanmış)

JavaScript gerektiren herhangi bir öğe, bir etiketin içine bir şey yerleştiririm:

<span name="jsOnly" style="display: none;"></span>

Sonra belgemin başlangıcında , JS bağımlı öğeleri yeniden açmak için .onloadveya document.readybir döngü içinde getElementsByName('jsOnly')kullanın .style.display = "";. Bu şekilde, JS olmayan tarayıcılar sitenin JS'ye bağlı bölümlerini görmek zorunda kalmazlar ve varsa, hazır olduğunda hemen görünür.

Bu yönteme alıştıktan sonra, şimdi sadece noscriptetiketi denemeye ve bazı ek avantajlara sahip olmasını bekliyorum.


10

Bu "en temiz" çözüm kimliği kullanımı:

<noscript>
    <style>
        body *{ /*hides all elements inside the body*/
            display: none;
        }
        h1{ /* even if this h1 is inside head tags it will be first hidden, so we have to display it again after all body elements are hidden*/
            display: block;
        }
    </style>
    <h1>JavaScript is not enabled, please check your browser settings.</h1>
</noscript>

9

Yaygın bir çözüm, sayfayı yenilemek ve JavaScript devre dışı bırakıldığında sunucuyu bilgilendirmek için noscript ile birlikte meta etikete şu şekilde gelir:

<!DOCTYPE html>
<html lang="en">
    <head>
        <noscript>
            <meta http-equiv="refresh" content="0; /?javascript=false">
        </noscript>
        <meta charset="UTF-8"/>
        <title></title>
    </head>
</html>

Yukarıdaki örnekte, JavaScript devre dışı bırakıldığında tarayıcı, web sitesinin ana sayfasına 0 saniye içinde yönlendirecektir. Ayrıca sunucuya javascript = false parametresini de gönderir.

Daha sonra node.js veya PHP gibi bir sunucu tarafı komut dosyası parametreyi ayrıştırabilir ve JavaScript'in devre dışı bırakıldığını öğrenebilir. Daha sonra istemciye web sitesinin JavaScript dışı özel bir sürümünü gönderebilir.


8

Javascript devre dışı bırakılmışsa, istemci tarafı kodunuz yine de çalışmaz, bu yüzden bu bilginin sunucu tarafında olmasını istediğinizi varsayalım. Bu durumda, noscript daha az yardımcı olur. Bunun yerine, gizli bir girdi olurdu ve bir değeri doldurmak için javascript kullanırdım. Bir sonraki isteğiniz veya geri göndermenizden sonra, değer oradaysa javascript'in açık olduğunu bilirsiniz.

İlk isteğin javascript'i devre dışı bırakabileceği noscript gibi şeylere dikkat edin, ancak gelecekteki istekler bunu açın.


5

Örneğin, tarayıcıyı komut dosyası yüklü yeni bir sayfaya yönlendirmek için document.location = 'java_page.html' gibi bir şey kullanabilirsiniz. Yeniden yönlendirilmemesi, JavaScript'in kullanılamadığı anlamına gelir; bu durumda, CGI ro araçlarına başvurabilir veya etiketler arasına uygun kodu ekleyebilirsiniz. (NOT: NOSCRIPT yalnızca Netscape Navigator 3.0 ve sonraki sürümlerde kullanılabilir.)

kredi http://www.intranetjournal.com/faqs/jsfaq/how12.html


4

Geçmişte kullandığım bir teknik, JavaScript'in etkin olduğunu söylemek için bir bayrak görevi gören bir oturum çerezi yazmak için JavaScript kullanmaktır. Ardından sunucu tarafı kodu bu çerezi arar ve bulunmazsa uygun şekilde işlem yapar. Tabii bu teknik çerezlerin etkinleştirilmesine dayanıyor!


4

Bir noscript etiketine bir resim etiketi ekleyebilir ve istatistiklere sitenizin kaç kez ve bu resmin ne sıklıkta yüklendiğini görebilirsiniz.


4

İnsanlar zaten algılama için iyi seçenekler olan örnekler yayınladılar, ancak "tarayıcının JS etkinleştirilmeden sitenin düzgün çalışamadığına dair uyarı verme" gereksiniminize dayanarak. Temel olarak sayfada bir şekilde görünen bir öğe eklersiniz, örneğin uygun bir mesajla bir rozet kazandığınızda Yığın Taşması üzerindeki 'açılır pencereler', ardından sayfa yüklenir yüklenmez çalışan bazı Javascript ile bunu kaldırırsınız ( ve bütün sayfa değil, DOM demek).


3

Ne tespit ettiniz? JavaScript? Bu imkansız olurdu. Yalnızca günlük kaydı amacıyla istiyorsanız, her sayfanın özel bir kaynak (muhtemelen çok küçük gifveya benzer) için istekte bulunacak JavaScript'e sahip olduğu bir tür izleme şeması kullanabilirsiniz . Bu şekilde, benzersiz sayfa istekleri ile izleme dosyanızın istekleri arasındaki farkı fark edebilirsiniz.


3

Neden yalnızca JS etkinleştirildiğinde tetiklenecek bir ele geçirilmiş onClick () olay işleyicisi koymuyorsunuz ve bunu tıklanan / seçilen URL'ye bir parametre (js = true) eklemek için de kullanıyorsunuz (ayrıca bir açılır liste de tespit edebilirsiniz) ve gizli form alanı ekle değerini değiştirin). Şimdi sunucu bu parametreyi gördüğünde (js = true) JS'nin etkin olduğunu bilir ve sonra da fantezi mantığınızı sunucu tarafında yapar.
Bunun aşağı tarafı, bir kullanıcı sitenize, yer işaretinize, URL'nize, arama motoru tarafından oluşturulan URL'ye ilk kez geldiğinde, bunun yeni bir kullanıcı olduğunu tespit etmeniz gerekeceğinden URL'ye eklenen NVP'yi aramayın, ve sunucunun kullanıcının JS etkin / devre dışı olduğunu belirlemek için bir sonraki tıklamayı beklemesi gerekir. Ayrıca, bir başka dezavantaj, URL'nin tarayıcı URL'sinde biteceği ve bu kullanıcı daha sonra bu URL'ye yer işareti koyarsa, kullanıcının JS etkin olmasa bile js = true NVP'ye sahip olacaktır, ancak bir sonraki tıklamada sunucu kullanıcının JS'nin hala etkin olup olmadığını bilmek akıllıca olacaktır. Ah ... bu eğlenceli ...


3

Kullanıcıları JavaScripts'i etkinleştirmeye zorlamak için, her bağlantının 'href' özniteliğini aynı belgeye ayarladım; bu da kullanıcıyı JavaScripts'i etkinleştirmesini veya Firefox'u indirmesini (JavaScripts'i nasıl etkinleştireceklerini bilmiyorlarsa) bildirir. Gerçek bağlantı URL'sini bağlantıların 'name' özelliğine depoladım ve 'name' niteliğini okuyan ve sayfayı oraya yönlendiren global bir onclick olayı tanımladım.

Biraz faşist olsa da, kullanıcı tabanım için iyi çalışıyor;).


ve kullanıcı JS etkin ve ilerici javascript başlamadan önce bağlantıyı tıklarsa biraz can sıkıcı ...
Simon_Weaver

1
Elbette, ancak henüz bir sorun bildirilmedi.
Jan Sahin

3

Kullanıcının javascript'i devre dışı bırakıp bırakmadığını (sunucu tarafı veya istemci) algılamazsınız. Bunun yerine, javascript'in devre dışı olduğunu varsayar ve javascript devre dışı olarak web sayfanızı oluşturur. Bu noscript, yine de kullanmaktan kaçınmanız gereken ihtiyacı ortadan kaldırır, çünkü oldukça doğru çalışmaz ve gereksizdir.

Örneğin, sitenizi sadece <div id="nojs">This website doesn't work without JS</div>

Daha sonra, komut dosyanız document.getElementById('nojs').style.display = 'none';normal JS işini yapacaktır .


Bu harika bir kesintisiz yaklaşım <noscript> etiketleri farklı sayfalarda bakımı çok daha zordur Bu yaklaşım ile noscript stilinizi css dosyanız üzerinden koruyabilirsiniz.
zadubz

3

Burada tanıttığım saf bir sunucu tarafı çözümü kullanarak çerezleri kontrol edin, sonra Jquery.Cookie kullanarak bir çerez bırakarak javascript için kontrol edin ve sonra çerezleri bu şekilde kontrol edin u hem çerezler hem de javascript için kontrol edin


3

Bazı durumlarda, geriye doğru yapmak yeterli olabilir. Javascript kullanarak bir sınıf ekleyin:

// Jquery
$('body').addClass('js-enabled');

/* CSS */
.menu-mobile {display:none;}
body.js-enabled .menu-mobile {display:block;}

Bu karmaşık bir şeyde bakım sorunları yaratabilir, ancak bazı şeyler için basit bir düzeltme. Yüklenmediği zamanları tespit etmeye çalışmak yerine, yüklendiği zamana göre stil verin.


3

Toplam kullanıcılar üzerinde javascript devre dışı bırakılmış sitemi kaç gerçek kullanıcının ziyaret ettiğine dair güvenilir istatistikler elde etmek için çözümümü eklemek istiyorum. Kontrol, aşağıdaki avantajlarla birlikte her oturumda yalnızca bir kez yapılır:

  • 100 sayfayı veya sadece 1'i ziyaret eden kullanıcılar 1'er adet sayılır. Bu, sayfalara değil tek kullanıcılara odaklanmaya izin verir.
  • Yine de sayfa akışını, yapısını veya anlambilimini bozmaz
  • Kullanıcı aracısı günlüğe kaydedilebilir. Bu, botları, genellikle JS devre dışı bırakılan google bot ve bing bot gibi istatistiklerden hariç tutmaya izin verir! Ayrıca IP, zaman vb.
  • Oturum başına sadece bir kontrol (minimum aşırı yük)

Kodum ajax ile PHP, mysql ve jquery kullanıyor ancak diğer dillere uyarlanabilir:

DB'nizde şöyle bir tablo oluşturun:

CREATE TABLE IF NOT EXISTS `log_JS` (
  `logJS_id` int(11) NOT NULL AUTO_INCREMENT,
  `data_ins` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `session_id` varchar(50) NOT NULL,
  `JS_ON` tinyint(1) NOT NULL DEFAULT '0',
  `agent` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`logJS_id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8;

Session_start () veya eşdeğerini (jquery gereklidir) kullandıktan sonra bunu her sayfaya ekleyin:

<?  if (!isset($_SESSION["JSTest"]))
    { 
        mysql_query("INSERT INTO log_JS (session_id, agent) VALUES ('" . mysql_real_escape_string(session_id()) . "', '" . mysql_real_escape_string($_SERVER['HTTP_USER_AGENT']). "')"); 
        $_SESSION["JSTest"] = 1; // One time per session
        ?>
        <script type="text/javascript">
            $(document).ready(function() { $.get('JSOK.php'); });
        </script>
        <?
    }
?>

JSOK.php sayfasını şu şekilde oluşturun:

<?
include_once("[DB connection file].php");   
mysql_query("UPDATE log_JS SET JS_ON = 1 WHERE session_id = '" . mysql_real_escape_string(session_id()) . "'");

3

Css ve javascript kullanarak başka bir yaklaşım anladım.
Bu sadece sınıflar ve kimliklerle uğraşmaya başlamak içindir.

CSS snippet'i:
1. Bir css kimlik kuralı oluşturun ve buna #jsDis adını verin.
2. BODY öğesinden sonra bir metin oluşturmak için "content" özelliğini kullanın. (Bunu istediğiniz gibi şekillendirebilirsiniz).
3 2. css kimlik kuralı oluşturun ve #jsEn olarak adlandırın ve stilize edin. (basitlik adına, #jsEn kuralıma farklı bir arka plan rengi verdim.

<style>
#jsDis:after {
    content:"Javascript is Disable. Please turn it ON!";
    font:bold 11px Verdana;
    color:#FF0000;
}

#jsEn {
    background-color:#dedede;
}

#jsEn:after {
    content:"Javascript is Enable. Well Done!";
    font:bold 11px Verdana;
    color:#333333;
}
</style>

JavaScript snippet'i:
1. Bir işlev oluşturun.
2. getElementById ile BODY ID'sini alın ve bir değişkene atayın.
3. 'setAttribute' JS işlevini kullanarak, BODY öğesinin ID özniteliğinin değerini değiştirin.

<script>
function jsOn() {
    var chgID = document.getElementById('jsDis');
    chgID.setAttribute('id', 'jsEn');
}
</script>

HTML bölümü.
1. BODY öğesi niteliğini #jsDis kimliğiyle adlandırın.
2. İşlev adıyla onLoad olayını ekleyin. (JSON ()).

<body id="jsDis" onLoad="jsOn()">

BODY etiketine #jsDis kimliği verildiğinden:
- Javascript etkinse , kendi başına BODY etiketinin niteliğini değiştirir.
- Javascript devre dışı bırakılmışsa, css 'content:' kural metnini gösterir.

#Wrapper kapsayıcısıyla veya JS kullanan herhangi bir DIV ile oynayabilirsiniz.

Umarım bu fikir elde etmeye yardımcı olur.


2

Noscript içinde meta'ya yenileme eklemek iyi bir fikir değildir.

  1. Noscript etiketi XHTML uyumlu olmadığından

  2. "Yenile" özellik değeri standart dışıdır ve kullanılmamalıdır. "Yenile" sayfanın kontrolünü kullanıcıdan uzaklaştırır. "Yenile" kullanılması, W3C'nin Web İçeriği Erişilebilirlik Yönergeleri'nde (--- http://www.w3schools.com/TAGS/att_meta_http_equiv.asp) bir hataya neden olur .


Kimse XHTML hakkında bir şey söylemedi. <noscript> HTML 4.01 kesin olarak geçerlidir.
Tom

2
noscript, XHTML 1.0 ve XHTML 1.1'de de mükemmel şekilde geçerlidir. Meta öğeler içeremez ve aşamalı geliştirme lehine kaçınılmalıdır, ancak dillerin bir parçasıdır.
Quentin
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.