سؤال

هل هناك طريقة سريعة لتعيين إدخال نص HTML (<input type=text />) للسماح فقط بضغطات المفاتيح الرقمية (بالإضافة إلى '.')؟

هل كانت مفيدة؟

المحلول

ملحوظة: هذه إجابة محدثة.تشير التعليقات أدناه إلى إصدار قديم عبث برموز المفاتيح.

جافا سكريبت

ال setInputFilter الوظيفة أدناه تسمح لك باستخدام أي نوع مرشح الإدخال على النص <input>, ، بما في ذلك المرشحات الرقمية المختلفة (انظر أدناه).

على عكس معظم الحلول الأخرى، هذا يدعم بشكل صحيح نسخ+لصق، سحب+إسقاط، جميع اختصارات لوحة المفاتيح، جميع عمليات قائمة السياق، جميع المفاتيح غير القابلة للكتابة (على سبيل المثال.المؤشر ومفاتيح التنقل)، وموضع علامة الإقحام، وجميع تخطيطات لوحة المفاتيح بجميع اللغات والأنظمة الأساسية، و جميع المتصفحات منذ IE 9.

جربها بنفسك على JSFiddle.

// Restricts input for the given textbox to the given inputFilter.
function setInputFilter(textbox, inputFilter) {
  ["input", "keydown", "keyup", "mousedown", "mouseup", "select", "contextmenu", "drop"].forEach(function(event) {
    textbox.addEventListener(event, function() {
      if (inputFilter(this.value)) {
        this.oldValue = this.value;
        this.oldSelectionStart = this.selectionStart;
        this.oldSelectionEnd = this.selectionEnd;
      } else if (this.hasOwnProperty("oldValue")) {
        this.value = this.oldValue;
        this.setSelectionRange(this.oldSelectionStart, this.oldSelectionEnd);
      }
    });
  });
}

// Restrict input to digits and '.' by using a regular expression filter.
setInputFilter(document.getElementById("myTextBox"), function(value) {
  return /^\d*\.?\d*$/.test(value);
});

بعض مرشحات الإدخال التي قد ترغب في استخدامها:

  • عدد صحيح القيم (إيجابية فقط):
    /^\d*$/.test(value)
  • عدد صحيح القيم (إيجابية وتصل إلى حد معين):
    /^\d*$/.test(value) && (value === "" || parseInt(value) <= 500)
  • عدد صحيح القيم (الإيجابية والسلبية):
    /^-?\d*$/.test(value)
  • النقطة العائمة القيم (السماح لكلا . و , كفاصل عشري):
    /^-?\d*[.,]?\d*$/.test(value)
  • عملة القيم (أيمنزلتين عشريتين على الأكثر):
    /^-?\d*[.,]?\d{0,2}$/.test(value)
  • من الألف إلى الياء فقط (أيالحروف اللاتينية الأساسية):
    /^[a-z]*$/i.test(value)
  • حروف لاتينية فقط (أيالإنجليزية ومعظم اللغات الأوروبية، انظر https://unicode-table.com للحصول على تفاصيل حول نطاقات أحرف Unicode):
    /^[a-z\u00c0-\u024f]*$/i.test(value)
  • السداسي عشري قيم:
    /^[0-9a-f]*$/i.test(value)

لاحظ أنك لا تزال يجب القيام بالتحقق من جانب الخادم!

مسج

هناك أيضًا نسخة jQuery من هذا.يرى هذه الإجابة أو جربه بنفسك على JSFiddle.

أتش تي أم أل 5

يحتوي HTML 5 على حل أصلي مع <input type="number"> (انظر تخصيص)، ولكن لاحظ أن دعم المتصفح يختلف:

  • لن تتحقق معظم المتصفحات من صحة الإدخال إلا عند إرسال النموذج، وليس عند الكتابة.
  • معظم متصفحات الجوال لا تدعم step, min و max صفات.
  • لا يزال Chrome (الإصدار 71.0.3578.98) يسمح للمستخدم بإدخال الأحرف e و E في الميدان.انظر أيضا هذا السؤال.
  • لا يزال Firefox (الإصدار 64.0) وEdge (EdgeHTML الإصدار 17.17134) يسمحان للمستخدم بالدخول أي النص في الميدان.

جربها بنفسك على w3schools.com.

نصائح أخرى

استخدم هذا DOM

<input type='text' onkeypress='validate(event)' />

وهذا السيناريو

function validate(evt) {
  var theEvent = evt || window.event;

  // Handle paste
  if (theEvent.type === 'paste') {
      key = event.clipboardData.getData('text/plain');
  } else {
  // Handle key press
      var key = theEvent.keyCode || theEvent.which;
      key = String.fromCharCode(key);
  }
  var regex = /[0-9]|\./;
  if( !regex.test(key) ) {
    theEvent.returnValue = false;
    if(theEvent.preventDefault) theEvent.preventDefault();
  }
}

ولقد بحثت طويلا وشاقا للحصول على إجابة جيدة لهذا، ونحن في حاجة ماسة <input type="number"، ولكن أقل من ذلك، فإن هذه 2 هي أكثر الطرق موجزة أتمكن من الخروج مع:

<input type="text" 
       onkeyup="this.value=this.value.replace(/[^\d]/,'')">

إذا تكرهوا الطابع غير المقبول تظهر للمرة الثانية انقسام قبل أن يتم محوها، فإن هذه الطريقة دون حل بي. لاحظ شروط إضافية عديدة، هذا هو لتجنب تعطيل كافة أنواع الملاحة ومفاتيح الاختصار. إذا كان أي شخص يعرف كيف compactify هذا، اسمحوا لنا أن نعرف!

<input type="text" 
onkeydown="return ( event.ctrlKey || event.altKey 
                    || (47<event.keyCode && event.keyCode<58 && event.shiftKey==false) 
                    || (95<event.keyCode && event.keyCode<106)
                    || (event.keyCode==8) || (event.keyCode==9) 
                    || (event.keyCode>34 && event.keyCode<40) 
                    || (event.keyCode==46) )">

