Làm cách nào để phát hiện nếu JavaScript bị vô hiệu hóa?


659

Có một bài đăng sáng nay hỏi về việc có bao nhiêu người vô hiệu hóa JavaScript. Sau đó, tôi bắt đầu tự hỏi những kỹ thuật nào có thể được sử dụng để xác định xem người dùng có bị vô hiệu hóa hay không.

Có ai biết một số cách ngắn / đơn giản để phát hiện nếu JavaScript bị vô hiệu hóa không? Ý định của tôi là đưa ra một cảnh báo rằng trang web không thể hoạt động bình thường nếu không có trình duyệt kích hoạt JS.

Cuối cùng, tôi muốn chuyển hướng chúng đến nội dung có thể hoạt động trong trường hợp không có JS, nhưng tôi cần phát hiện này như một trình giữ chỗ để bắt đầu.


Bạn muốn làm gì với thông tin này? Nó có thể thay đổi câu trả lời bạn nhận được - ví dụ: cải tiến lũy tiến thường được ưu tiên hơn là cố gắng phát hiện JavaScript bị vô hiệu hóa và thực hiện hành động cụ thể dựa trên điều đó.
Jonny Buchanan

tăng cường tiến bộ là những gì tôi đang tìm kiếm. Tôi muốn ot có thể chuyển hướng chúng đến nội dung thay thế sẽ hoạt động chính xác trong phạm vi của trình duyệt JS hoặc trình duyệt có khả năng.
MikeJ

1
@Exiredninja Bài đăng này của Nicholas Zakas cho biết khoảng 2%, mặc dù nó đã hơn một năm tuổi.
sdleihssirhc

Cách dễ nhất là sử dụng noscript để hiển thị trang web không có javascript và sử dụng javascript để hiển thị bất kỳ yếu tố phụ thuộc javascript nào bằng cách sửa đổi hiển thị kiểu.
Myforwik

Câu trả lời:


286

Tôi cho rằng bạn đang cố gắng quyết định có phân phối nội dung được tăng cường JavaScript hay không. Các triển khai tốt nhất làm suy giảm sạch sẽ, để trang web vẫn hoạt động mà không cần JavaScript. Tôi cũng cho rằng bạn có nghĩa là phát hiện phía máy chủ , thay vì sử dụng<noscript> phần tử này vì một lý do không giải thích được.

Không có cách nào tốt để thực hiện phát hiện JavaScript phía máy chủ. Để thay thế, có thể đặt cookie bằng JavaScript và sau đó kiểm tra cookie đó bằng cách sử dụng tập lệnh phía máy chủ khi xem các trang tiếp theo. Tuy nhiên, điều này sẽ không phù hợp để quyết định nội dung nào sẽ phân phối vì nó sẽ không thể phân biệt khách truy cập nếu không có cookie với khách truy cập mới hoặc khách truy cập đang chặn cookie.


129
<noscript> IS là cách chính xác nhất về mặt ngữ nghĩa để chỉ định nội dung không phải là javascript - và sau đó phát hiện nếu javascript bị vô hiệu hóa, hãy phát hiện nếu nó được bật. Vì vậy, hãy hiển thị thông báo "bạn cần javascript để sử dụng đúng trang web của tôi" theo mặc định, nhưng ẩn nó bằng chức năng javascript ngay lập tức trên Tải.
matt lohkamp

58
@matt lohkamp: Hoặc thậm chí ẩn tin nhắn theo mặc định và đặt một <style>khối bên trong <noscript>để bỏ ẩn (không có chỉnh lại dòng nếu có bật JS). Đáng ngạc nhiên, điều này hoạt động trong tất cả các trình duyệt hiện đại và ngay cả trong IE6
Piskvor rời khỏi tòa nhà vào

7
@matt - Tôi đã làm điều này một lúc, nhưng tin nhắn vẫn duy trì trong một thời gian trên các kết nối chậm khiến người dùng bối rối. Tôi ở đây đang tìm kiếm một giải pháp khác. @Piskvor - thẻ <noscript> trong tiêu đề sẽ không xác thực và thẻ <style> trong phần thân sẽ không xác thực.
Ben

20
... ngoại trừ tại sao bạn quan tâm đến xác nhận? Bạn đang xác nhận chỉ để xác nhận? Nó có thể không "chính xác" nhưng nếu nó hoạt động và hoàn thành nó "với một chút bụi bẩn dưới mui xe" thì vấn đề là gì? Đừng lo lắng, tôi sẽ không phán xét ;-)
keif

