2010-02-23 21 views
5

रेलवे में जावास्क्रिप्ट सक्षम है या नहीं, तो आप कैसे जांचेंगे? ताकि मैं विचारों में ऐसा कुछ कर सकूं:जांचें कि क्या जावास्क्रिप्ट सक्षम है (Serverside) रेल

<div> 
    <% if javascript_enabled? %> 
    <p>Javascript Enabled!</p> 
    <%- else -%> 
    <p>No Javascript</p> 
    <%- end -%> 
</div> 
+3

क्या आपका मतलब है कि आपका सर्वर जावास्क्रिप्ट चला सकता है? यदि नहीं, तो आप बस नहीं कर सकते हैं। – shinkou

+0

आप सर्वर की तरफ नहीं जा सकते हैं, लेकिन यहां एक सरल रेल समाधान है: [रेल जावास्क्रिप्ट पहचान पर रूबी] (http://stackoverflow.com/questions/745613/ruby-on-rails-javascript-detection) – Yarin

उत्तर

5

आप यह पता लगा सकते हैं, लेकिन यह नहीं है सुंदर।

class JavascriptController < ApplicationController 
    def confirm 
    session[:javascript_updated] = Time.now 
    end 
end 

इसके बाद आप अपने सभी पृष्ठों तो यह नियंत्रक कार्रवाई प्रत्येक पृष्ठ पर कहा जाता है में एक जावास्क्रिप्ट कार्रवाई शामिल करने की जरूरत:

सबसे पहले, आप एक एक्शन उस सत्र में एक समय समाप्ति अद्यतन करता है के साथ एक नया नियंत्रक की जरूरत है भार। सबसे आसान तरीका यह है कि इसे अपने "लेआउट में शामिल" जावास्क्रिप्ट-पुष्टिकरण "फ़ाइल पर शामिल किया जाए (इस विशेष उदाहरण पर मैंने प्रोटोटाइप के अजाक्स.रूक्वेस्ट का इस्तेमाल किया था, इसलिए आपको इसे अपनी जावास्क्रिप्ट पर भी शामिल करना होगा):

function confirmJavascript() 
{ 
    // Assuming you are using Prototype 
    new Ajax.Request('/JavascriptController/confirm'); 
} 

myTimeoutFunction(); 
setInterval(myTimeoutFunction, 10000); // invoke each 10 seconds 

यह आपके सभी पृष्ठ दृश्यों में पुष्टि कार्रवाई का आह्वान करेगा। अंत में, आपको यह नियंत्रित करना होगा कि आपके एप्लिकेशन नियंत्रक में आपकी अंतिम पुष्टि के बाद से कितना समय बीत चुका है।

class ApplicationController < ActionController::Base 

JAVASCRIPT_TIME_LIMIT = 10.seconds 

before_filter :prepare_javascript_test 

private 
def prepare_javascript_test 
    if (session[:javascript_updated].blank? or 
    Time.now - session[:javascript_updated] > ApplicationController::JAVASCRIPT_TIME_LIMIT) 
    @javascript_active = true 
    else 
    @javascript_active = false 
    end 
end 

end 

अब आप एक चर अपने सभी नियंत्रकों में @javascript_active बुलाया जाएगा।

यह तब भी काम करना चाहिए जब उपयोगकर्ता 10 सेकंड की सटीकता के साथ जावास्क्रिप्ट को सक्रिय/निष्क्रिय करता है।यह तब काम नहीं कर सकता है जब आपके कुछ पेज लोड होने के लिए 10 पृष्ठों से अधिक समय लेते हैं (यानी बहुत सारी छवियों के साथ)। उस मामले में समय सीमा बढ़ाएं (एप्लिकेशन नियंत्रक और आपकी जावास्क्रिप्ट पर)

अस्वीकरण: मैंने इस कोड का परीक्षण नहीं किया है, कुछ कीड़े छिपी हो सकती हैं - लेकिन यह आपको सही दिशा में इंगित करनी चाहिए।

0

प्रतिक्रिया के प्रतिपादन के दौरान यह संभव नहीं है। कम या अधिक भरोसेमंद यह समझने का एकमात्र तरीका क्लाइंट को पिछले अनुरोधों में से पहले में एक अजाजक अनुरोध भेजना है। इस अजीब अनुरोध को सर्वर साइड सत्र में कुछ टोकन सेट करना चाहिए जो यह पहचानता है कि क्लाइंट ने पहले से ही एक अजाजक अनुरोध भेजा है (जो इस प्रकार साबित करता है कि क्लाइंट जेएस सक्षम है)। लेकिन इसमें इस संभावना को शामिल नहीं किया गया है कि क्लाइंट सत्र के दौरान इस दौरान जेएस को अक्षम कर सकता है। या आपको प्रत्येक प्रतिक्रिया के बाद टाइमस्टैम्प और अजाजक अनुरोध एकत्र करने में परेशानी होनी चाहिए। वास्तव में ऐसा कुछ नहीं है जिसे आप करना चाहते हैं।

इसके बजाय दोनों सामग्री प्रस्तुत करें और <noscript> और <script> टैग का उपयोग एक या दूसरे को टॉगल करने के लिए करें। कई उदाहरणों के लिए यहां मेरा उत्तर भी देखें: opposite of <noscript>

0

तुम कुछ प्रकार hacky इस तरह के कर सकता है, लेकिन अपने "जावास्क्रिप्ट सक्षम" HTML सहायक

अपने application_helper.rb में इस रखो

def javascript_enabled? 
    content_tag(:div, [ 
    content_tag(:script, 'document.write("Javascript Enabled")'), 
    content_tag(:noscript, 'No Javascript') 
    ]) 
end 

यह हो जाता है के भीतर उत्पन्न करने की आवश्यकता होगी आपके विचार में:

<%= javascript_enabled? %> 
1

आप सर्वर-पक्ष पर इसका पता नहीं लगा सकते हैं। दरअसल, आपके पृष्ठ तक पहुंचने पर पहली बार स्क्रिप्टिंग बंद हो सकती है, फिर ब्राउजर सेटिंग्स बदल दी जाती हैं और बिना किसी नए HTTP अनुरोध के पुन: नेविगेट की जाती है। कैशिंग मुद्दों और स्थानों के सभी प्रकारों का उल्लेख नहीं करना जहां स्क्रिप्टिंग तकनीकी रूप से 'सक्षम' हो सकती है लेकिन विवाद, बग या 'सुरक्षा' उपकरण रास्ते में आने के कारण काम नहीं कर रही हैं।

तो आपको क्लाइंट साइड पर स्क्रिप्ट/बिना स्क्रिप्ट के लिए सामग्री के बारे में सभी निर्णय लेने की आवश्यकता है। इन दिनों पसंदीदा तरीका आम तौर पर 'प्रगतिशील वृद्धि' होगा: पृष्ठ पर मूल HTML संस्करण शामिल हैं, और फिर JavaScript की जगह/इसे अपग्रेड किया है जहां यह कर सकते हैं:

<div id="isitjs"> 
    <p>Backup content for no JavaScript</p> 
</div> 
<script type="text/javascript"> 
    document.getElementById('isitjs').innerHTML= '<p>Sparkly script-enhanced content!<\/p>'; 
    // or DOM methods, as you prefer 
</script> 
0

यदि जावास्क्रिप्ट सक्षम है तो आप सर्वर की तरफ से जांच नहीं सकते हैं, हालांकि, आप साइट से पहले एक पेज सेट अप कर सकते हैं, और जावास्क्रिप्ट सक्षम होने पर संकेत देने वाले पैरामीटर के साथ अपने एप्लिकेशन पर रीडायरेक्ट कर सकते हैं। अगर नहीं तो हैडर मेटा टैग काम करेंगे,

<html> 
<head> 
    <meta HTTP-EQUIV="REFRESH" content="2; url=./Login.action?javascriptEnabled=false"> 
    <link rel="icon" href="favicon.ico" type="image/x-icon"/> 
    <link rel="shortcut icon" href="favicon.ico" type="image/x-icon"/> 
    <title></title> 
</head> 
<body onload="window.location.href='./Login.action?javascriptEnabled=true'" ></body> 
</html> 

तो, अगर जावास्क्रिप्ट सक्षम ऑनलोड रीडायरेक्ट काम करेगा: नीचे नमूना कोड देखें। यह चाल मेटा टैग रीडायरेक्ट पर 1-2 सेकंड देरी डालना है, इसलिए यदि जावास्क्रिप्ट रीडायरेक्ट रीडायरेक्ट नहीं होगा, तो मेटा टैग यह इंगित करेगा कि कोई जावास्क्रिप्ट सक्षम नहीं है।

+0

कोड नहीं है दिखाई। – sscirrus

+0

कोड को दृश्यमान बनाने के लिए संपादित किया गया। – jrdioko

5

हैं कि सभी आप इसे क्या करना चाहते है, यह ध्यान में रखते हुए गैर जे एस संस्करण डाल करने के लिए सबसे अच्छा हो सकता है:

<p class="replace_by_js">No Javascript</p> 

और फिर जावास्क्रिप्ट को प्रतिस्थापित किया है: (मैं jQuery का उपयोग करें)

$('p.replace_by_js').replaceWith("<p>Javascript Enabled!</p>") 

यह दृष्टिकोण व्यावहारिक रूप से किसी भी प्रगतिशील वृद्धि के लिए उपयोग करने योग्य होना चाहिए जिसे आप जोड़ना चाहते हैं।

2
इसके बजाय अपने जावास्क्रिप्ट सक्षम है या नहीं की जाँच करने के कोड के बहुत सारे लेखन के

, तो आप बस के रूप में अपने पेज लेआउट

%p.javascript_require 
    No javascript, please enable JavaScript 

में (Haml का प्रयोग करके) लिख सकते हैं और अपने जावास्क्रिप्ट इस पैरा छिपाने का उपयोग कर छिपाने कर सकते हैं() फ़ंक्शन के रूप में -

$(".javascript_require").hide(); 

यदि जावास्क्रिप्ट अक्षम है तो आप जो भी कार्य करना चाहते हैं, वह करें।