وهنا هو واحد بسيط الذي يسمح للعشري واحد بالضبط، ولكن لا أكثر من ذلك:

<input type="text" oninput="this.value = this.value.replace(/[^0-9.]/g, '').replace(/(\..*)\./g, '$1');" />

ومثال آخر، والذي يعمل كبيرة بالنسبة لي:

function validateNumber(event) {
    var key = window.event ? event.keyCode : event.which;
    if (event.keyCode === 8 || event.keyCode === 46) {
        return true;
    } else if ( key < 48 || key > 57 ) {
        return false;
    } else {
        return true;
    }
};

ونعلق أيضا لهذا الحدث بضغطة

$(document).ready(function(){
    $('[id^=edit]').keypress(validateNumber);
});

وHTML:

<input type="input" id="edit1" value="0" size="5" maxlength="5" />

هنا هو مثال jsFiddle

وHTML5 و<input type=number>، الذي يبدو صحيحا بالنسبة لك. حاليا، أوبرا فقط يعتمد عليه أصلا، ولكن هناك href="http://code.google.com/p/webforms2/" مشروع التي تحتوي على تنفيذ جافا سكريبت.

تعاني معظم الإجابات هنا من ضعف في استخدام الأحداث الرئيسية.

قد تحد العديد من الإجابات من قدرتك على تحديد النص باستخدام وحدات ماكرو لوحة المفاتيح، والنسخ واللصق والمزيد من السلوك غير المرغوب فيه، ويبدو أن البعض الآخر يعتمد على مكونات إضافية معينة من jQuery، والتي تقتل الذباب باستخدام المدافع الرشاشة.

يبدو أن هذا الحل البسيط يعمل بشكل أفضل بالنسبة لي عبر الأنظمة الأساسية، بغض النظر عن آلية الإدخال (ضغط المفاتيح، النسخ + اللصق، النقر بزر الماوس الأيمن + النسخ واللصق، تحويل الكلام إلى نص وما إلى ذلك).ستظل جميع وحدات ماكرو لوحة المفاتيح الخاصة باختيار النص تعمل، بل إنها قد تحد من قدرة الشخص على تعيين قيمة غير رقمية بواسطة البرنامج النصي.

function forceNumeric(){
    this.value(this.value.replace(/[^\d]+/g,''));
}
$('body').on('propertychange input', 'input.numeric-text', forceNumeric);