4
Nó vẫn hợp lệ nếu bạn chỉ sử dụng thuộc tính style cho các thành phần đã cho trong các thẻ <noscript> (như <noscript> <div style = "color: red;"> blahblah </ div> </ noscript> hoặc sg. Tương tự) . NHƯNG nó vẫn hợp lệ nếu bạn đặt <style> BLOCK bình thường trong tiêu đề xác định kiểu của một số phần tử được phân loại .noscript (hoặc tương tự) và trong phần thân, trong các thẻ <noscript>, bạn chỉ cần cung cấp cho các phần tử đã cho lớp .noscript được xác định trước đó, như thế này: <noscript> <div class = "noscript"> blahblah </ div> </ noscript>
Sk8erPeter

360

Tôi muốn thêm 0,02 của tôi vào đây. Nó không chống đạn 100%, nhưng tôi nghĩ nó đủ tốt.

Vấn đề, đối với tôi, với ví dụ ưa thích về việc đưa ra một loại thông báo "trang web này không hoạt động tốt nếu không có Javascript" là bạn cần đảm bảo rằng trang web của bạn hoạt động tốt mà không cần Javascript. Và một khi bạn đã bắt đầu trên con đường đó, thì bạn bắt đầu nhận ra rằng trang web sẽ chống đạn khi tắt JS và đó là một phần lớn công việc bổ sung.

Vì vậy, những gì bạn thực sự muốn là một "chuyển hướng" đến một trang có nội dung "bật JS, ngớ ngẩn". Nhưng, tất nhiên, bạn không thể tin cậy thực hiện chuyển hướng meta. Vì vậy, đây là gợi ý:

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

... Trong đó tất cả các nội dung trong trang web của bạn được bao bọc bởi một div của "pagecontainer". CSS bên trong thẻ noscript sau đó sẽ ẩn tất cả nội dung trang của bạn và thay vào đó hiển thị bất kỳ thông báo "không có JS" nào bạn muốn hiển thị. Đây thực sự là những gì Gmail dường như làm ... và nếu nó đủ tốt cho Google, thì nó đủ tốt cho trang web nhỏ của tôi.


12
@steve bao giờ thử xác nhận google.com? xác nhận chỉ xác định mức độ đóng của tài liệu theo bảng thông số, nó không ảnh hưởng đến khả năng sử dụng của trang.
JKirchartz

71
@JonasGeiregat Có gì sai khi buộc người dùng yêu cầu Javascript nếu ứng dụng web của bạn được xây dựng - và yêu cầu - Javascript hoạt động? Tôi nghe nhận xét này quá thường xuyên, nhưng nó chỉ hợp lệ cho các trang web đơn giản nhất. Hãy dùng thử Facebook mà không cần JS và xem điều gì sẽ xảy ra. Nếu ứng dụng của bạn được xây dựng CHO Javascript, vậy thì có gì sai khi yêu cầu 99% người dùng đã kích hoạt bằng cách nào?
Lee Benson

19
@Lee đánh nó trên móng tay, bạn chỉ có thể làm rất nhiều cho người dùng trước khi bạn vẽ đường trên những gì bạn sẽ hỗ trợ. Chúng tôi hy vọng tất cả người dùng có thiết bị hỗ trợ internet, tôi cũng nên triển khai phiên bản giấy của trang web cho những người từ chối truy cập internet?
Kolors

14
@Kolors, tôi đã đưa ra nhận xét đó vào tháng 3 năm 2012 và tôi cho rằng điều đó gấp đôi sự thật ngày hôm nay. Kể từ đó, chúng tôi đã có Meteor, Angular.Js, Famo.us và rất nhiều thư viện tuyệt vời mà tất cả đều yêu cầu Javascript để bắt đầu . Tôi tự hỏi những gì người dùng chọn vô hiệu hóa JS thực sự đang cố gắng đạt được ... rõ ràng, họ không lướt web giống như phần còn lại của chúng tôi và không có lý do gì một công ty cần phải thu nhỏ trang web của họ một cách nhỏ nhất tập hợp con của những người dùng cứng đầu ...
Lee Benson

6
Vâng, và tôi đã tự hỏi tại sao tôi không thể đưa ra câu trả lời của bạn, vì tôi đã quên kích hoạt JS của mình :-)) Tôi thích và thực hiện giải pháp của bạn! Cảm ơn!
Garavani

198

