سؤال

كيف يمكنك التحقق مما إذا تم تمكين JavaScript في Rails؟ حتى أتمكن من فعل شيء مثل هذا في الآراء:

<div>
    <% if javascript_enabled? %>
    <p>Javascript Enabled!</p>
    <%- else -%>
    <p>No Javascript</p>
    <%- end -%>
</div>
هل كانت مفيدة؟

المحلول

يمكنك اكتشافه ، لكنه ليس جميلًا.

أولاً ، تحتاج إلى وحدة تحكم جديدة مع إجراء يقوم بتحديث مهلة في الجلسة:

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

بعد ذلك ، تحتاج إلى تضمين إجراء JavaScript في جميع صفحاتك بحيث يتم استدعاء إجراء وحدة التحكم هذه في كل تحميل صفحة. أسهل طريقة هي تضمينه على ملف "javaScript-confirm.js" المدرج في تخطيطك (على هذا المثال بالذات ، استخدمت Ajax.request من النموذج الأولي ، لذلك تحتاج إلى تضمينه على Javascripts ، أيضًا):

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 في جميع وحدات التحكم الخاصة بك.

يجب أن يعمل حتى عندما يقوم المستخدم بتنشيط/إلغاء تنشيط JavaScript ، بدقة 10 ثوان. قد لا تعمل إذا كانت بعض صفحاتك تستغرق أطول من 10 صفحات لتحميلها (أي مع الكثير من الصور). قم بزيادة المهلة الزمنية في هذه الحالة (على ApplicationController و JavaScript)

إخلاء المسئولية: لم أختبر هذا الرمز ، فقد تكون بعض الأخطاء تكمن - لكن يجب أن توجهك إلى الاتجاه الصحيح.

نصائح أخرى

اذا كان هذا الكل تريد أن تفعل ذلك ، قد يكون من الأفضل وضع إصدار غير JS في العرض:

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

ثم اجعل JavaScript استبدل ذلك: (أنا أستخدم jQuery)

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

يجب أن يكون هذا النهج قابلاً للاستخدام في أي تعزيز تدريجي تريد إضافته.

بدلاً من كتابة الكثير من التعليمات البرمجية للتحقق مما إذا كان JavaScript الخاص بك قد تم تمكينه أم لا ، يمكنك ببساطة الكتابة (باستخدام Haml) في تخطيط صفحتك-

%p.javascript_require
  No javascript, please enable JavaScript

وجعل JavaScript تخفي هذه الفقرة باستخدام وظيفة Hide () كـ -

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

افعل أي وظيفة تريد القيام بها عندما تم تعطيل JavaScript.

هذا غير ممكن أثناء تقديم الاستجابة. الطريقة الوحيدة لمعرفة أن أقل أو أكثر موثوقية هي السماح للعميل بإرسال طلب Ajaxical مسبقًا في أحد الطلبات السابقة. يجب أن يضع هذا الطلب Ajaxical بعد ذلك بعض الرمز المميز في الجلسة الجانبية للخادم والذي يحدد أن العميل قد أرسل طلبًا من Ajaxical مسبقًا (والذي يثبت بالتالي أن العميل قد تم تمكين JS). لكن هذا لا يغطي احتمال أن يتمكن العميل من تعطيل JS في الوقت نفسه خلال الجلسة. أو يجب عليك متاعب بجمع الطوابع الزمنية والطلبات Ajaxical بعد كل استجابة. ليس شيئًا تريد فعله حقًا.

بدلاً من ذلك ، قم بإعداد كلا المحتويات والاستفادة من <noscript> و <script> علامات لتبديل واحد أو آخر. انظر أيضًا إجابتي هنا لعدة أمثلة: عكس <noscript>.

لا يمكنك اكتشافه على جانب الخادم. في الواقع ، قد يتم إيقاف تشغيل البرمجة النصية في المرة الأولى التي يتم فيها الوصول إلى صفحتك ، ثم تغيرت إعدادات المتصفح وإعادة تقديمها دون تقديم طلب HTTP جديد. ناهيك عن جميع أنواع قضايا التخزين المؤقت والأماكن التي قد يتم فيها "تمكين" البرمجة النصية تقنيًا ولكن لا تعمل بسبب الصراعات أو الأخطاء أو الأدوات "الأمنية" التي تعترض الطريق.

لذلك تحتاج إلى القيام بجميع القرارات المتعلقة بالمحتوى مع Script/بدون صرف على جانب العميل. في هذه الأيام ، ستكون الطريقة المفضلة "تعزيزًا تدريجيًا" بشكل عام: قم بتضمين إصدار 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>

يمكنك القيام بشيء من الاختراق مثل هذا ، ولكن يجب إنشاء HTML "JavaScript" الخاص بك

ضع هذا في Application_Helper.rb

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

هذا ينطبق على وجهة نظرك:

<%= javascript_enabled? %>

لا يمكنك التحقق من جانب الخادم إذا تم تمكين JavaScript ، ومع ذلك ، يمكنك إعداد صفحة قبل الموقع ، والسماح بإعادة توجيه إلى تطبيقك مع معلمة تشير إلى ما إذا كان JavaScript قد تم تمكينه. انظر نموذج رمز أدناه:

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

لذلك ، إذا تم تمكين JavaScript ، فستعمل إعادة توجيه Onload ، إن لم يكن ، فسيعمل علامة Meta Taga. الحيلة هي وضع تأخير 1-2 ثاني على إعادة توجيه علامة التعريف ، لذلك إذا لم يتم إعادة توجيه JavaScript ، فإن علامة التعريف ستشير إلى عدم تمكين JavaScript.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top