وأنا اختار لاستخدام مزيج من اثنين من الإجابات المذكورة هنا أي بمعنى.

و<input type="number" />

و

function isNumberKey(evt){
    var charCode = (evt.which) ? evt.which : evt.keyCode
    return !(charCode > 31 && (charCode < 48 || charCode > 57));
}

و<input type="text" onkeypress="return isNumberKey(event);">

وHTML5 يدعم regexes، لذلك يمكن استخدام هذا:

<input id="numbersOnly" pattern="[0-9.]+" type="text">

تحذير: بعض المتصفحات لا تدعم هذا حتى الآن

وجافا سكريبت

function validateNumber(evt) {
    var e = evt || window.event;
    var key = e.keyCode || e.which;

    if (!e.shiftKey && !e.altKey && !e.ctrlKey &&
    // numbers   
    key >= 48 && key <= 57 ||
    // Numeric keypad
    key >= 96 && key <= 105 ||
    // Backspace and Tab and Enter
    key == 8 || key == 9 || key == 13 ||
    // Home and End
    key == 35 || key == 36 ||
    // left and right arrows
    key == 37 || key == 39 ||
    // Del and Ins
    key == 46 || key == 45) {
        // input is VALID
    }
    else {
        // input is INVALID
        e.returnValue = false;
        if (e.preventDefault) e.preventDefault();
    }
}

والإضافية التي يمكن إضافة فاصلة الفترة وناقص (، .-)

  // comma, period and minus, . on keypad
  key == 190 || key == 188 || key == 109 || key == 110 ||

وHTML

<input type="text" onkeydown="validateNumber(event);"/ >

و2 الحلول:

واستخدام مدقق النموذج (على سبيل المثال مع التحقق من صحة مسج المساعد )

هل شيك خلال و onblur (أي عندما يترك المستخدم الميدان) حالة حقل الإدخال، مع التعبير العادي:

<script type="text/javascript">
function testField(field) {
    var regExpr = new RegExp("^\d*\.?\d*$");
    if (!regExpr.test(field.value)) {
      // Case of error
      field.value = "";
    }
}

</script>

<input type="text" ... onblur="testField(this);"/>

بسيط جدا....

// في وظيفة JavaScript (يمكن استخدام HTML أو PHP).

function isNumberKey(evt){
    var charCode = (evt.which) ? evt.which : evt.keyCode;
    if (charCode > 31 && (charCode < 48 || charCode > 57))
        return false;
    return true;
}

في إدخال النموذج الخاص بك:

<input type=text name=form_number size=20 maxlength=12 onkeypress='return isNumberKey(event)'>

مع الحد الأقصى للإدخال.(هذه المذكورة أعلاه تسمح برقم مكون من 12 رقمًا)

والنهج الأسلم هو التحقق من قيمة المدخلات، بدلا من الضغط على المفاتيح اختطاف ومحاولة لتصفية كيكوديس.

وهذه الطريقة للمستخدم الحرية في استخدام لوحة المفاتيح السهام، مفاتيح التعديل، مسافة للخلف، حذف، استخدم keyboars غير القياسية، واستخدام الماوس للصق، واستخدام السحب والإسقاط النص، حتى استخدام المدخلات للمعاقين.

والبرنامج النصي أدناه يسمح الأرقام الإيجابية والسلبية

1
10
100.0
100.01
-1
-1.0
-10.00
1.0.0 //not allowed

var input = document.getElementById('number');
input.onkeyup = input.onchange = enforceFloat;

//enforce that only a float can be inputed
function enforceFloat() {
  var valid = /^\-?\d+\.\d*$|^\-?[\d]*$/;
  var number = /\-\d+\.\d*|\-[\d]*|[\d]+\.[\d]*|[\d]+/;
  if (!valid.test(this.value)) {
    var n = this.value.match(number);
    this.value = n ? n[0] : '';
  }
}
<input id="number" value="-3.1415" placeholder="Type a number" autofocus>

وتحرير: أزلت جوابي القديمة لأنني أعتقد أن العتيقة الآن