noscript các khối được thực thi khi JavaScript bị vô hiệu hóa và thường được sử dụng để hiển thị nội dung thay thế cho nội dung bạn đã tạo trong JavaScript, ví dụ:

<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>

Người dùng không có js sẽ nhận được next_page liên kết - bạn có thể thêm các tham số ở đây để bạn biết trên trang tiếp theo cho dù họ đã đi qua liên kết JS / không phải là JS hay cố gắng đặt cookie thông qua JS, sự vắng mặt của nó ngụ ý JS bị vô hiệu hóa. Cả hai ví dụ này đều khá tầm thường và mở cho thao tác, nhưng bạn có ý tưởng.

Nếu bạn muốn có một ý tưởng thống kê thuần túy về việc có bao nhiêu người dùng của bạn đã tắt javascript, bạn có thể làm một cái gì đó như:

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

sau đó kiểm tra nhật ký truy cập của bạn để xem hình ảnh này đã được nhấn bao nhiêu lần. Một giải pháp hơi thô sơ, nhưng nó sẽ cung cấp cho bạn một ý tưởng tốt về tỷ lệ phần trăm cho cơ sở người dùng của bạn.

Cách tiếp cận trên (theo dõi hình ảnh) sẽ không hoạt động tốt đối với các trình duyệt chỉ có văn bản hoặc những trình duyệt không hỗ trợ js, vì vậy nếu cơ sở người dùng của bạn chủ yếu chuyển sang khu vực đó, đây có thể không phải là cách tiếp cận tốt nhất.


7
Điều này không hiệu quả lắm. Ví dụ: nó sẽ không tính bất kỳ ai có trình duyệt chỉ có văn bản, thông thường không có hỗ trợ JavaScript. Ít nhất, bạn nên vô hiệu hóa bộ nhớ đệm cho hình ảnh đó.
Jim

3
Liệu lông mày nào không hỗ trợ JS không chỉ đơn giản là bỏ qua thẻ noscript và hiển thị hình ảnh?
LKM

1
@LKM: Phụ thuộc vào cách họ viết, rất có thể họ sẽ viết, vì vậy bạn sẽ biến nó thành một dấu chấm 1x1px. Tùy chọn đó chủ yếu để theo dõi các mẫu sử dụng phía máy chủ, vì vậy vẫn sẽ ổn, vì nó được kích hoạt bởi người dùng không có khả năng javascript.
ConroyP

Lưu ý rằng hiện tại có một lỗi với IE8 và thẻ noscript nếu bạn tạo kiểu cho nó ... xem
locationiseverything.net/explorer.html

2
ngoài ra, bạn có thể phân phát hình ảnh đó dưới dạng tập lệnh phía máy chủ, đặt loại mime và sử dụng hình ảnh đó để ghi nhật ký một số thông tin về người dùng hoặc thả cookie ... px.sklar.com/code.html/id=256
JKirchartz

46

Đây là những gì làm việc cho tôi: nó chuyển hướng khách truy cập nếu javascript bị vô hiệu hóa

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

6
Điều này không hợp lệ. yếu tố noscript không thể chứa các yếu tố meta. Tôi sẽ không tin tưởng điều này sẽ hoạt động đáng tin cậy trong tất cả các trình duyệt (bao gồm cả các trình duyệt trong tương lai mà bạn hiện không thể kiểm tra), vì chúng có thể thực hiện khôi phục lỗi theo các cách khác nhau.
Quentin

15
Điều này có thể không hợp lệ, nhưng hãy xem mã của Facebook, nó sử dụng cùng một giải pháp trong phần <head> - điều đó không có nghĩa đó là một giải pháp rất tốt, bởi vì mã của Facebook nằm xa một mã hợp lệ, NHƯNG nó có thể có nghĩa là nó hoạt động trên trình duyệt của nhiều người dùng, đây có thể là một khía cạnh quan trọng. Nhưng sự thật là nó không thực sự được đề xuất. Đây là mã của họ: <noscript> <meta http-Equiv = refresh content = "0; URL = / about / Messages /? _ Fb_noscript = 1" /> </ noscript>
Sk8erPeter

IE9 (ít nhất) có cài đặt "cho phép META REFRESH". Tôi dường như không tắt nhiều thứ, nhưng có lẽ những người không thích javascript làm, nhưng nếu bạn muốn 100%, thì không phải vậy.
jenson-button-event

Nó có giá trị trong HTML5.
Naszta

1
Điều này phá hủy liên kết khi cố gắng chia sẻ trên Linkedin, chúng tôi đã tìm thấy một cách khó khăn ... đây không phải là một ý tưởng tốt. Vì Linkedin tuân theo việc làm mới meta, bỏ qua các thẻ Og, v.v.
sốDudeSomewhere

44

Nếu trường hợp sử dụng của bạn là bạn có một biểu mẫu (ví dụ: biểu mẫu đăng nhập) và tập lệnh phía máy chủ của bạn cần biết liệu người dùng có bật JavaScript hay không, bạn có thể làm điều gì đó như sau:

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

Điều này sẽ thay đổi giá trị của js_enables thành 1 trước khi gửi biểu mẫu. Nếu tập lệnh phía máy chủ của bạn có 0, không có JS. Nếu nó được 1, JS!


44

Tôi khuyên bạn nên đi theo cách khác bằng cách viết JavaScript không phô trương.

Làm cho các tính năng của dự án của bạn hoạt động cho người dùng bị JavaScript bị vô hiệu hóa và khi bạn hoàn thành, hãy triển khai các cải tiến UI UI của bạn.

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


145
Cuộc đời quá ngắn ngủi. Đó là năm 2012- Kích hoạt javascript hoặc về nhà
Yarin

25
"Cuộc sống quá ngắn. Đó là năm 2012 - Kích hoạt javascript hoặc về nhà!" là thông điệp nhỏ hoàn hảo để hiển thị trong trường hợp không có JS. đăng nhập chỉ để cho bạn biết rằng @Yarin

5
Tôi cũng chỉ cần đăng nhập để nói rằng đó là TUYỆT VỜI! @Yarin. Tôi đang tạo một trang web nhỏ thường không công khai (xem như mạng nội bộ nhưng dành cho bạn bè cùng nhau làm việc trong một dự án). Tôi đang biến nó thành một SPA và không bận tâm đến việc dự phòng. JavaScript không phô trương sẽ tăng gần gấp đôi khối lượng công việc mà tôi đang đưa vào khái niệm SPA. Với các thư viện javascript hiện đại như Knockout, Jquery, trong số những người khác, chúng ta phải chấp nhận rằng không phải mọi trang web đều có thể dễ dàng thực hiện "không phô trương". Javascript là tương lai của web.
lassombra

5
@Yarin Tôi xây dựng các ứng dụng PHP / JS để kiếm sống Tôi chưa bao giờ gặp khó khăn ... nếu nó không hoạt động với ai đó mà họ liên hệ với tôi và tôi bảo họ ngừng sống trong quá khứ và kích hoạt JS.
Sam

2
@ n611x007 - Những điều phi đạo đức ẩn trong tất cả các mã, trong mọi thiết bị, cho dù phía máy chủ hay máy khách. Nó không phải là mã lỗi, lỗi của con người. Tôi tìm thấy một chiến dịch chống lại JS ironic vì bạn vẫn sử dụng ISP của bên thứ 3 để kết nối với internet, vẫn sử dụng máy tính có phần cứng / phần sụn của bên thứ 3, vẫn sử dụng các mạng di động không an toàn có thể truy cập bởi các bên thứ 3, vẫn sở hữu điện thoại di động sử dụng HĐH chưa được vá của bên thứ 3, vẫn sử dụng TV màn hình phẳng sử dụng dịch vụ cập nhật mở rộng của bên thứ 3, v.v. Bạn luôn là nạn nhân của các kênh MITM-ish bất kể bạn có tắt JS trong trình duyệt hay không.
dhaupin

35

<noscript>thậm chí không cần thiết và không đề cập đến việc không được hỗ trợ trong XHTML .

Ví dụ làm việc :

<!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>

Trong ví dụ này, nếu JavaScript được bật, thì bạn sẽ thấy trang web. Nếu không, sau đó bạn thấy thông báo "Vui lòng bật JavaScript". Cách tốt nhất để kiểm tra xem JavaScript có được bật hay không, chỉ đơn giản là thử và sử dụng JavaScript! Nếu nó hoạt động, nó được kích hoạt, nếu không, thì nó không ...


1
Hà, XHTML. Đó là những ngày ... Mọi thứ đã thay đổi rất nhiều: developer.mozilla.org/en-US/docs/Web/HTML/Euity/noscript
Stephan Weinhold

tại sao sử dụng jquery ...
Luis Villavicencio

@Stephan WEinhold, JSF sử dụng XHTML.
Arash

34