يرجى العثور على الحل المذكور أدناه.في هذا المستخدم يمكن أن تكون قادرة على الدخول فقط numeric القيمة، كما لا يمكن للمستخدم أن يكون قادرا على ذلك copy, paste, drag و drop في الإدخال.

الشخصيات المسموح بها

0,1,2,3,4,5,6,7,8,9

الشخصيات والشخصيات غير مسموح بها من خلال الأحداث

  • القيمة الأبجدية
  • شخصيات خاصة
  • ينسخ
  • معجون
  • يجر
  • يسقط

$(document).ready(function() {
  $('#number').bind("cut copy paste drag drop", function(e) {
      e.preventDefault();
  });     
});
function isNumberKey(evt) {
    var charCode = (evt.which) ? evt.which : evt.keyCode;
    if (charCode > 31 && (charCode < 48 || charCode > 57))
        return false;
    return true;
}
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet"/>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<input type="text" class="form-control" name="number" id="number" onkeypress="return isNumberKey(event)" placeholder="Enter Numeric value only">

اسمحوا لي أن أعرف إذا كان لا يعمل.

ويمكنك استخدام نمط لهذا:

<input id="numbers" pattern="[0-9.]+" type="number">

هنا يمكنك ان ترى كاملة النقالة نصائح واجهة الموقع .

إذا كنت تريد أن يقترح على الجهاز (ربما الهاتف المحمول) بين ألفا أو رقمية يمكنك استخدام <input type="number">.

ووتنفيذ قصيرة وحلوة باستخدام مسج واستبدال () بدلا من النظر إلى event.keyCode أو event.which:

$('input.numeric').live('keyup', function(e) {
  $(this).val($(this).val().replace(/[^0-9]/g, ''));
});

وفقط الآثار الجانبية الصغيرة التي يظهر الحرف كتبته حظات وCTRL / CMD + A يبدو أن تتصرف غريبة بعض الشيء.

وشفرة جافا سكريبت:

function validate(evt)
{
    if(evt.keyCode!=8)
    {
        var theEvent = evt || window.event;
        var key = theEvent.keyCode || theEvent.which;
        key = String.fromCharCode(key);
        var regex = /[0-9]|\./;
        if (!regex.test(key))
        {
            theEvent.returnValue = false;

            if (theEvent.preventDefault)
                theEvent.preventDefault();
            }
        }
    }

كود HTML:

<input type='text' name='price' value='0' onkeypress='validate(event)'/>

ويعمل تماما لأن الرمز الرئيسي للمسافة للخلف هو 8 والتعبير رجإكس لا ندعه، حتى انها وسيلة سهلة لتجاوز الأخطاء:)

وفقط على البديل الآخر مع مسج باستخدام

$(".numeric").keypress(function() {
    return (/\d/.test(String.fromCharCode(event.which) ))
});

وinput type="number" هو سمة HTML5.

في حالة أخرى هذا يساعدك على:

function isNumberKey(evt){
    var charCode = (evt.which) ? evt.which : evt.keyCode
    if (charCode > 31 && (charCode < 48 || charCode > 57))
        return false;
    return true;
}

<input type="number" name="somecode" onkeypress="return isNumberKey(event)"/>

مثال آخر حيث أنت يستطيع إضافة أرقام فقط في حقل الإدخال، لا تستطيع حروف

<input type="text" class="form-control" id="phone" name="phone" placeholder="PHONE" spellcheck="false" oninput="this.value = this.value.replace(/[^0-9.]/g, '').replace(/(\..*)\./g, '$1');">

مجرد استخدام اكتب = "رقم" الآن يتم دعم هذه السمة في معظم المتصفحات

<input type="number" maxlength="3" ng-bind="first">

ويمكنك أيضا مقارنة قيمة الإدخال (التي تعامل على أنها سلسلة افتراضيا) لنفسها مضطرة أنه الرقمية، مثل:

if(event.target.value == event.target.value * 1) {
    // returns true if input value is numeric string
}

ومع ذلك، تحتاج إلى ربط ذلك لحدث مثل keyup الخ.

<input name="amount" type="text" value="Only number in here"/> 

<script>
    $('input[name=amount]').keyup(function(){
        $(this).val($(this).val().replace(/[^\d]/,''));
    });