Sử dụng lớp .no-js trên cơ thể và tạo các kiểu không javascript dựa trên lớp cha .no-js. Nếu javascript bị vô hiệu hóa, bạn sẽ nhận được tất cả các kiểu javascript, nếu có hỗ trợ JS, lớp .no-js sẽ được thay thế, cung cấp cho bạn tất cả các kiểu như bình thường.

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

mẹo được sử dụng trong HTML5 soạn sẵn http://html5boilerplate.com/ thông qua Modernizr nhưng bạn có thể sử dụng một dòng javascript để thay thế các lớp

Thẻ noscript vẫn ổn nhưng tại sao lại có thêm nội dung trong html của bạn khi có thể thực hiện bằng css


5
Không thể tin được điều này đã mất rất lâu trước khi ai đó đề cập đến .nojslớp học! Đây là một trong những cách tiếp cận liền mạch nhất và gây noscriptxấu hổ.
Moses

15

chỉ là một chút khó khăn nhưng (Hairbo đã cho tôi ý tưởng)

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>

sẽ làm việc trong mọi trường hợp phải không? ngay cả khi thẻ noscript không được hỗ trợ (chỉ yêu cầu một số css) có ai biết giải pháp không css không?


13

Bạn có thể sử dụng một đoạn mã JS đơn giản để đặt giá trị của một trường ẩn. Khi được đăng lại, bạn sẽ biết liệu JS có được kích hoạt hay không.

Hoặc bạn có thể thử mở một cửa sổ bật lên mà bạn đóng nhanh chóng (nhưng điều đó có thể hiển thị).

Ngoài ra, bạn có thẻ NOSCRIPT mà bạn có thể sử dụng để hiển thị văn bản cho các trình duyệt bị tắt JS.


Đây không phải là một câu trả lời tốt. Giải pháp đầu tiên yêu cầu tải lại trang và gửi biểu mẫu. Giải pháp thứ hai mở một cửa sổ bật lên (ack!) Và đóng nó "nhanh chóng" - từ phía khách hàng? -1
Ben

Đôi khi bạn cần biết phía máy chủ xem một trang web có bật JS hay không, vì vậy tôi không thấy cách bạn có thể làm điều đó ngoài việc đăng lại một cái gì đó. Đồng ý rằng một cửa sổ bật lên là xấu, tôi không thực sự chắc chắn về điều này nhưng có thể mở một cửa sổ bật ra bên ngoài khu vực hiển thị của màn hình để người dùng không bị làm phiền bởi điều này. Không thanh lịch nhưng nó hoạt động và không có trang tải lại.
rslite

Spamb cũng gửi bài cho một lĩnh vực ẩn.
Janis Veinbergs

13

Bạn sẽ muốn xem qua thẻ noscript.

<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

Thẻ noscript hoạt động tốt, nhưng sẽ yêu cầu mỗi yêu cầu trang bổ sung để tiếp tục phục vụ các tệp JS vô dụng, vì về cơ bản noscript là kiểm tra phía máy khách.

Bạn có thể đặt cookie với JS, nhưng như một người khác đã chỉ ra, điều này có thể thất bại. Lý tưởng nhất là bạn muốn có thể phát hiện phía máy khách JS và không sử dụng cookie, hãy đặt phía máy chủ phiên cho người dùng đó cho biết là JS được bật.

Một khả năng là tự động thêm một hình ảnh 1x1 bằng JavaScript trong đó thuộc tính src thực sự là một tập lệnh phía máy chủ. Tất cả tập lệnh này sẽ lưu vào phiên người dùng hiện tại mà JS được bật ($ _SESSION ['js_enables']). Sau đó, bạn có thể xuất hình ảnh trống 1x1 trở lại trình duyệt. Tập lệnh sẽ không chạy đối với người dùng đã tắt JS và do đó $ _SESSION ['js_enables'] sẽ không được đặt. Sau đó, đối với các trang khác được cung cấp cho người dùng này, bạn có thể quyết định có bao gồm tất cả các tệp JS bên ngoài của mình hay không, nhưng bạn sẽ luôn muốn bao gồm kiểm tra, vì một số người dùng của bạn có thể đang sử dụng tiện ích bổ sung NoScript Firefox hoặc có JS tạm thời bị vô hiệu hóa vì một số lý do khác.

Bạn có thể muốn bao gồm kiểm tra này ở đâu đó gần cuối trang của mình để yêu cầu HTTP bổ sung không làm chậm kết xuất trang của bạn.


12

Thêm phần này vào thẻ CHÍNH của mỗi trang.

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

Vì vậy, bạn có:

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

Cảm ơn Jay.


12

Bởi vì tôi luôn muốn cung cấp cho trình duyệt một cái gì đó đáng để xem xét nên tôi thường sử dụng thủ thuật này:

Đầu tiên, bất kỳ phần nào của trang cần JavaScript để chạy đúng (bao gồm các phần tử HTML thụ động được sửa đổi thông qua các lệnh gọi getEuityById, v.v.) được thiết kế để có thể sử dụng được như với giả định rằng có sẵn javaScript. (được thiết kế như thể nó không có ở đó)

Bất kỳ yếu tố nào sẽ yêu cầu JavaScript, tôi đặt bên trong một thẻ như:

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

Sau đó, ở phần đầu của tài liệu, tôi sử dụng .onloadhoặc document.readytrong một vòng lặp getElementsByName('jsOnly')để thiết lập .style.display = "";bật lại các phần tử phụ thuộc JS. Theo cách đó, các trình duyệt không phải là JS không bao giờ phải nhìn thấy các phần phụ thuộc của trang web và nếu có, nó sẽ xuất hiện ngay lập tức khi nó sẵn sàng.

Khi bạn đã quen với phương pháp này, việc kết hợp mã của bạn để xử lý cả hai tình huống khá dễ dàng, mặc dù bây giờ tôi chỉ thử nghiệm với noscriptthẻ và hy vọng nó sẽ có một số lợi thế bổ sung.


10

Đây là cách sử dụng id giải pháp "sạch nhất":

<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

Một giải pháp phổ biến là gắn thẻ meta kết hợp với noscript để làm mới trang và thông báo cho máy chủ khi JavaScript bị vô hiệu hóa, như thế này:

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

Trong ví dụ trên khi JavaScript bị vô hiệu hóa, trình duyệt sẽ chuyển hướng đến trang chủ của trang web trong 0 giây. Ngoài ra, nó cũng sẽ gửi tham số javascript = false đến máy chủ.

Một tập lệnh phía máy chủ như node.js hoặc PHP sau đó có thể phân tích tham số và biết rằng JavaScript bị vô hiệu hóa. Sau đó, nó có thể gửi một phiên bản không phải JavaScript đặc biệt của trang web cho khách hàng.


8

Nếu javascript bị vô hiệu hóa mã phía máy khách của bạn sẽ không chạy, vì vậy tôi giả sử bạn có nghĩa là bạn muốn thông tin đó có sẵn phía máy chủ. Trong trường hợp đó, noscript là ít hữu ích. Thay vào đó, tôi có một đầu vào ẩn và sử dụng javascript để điền vào một giá trị. Sau yêu cầu tiếp theo hoặc gửi lại, nếu giá trị ở đó, bạn biết javascript được bật.

Hãy cẩn thận với những thứ như noscript, trong đó yêu cầu đầu tiên có thể hiển thị javascript bị vô hiệu hóa, nhưng các yêu cầu trong tương lai sẽ bật nó.


5

Chẳng hạn, bạn có thể sử dụng một cái gì đó như document.location = 'java_page.html' để chuyển hướng trình duyệt đến một trang mới, đầy kịch bản. Việc không chuyển hướng ngụ ý rằng JavaScript không khả dụng, trong trường hợp đó, bạn có thể sử dụng CGI ro để sử dụng hoặc chèn mã thích hợp giữa các thẻ. (LƯU Ý: NOSCRIPT chỉ khả dụng trong Netscape Navigator 3.0 trở lên.)

tín dụng http://www.intranetjournal.com/faqs/jsfaq/how12.html


4

Một kỹ thuật tôi đã sử dụng trước đây là sử dụng JavaScript để viết cookie phiên chỉ hoạt động như một cờ để nói rằng JavaScript được bật. Sau đó, mã phía máy chủ sẽ tìm cookie này và nếu không tìm thấy nó sẽ có hành động phù hợp. Tất nhiên kỹ thuật này không phụ thuộc vào cookie được kích hoạt!


4

Tôi nghĩ rằng bạn có thể chèn thẻ hình ảnh vào thẻ noscript và xem số liệu thống kê trang web của bạn bao nhiêu lần và tần suất hình ảnh này được tải.


4