</script>

استخدم هذا DOM:

<input type = "text" onkeydown = "validate(event)"/>

وهذا البرنامج النصي:

validate = function(evt)
{
    if ([8, 46, 37, 39, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 35, 36].indexOf(evt.keyCode || evt.which) == -1)
    {
        evt.returnValue = false;
        if(evt.preventDefault){evt.preventDefault();}
    }
}

...أو هذا البرنامج النصي، بدون فهرس، باستخدام اثنين for'س...

validate = function(evt)
{
    var CharValidate = new Array("08", "046", "039", "948", "235");
    var number_pressed = false;
    for (i = 0; i < 5; i++)
    {
        for (Ncount = 0; Ncount < parseInt(CharValidate[i].substring(0, 1)) + 1; Ncount++)
        {
            if ((evt.keyCode || evt.which) == parseInt(CharValidate[i].substring(1, CharValidate[i].lenght)) + Ncount)
            {
                number_pressed = true;
            }
        }
    }
    if (number_pressed == false)
    {
        evt.returnValue = false;
        if(evt.preventDefault){evt.preventDefault();}
    }
}

لقد استخدمت سمة onkeydown بدلاً من onkeypress، لأنه تم تحديد سمة onkeydown قبل سمة onkeypress.ستكون المشكلة في متصفح Google Chrome.

باستخدام السمة "onkeypress"، لن يكون من الممكن التحكم في TAB باستخدام "preventDefault" في Google Chrome، ومع ذلك، باستخدام السمة "onkeydown"، يصبح TAB قابلاً للتحكم!

رمز ASCII لـ TAB => 9

يحتوي البرنامج النصي الأول على رمز أقل من البرنامج الثاني، ومع ذلك، يجب أن تحتوي مجموعة أحرف ASCII على جميع المفاتيح.

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




العدد = 0

48 + عدد = 48

عدد + +

48 + عدد = 49

عدد + +

...

48 + عدد = 57




في حالة المفاتيح الرقمية هي 10 فقط (0 - 9)، ولكن إذا كانت 1 مليون فلن يكون من المنطقي إنشاء مصفوفة بكل هذه المفاتيح.

رموز أسكي:

  • 8 ==> (مسافة للخلف)؛
  • 46 => (حذف)؛
  • 37 => (السهم الأيسر)؛
  • 39 => (السهم الأيمن)؛
  • 48 - 57 => (أرقام)؛
  • 36 => (المنزل);
  • 35 => (النهاية);

وهذا هو تحسين وظيفة:

function validateNumber(evt) {
  var theEvent = evt || window.event;
  var key = theEvent.keyCode || theEvent.which;
  if ((key < 48 || key > 57) && !(key == 8 || key == 9 || key == 13 || key == 37 || key == 39 || key == 46) ){
    theEvent.returnValue = false;
    if (theEvent.preventDefault) theEvent.preventDefault();
  }
}

وأفضل طريقة (السماح ALL النوع من الأرقام - الحقيقي السلبي، حقيقي موجب، عدد صحيح سلبية، صحيح موجب) هو:

$(input).keypress(function (evt){
    var theEvent = evt || window.event;
    var key = theEvent.keyCode || theEvent.which;
    key = String.fromCharCode( key );
    var regex = /[-\d\.]/; // dowolna liczba (+- ,.) :)
    var objRegex = /^-?\d*[\.]?\d*$/;
    var val = $(evt.target).val();
    if(!regex.test(key) || !objRegex.test(val+key) || 
            !theEvent.keyCode == 46 || !theEvent.keyCode == 8) {
        theEvent.returnValue = false;
        if(theEvent.preventDefault) theEvent.preventDefault();
    };
}); 

وهذا هو نسخة موسعة من geowa4 في حل . يدعم min وmax الصفات. إذا كان الرقم خارج النطاق، سيتم عرض القيمة السابقة.

يمكنك اختبار ذلك هنا.

والاستخدام: <input type=text class='number' maxlength=3 min=1 max=500>