Mọi người đã đăng các ví dụ là các tùy chọn tốt để phát hiện, nhưng dựa trên yêu cầu "đưa ra cảnh báo rằng trang web không thể hoạt động bình thường nếu không có trình duyệt kích hoạt JS". Về cơ bản, bạn thêm một yếu tố xuất hiện bằng cách nào đó trên trang, ví dụ: 'cửa sổ bật lên' trên Stack Overflow khi bạn kiếm được huy hiệu, với một thông báo phù hợp, sau đó xóa phần này bằng một số Javascript chạy ngay khi trang được tải ( và tôi có nghĩa là DOM, không phải toàn bộ trang).


3

Phát hiện nó trong cái gì? JavaScript? Điều đó là không thể. Nếu bạn chỉ muốn nó cho mục đích ghi nhật ký, bạn có thể sử dụng một số loại lược đồ theo dõi, trong đó mỗi trang có JavaScript sẽ đưa ra yêu cầu cho một tài nguyên đặc biệt (có thể là rất nhỏ gifhoặc tương tự). Bằng cách đó, bạn chỉ có thể nhận sự khác biệt giữa các yêu cầu và yêu cầu trang duy nhất cho tệp theo dõi của mình.


3

Tại sao bạn không đặt trình xử lý sự kiện onClick () bị tấn công sẽ chỉ kích hoạt khi bật JS và sử dụng thông tin này để nối một tham số (js = true) vào URL được nhấp / chọn (bạn cũng có thể phát hiện danh sách thả xuống và thay đổi giá trị- của việc thêm trường biểu mẫu ẩn). Vì vậy, bây giờ khi máy chủ nhìn thấy tham số này (js = true), nó biết rằng JS được bật và sau đó thực hiện phía máy chủ logic ưa thích của bạn.
Mặt trái của vấn đề này là lần đầu tiên người dùng đến trang web của bạn, đánh dấu trang, URL, công cụ tìm kiếm được tạo URL - bạn sẽ cần phải phát hiện ra rằng đây là người dùng mới vì vậy đừng tìm kiếm NVP được thêm vào URL, và máy chủ sẽ phải đợi lần nhấp tiếp theo để xác định người dùng được bật / tắt JS. Ngoài ra, một nhược điểm khác là URL sẽ kết thúc trên URL của trình duyệt và nếu người dùng này đánh dấu URL này, nó sẽ có js = true NVP, ngay cả khi người dùng không bật JS, mặc dù trong lần nhấp tiếp theo, máy chủ sẽ Hãy khôn ngoan để biết liệu người dùng vẫn kích hoạt JS hay không. Thở dài .. đây là niềm vui ...


3

Để buộc người dùng kích hoạt JavaScripts, tôi đặt thuộc tính 'href' của mỗi liên kết thành cùng một tài liệu, thông báo cho người dùng kích hoạt JavaScripts hoặc tải xuống Firefox (nếu họ không biết cách bật JavaScripts). Tôi đã lưu trữ url liên kết thực tế vào thuộc tính 'name' của các liên kết và xác định một sự kiện onclick toàn cầu đọc thuộc tính 'name' và chuyển hướng trang ở đó.

Điều này hoạt động tốt cho cơ sở người dùng của tôi, mặc dù một chút phát xít;).


và hơi khó chịu nếu người dùng đã bật JS và nhấp vào liên kết trước khi javascript tiến bộ của bạn bắt đầu ...
Simon_Weaver

1
Chắc chắn, nhưng không có vấn đề báo cáo nào.
Jan Sahin

3

Bạn không phát hiện xem người dùng đã tắt javascript (phía máy chủ hay máy khách). Thay vào đó, bạn cho rằng javascript bị vô hiệu hóa và xây dựng trang web của bạn với javascript bị vô hiệu hóa. Điều này làm giảm nhu cầu noscript, dù sao bạn cũng nên tránh sử dụng vì nó không hoạt động hoàn toàn đúng và không cần thiết.

Ví dụ: chỉ cần xây dựng trang web của bạn để nói <div id="nojs">This website doesn't work without JS</div>

Sau đó, tập lệnh của bạn sẽ đơn giản làm document.getElementById('nojs').style.display = 'none';và đi về doanh nghiệp JS bình thường của nó.


đây là một cách tiếp cận tuyệt vời, các thẻ <noscript> khó duy trì hơn trên các trang khác nhau với cách tiếp cận này, bạn có thể duy trì kiểu dáng noscript thông qua tệp css của mình.
zadubz

3

Kiểm tra cookie bằng giải pháp phía máy chủ thuần túy mà tôi đã giới thiệu ở đây, sau đó kiểm tra javascript bằng cách thả cookie bằng Jquery.Cookie và sau đó kiểm tra cookie theo cách này bạn kiểm tra cả cookie và javascript