function number(e) {
var theEvent = e || window.event;
var key = theEvent.keyCode || theEvent.which;
if(key!=13&&key!=9){//allow enter and tab
  key = String.fromCharCode( key );
  var regex = /[0-9]|\./;
  if( !regex.test(key)) {
    theEvent.returnValue = false;
    if(theEvent.preventDefault) theEvent.preventDefault();
    }   
  }
}

$(document).ready(function(){
    $("input[type=text]").filter(".number,.NUMBER").on({
        "focus":function(e){
         $(e.target).data('oldValue',$(e.target).val());
            },
        "keypress":function(e){
                e.target.oldvalue = e.target.value;
                number(e);
            },
        "change":function(e){
            var t = e.target;
            var min = $(t).attr("min");
            var max = $(t).attr("max");
            var val = parseInt($(t).val(),10);          
            if( val<min || max<val)
                {
                    alert("Error!");
                    $(t).val($(t).data('oldValue'));
                }

            }       
    });     
});

إذا المدخلات هي استخدام دينامية هذا:

$(document).ready(function(){
    $("body").on("focus","input[type=text].number,.NUMBER",function(e){
        $(e.target).data('oldValue',$(e.target).val());
    }); 
    $("body").on("keypress","input[type=text].number,.NUMBER",function(e){
        e.target.oldvalue = e.target.value;
        number(e);
    }); 
    $("body").on("change","input[type=text].number,.NUMBER",function(e){
        var t = e.target
        var min = $(t).attr("min");
        var max = $(t).attr("max");
        var val = parseInt($(t).val());         
        if( val<min || max<val)
            {
                alert("Error!");
                $(t).val($(t).data('oldValue'));
            }
    }); 
});

الحل الخاص بي لتجربة مستخدم أفضل:

لغة البرمجة

<input type="tel">

مسج

$('[type=tel]').on('change', function(e) {
  $(e.target).val($(e.target).val().replace(/[^\d\.]/g, ''))
})
$('[type=tel]').on('keypress', function(e) {
  keys = ['0','1','2','3','4','5','6','7','8','9','.']
  return keys.indexOf(event.key) > -1
})

تفاصيل:

أولاً، أنواع المدخلات:

number يظهر أسهم لأعلى/لأسفل مما يؤدي إلى تقليص مساحة الإدخال الفعلية، أجدها قبيحة وتكون مفيدة فقط إذا كان الرقم يمثل كمية (أشياء مثل الهواتف ورموز المناطق والمعرفات...لا احتاجهم)tel يوفر عمليات تحقق مماثلة للمتصفح من الرقم بدون أسهم

يساعد استخدام [الرقم / الهاتف] أيضًا في عرض لوحة المفاتيح الرقمية على الأجهزة المحمولة.

للتحقق من صحة JS، انتهى بي الأمر بالحاجة إلى وظيفتين، واحدة لإدخال المستخدم العادي (ضغطة مفتاح) والأخرى لإصلاح النسخ واللصق (التغيير)، والمجموعات الأخرى ستمنحني تجربة مستخدم سيئة.

انا استعمل ال أكثر موثوقية KeyboardEvent.key بدلا من ال إهمال الآن KeyboardEvent.charCode

واعتمادًا على دعم متصفحك، يمكنك التفكير في استخدامه Array.prototype.includes() بدلاً من الاسم السيئ Array.prototype.indexOf() (للحصول على نتائج صحيحة/خاطئة)

وهناك طريقة سهلة لحل هذه المشكلة بتنفيذ وظيفة مسج للتحقق من صحة مع التعابير المنطقية وcharaters كتبته في مربع النص على سبيل المثال:

والكود الخاص بك:

<input class="integerInput" type="text">

ووظيفة شبيبة باستخدام مسج

$(function() {
    $('.integerInput').on('input', function() {
      this.value = this.value
        .replace(/[^\d]/g, '');// numbers and decimals only

    });
});

$(function() {
        $('.integerInput').on('input', function() {
          this.value = this.value
            .replace(/[^\d]/g, '');// numbers and decimals only
            
        });
    });
<script
			  src="https://code.jquery.com/jquery-2.2.4.min.js"
			  integrity="sha256-BbhdlvQf/xTY9gja0Dq3HiwQF8LaCRTXxZKRutelT44="
			  crossorigin="anonymous">
</script>

<input type="text" class="integerInput"/>


		

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