3

Trong một số trường hợp, làm ngược lại có thể là đủ. Thêm một lớp bằng cách sử dụng javascript:

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

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

Điều này có thể tạo ra các vấn đề bảo trì trên bất cứ điều gì phức tạp, nhưng đó là một sửa chữa đơn giản cho một số thứ. Thay vì cố gắng phát hiện khi nó không được tải, chỉ cần tạo kiểu theo khi nó được tải.


3

Tôi muốn thêm giải pháp của mình để có được số liệu thống kê đáng tin cậy về số lượng người dùng thực truy cập trang web của tôi với javascript bị vô hiệu hóa trên tổng số người dùng. Việc kiểm tra chỉ được thực hiện một lần mỗi phiên với những lợi ích sau:

  • Người dùng truy cập 100 trang hoặc chỉ 1 trang được tính 1 mỗi. Điều này cho phép tập trung vào người dùng duy nhất, không phải trang.
  • Không phá vỡ dòng trang, cấu trúc hoặc ngữ nghĩa trong dù sao
  • Có thể đăng nhập tác nhân người dùng. Điều này cho phép loại trừ các bot khỏi các số liệu thống kê, chẳng hạn như google bot và bing bot thường bị vô hiệu hóa! Cũng có thể đăng nhập IP, thời gian vv ...
  • Chỉ cần một kiểm tra mỗi phiên (quá tải tối thiểu)

Mã của tôi sử dụng PHP, mysql và jquery với ajax nhưng có thể được điều chỉnh theo các ngôn ngữ khác:

Tạo một bảng trong DB của bạn như thế này:

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;

Thêm phần này vào mỗi trang sau khi sử dụng session_start () hoặc tương đương (yêu cầu jquery):

<?  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>
        <?
    }
?>

Tạo trang JSOK.php như thế này:

<?
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

Tôi đã tìm ra một cách tiếp cận khác bằng cách sử dụng css và javascript.
Đây chỉ là để bắt đầu mày mò với các lớp và id.

Đoạn mã CSS:
1. Tạo quy tắc ID css và đặt tên là #jsDis.
2. Sử dụng thuộc tính "nội dung" để tạo văn bản sau phần tử BODY. (Bạn có thể tạo kiểu này theo ý muốn).
3 Tạo quy tắc ID css thứ 2 và đặt tên là #jsEn và cách điệu nó. (vì mục đích đơn giản, tôi đã cung cấp cho quy tắc #jsEn của mình một màu nền khác.

<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>

Đoạn mã JavaScript:
1. Tạo một hàm.
2. Lấy ID BODY bằng getEuityById và gán nó cho một biến.
3. Sử dụng hàm JS 'setAttribution', thay đổi giá trị của thuộc tính ID của phần tử BODY.

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

Phần HTML.
1. Đặt tên thuộc tính phần tử BODY với ID của #jsDis.
2. Thêm sự kiện onLoad với tên hàm. (jsOn ()).

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

Do thẻ BODY đã được cấp ID của #jsDis:
- Nếu Javascript được bật, nó sẽ tự thay đổi thuộc tính của thẻ BODY.
- Nếu Javascript bị vô hiệu hóa, nó sẽ hiển thị văn bản quy tắc css 'content:'.

Bạn có thể chơi xung quanh với bộ chứa #wrapper hoặc với bất kỳ DIV nào sử dụng JS.

Hy vọng điều này sẽ giúp có được ý tưởng.


2

Thêm một làm mới trong meta bên trong noscript không phải là một ý tưởng tốt.

  1. Vì thẻ noscript không tuân thủ XHTML

  2. Giá trị thuộc tính "Làm mới" là không chuẩn, và không nên được sử dụng. "Làm mới" sẽ kiểm soát một trang khỏi người dùng. Sử dụng "Làm mới" sẽ gây ra lỗi trong Nguyên tắc truy cập nội dung web của W3C --- Tham khảo http://www.w3schools.com/TAGS/att_meta_http_equiv.asp .


Không ai nói gì về XHTML. <noscript> hoàn toàn hợp lệ HTML 4.01.
Tom

2
noscript cũng hoàn toàn hợp lệ trong XHTML 1.0 và XHTML 1.1. Nó không thể chứa các yếu tố meta và nên tránh sử dụng để tăng cường tiến bộ, nhưng nó là một phần của ngôn ngữ.
Quentin
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.