চেকবক্স ইনপুটগুলি কি কেবল ডেটা চেক করা হয় তা পোস্ট করে?


183

ফর্ম জমা দেওয়ার পরে যদি চেকবাক্স ইনপুট মান ডেটা পাঠানো হয় তবে এটি কি ব্রাউজারগুলির জন্য স্ট্যান্ডার্ড আচরণ?

এবং যদি কোনও মান ডেটা সরবরাহ না করা হয়, তবে কি ডিফল্ট মানটি সর্বদা "চালু" থাকে?

উপরের দিক থেকে ধরে নেওয়া সঠিক, সমস্ত ব্রাউজারে এই ধারাবাহিক আচরণ?

উত্তর:


186

হ্যাঁ, স্ট্যান্ডার্ড আচরণ হ'ল মানটি কেবল তখনই পাঠানো হয় যদি চেকবক্সটি চেক করা হয়। এর অর্থ সাধারণত আপনার সমস্ত সার্ভারে যে চেকবক্সগুলি আশা করছেন তা মনে রাখার একটি উপায় থাকা দরকার কারণ সমস্ত তথ্য ফর্ম থেকে ফিরে আসে না।

ডিফল্ট মান সর্বদা "চালু" থাকে, এটি ব্রাউজারগুলির মধ্যে সামঞ্জস্যপূর্ণ হওয়া উচিত।

এটি ডাব্লু 3 সি এইচটিএমএল 4 এর প্রস্তাবনায় আচ্ছাদিত :

চেকবাক্সগুলি (এবং রেডিও বোতামগুলি) স্যুইচগুলি চালু / বন্ধ রয়েছে যা ব্যবহারকারীরা টগল করতে পারে। যখন নিয়ন্ত্রণ উপাদানটির পরীক্ষিত বৈশিষ্ট্য সেট করা থাকে তখন একটি স্যুইচ "চালু" থাকে। যখন কোনও ফর্ম জমা দেওয়া হয়, কেবলমাত্র "চালু" চেকবক্স নিয়ন্ত্রণগুলি সফল হতে পারে।


18
দুর্ভাগ্যক্রমে এটি বেদনাদায়ক থ্রুথ, কেবল পরীক্ষিত চেকবক্সগুলি সার্ভারে প্রেরণ করা হয়, চেক করা নেই। পৃষ্ঠায় চেকবক্সগুলি কী রয়েছে তা আপনি যদি আগেই জানেন তবে সেগুলি পরিচালনা করতে সার্ভার সাইড স্ক্রিপ্টে সমস্যা নেই। সমস্যাটি যখন আপনি আগে থেকে জানেন না - কিছু ব্যবসায়ের যুক্তির উপর নির্ভর করে পৃষ্ঠায় গতিশীলভাবে চেকবক্স তৈরি করা হয়েছে। তারপরে আপনাকে কৌশলগুলি তৈরি করতে হবে এবং সেই চেকবক্সগুলির জন্য সমান্তরাল হাইডেন ইনপুট ক্ষেত্রগুলি ব্যবহার করতে হবে এবং জাভাস্ক্রিপ্টের মাধ্যমে সেগুলি পূরণ করতে হবে।
sbrbot

"এর অনুমতি অসফল নিয়ন্ত্রণ (অর্থাত টাইপ =" সঙ্গে একটি সামঞ্জস্যপূর্ণ যাচাইকারী চেকবক্সটি ") তৈরি চাবিকাঠি হিসেবে ফর্ম নিয়ন্ত্রণ নামকরণ হয় অস্থায়ী যখন তারা সফল হয় না, পরিবর্তনশীল আপনার sanitizer এবং যাচাইকারী তদনুসারে পরিবর্তন
এন্থনি রাতলিজের

3
কার্যসংক্রান্ত: ব্যবহার <select>দুটি বিকল্প সঙ্গে onএবং off:-)
অ্যান্ডি

82

এইচটিএমএলে, প্রতিটি <input />উপাদান একটি একক (তবে অনন্য নয়) নাম এবং মান জোড়ার সাথে যুক্ত। এই যুগলটি পরবর্তী অনুরোধে প্রেরণ করা হয় (এই ক্ষেত্রে, একটি পোষ্ট অনুরোধ সংস্থা) কেবলমাত্র <input />"সফল" হলে।

সুতরাং আপনার <form>ডিওমে এই ইনপুটগুলি থাকলে :

<input type="text"     name="one"   value="foo"                        />
<input type="text"     name="two"   value="bar"    disabled="disabled" />
<input type="text"     name="three" value="first"                      />
<input type="text"     name="three" value="second"                     />

<input type="checkbox" name="four"  value="baz"                        />
<input type="checkbox" name="five"  value="baz"    checked="checked"   />
<input type="checkbox" name="six"   value="qux"    checked="checked" disabled="disabled" />
<input type="checkbox" name=""      value="seven"  checked="checked"   />

<input type="radio"    name="eight" value="corge"                      />
<input type="radio"    name="eight" value="grault" checked="checked"   />
<input type="radio"    name="eight" value="garply"                     />

এই নামটি + মান জোড়া তৈরি করবে যা সার্ভারে জমা দেওয়া হবে:

one=foo
three=first
three=second
five=baz
eight=grault

লক্ষ্য করুন:

  • twoএবং sixতাদের বাদ দেওয়া হয়েছিল কারণ তাদের disabledবৈশিষ্ট্যটি সেট ছিল।
  • three দু'বার প্রেরণ করা হয়েছিল কারণ এতে একই নামের দুটি বৈধ ইনপুট রয়েছে।
  • fourপ্রেরণ করা হয়নি কারণ এটি checkboxএটি ছিল নাchecked
  • sixসত্ত্বেও প্রেরণ করা হয়নি checkedকারণ disabledগুণটির উচ্চতর বৈশিষ্ট্য রয়েছে।
  • sevenname=""প্রেরিত কোনও গুণাবলী নেই, সুতরাং এটি জমা দেওয়া হয়নি।

আপনার প্রশ্নের সম্মানের সাথে: আপনি দেখতে পাচ্ছেন যে চেক করা নেই এমন একটি চেকবক্সের সার্ভারে তার নাম + মান জুটি থাকবে না - তবে একই নামটি ভাগ করে নেওয়া অন্যান্য ইনপুটগুলি এর সাথে প্রেরণ করা হবে।

এএসপি.নেট এমভিসি এর মতো কাঠামো রেন্ডার এইচটিএমএল-এ checkboxএকটি hiddenইনপুট দিয়ে প্রতিটি ইনপুটকে জোড়া দিয়ে (আত্মতাত্ত্বিকভাবে) এগুলি ঘিরে কাজ করে :

@Html.CheckBoxFor( m => m.SomeBooleanProperty )

উপস্থাপন করে:

<input type="checkbox" name="SomeBooleanProperty" value="true" />
<input type="hidden"   name="SomeBooleanProperty" value="false" />

যদি ব্যবহারকারী চেকবক্সটি চেক না করে থাকে তবে নিম্নলিখিতটি সার্ভারে প্রেরণ করা হবে:

SomeBooleanProperty=false

যদি ব্যবহারকারী চেকবক্সটি চেক করে, তবে উভয়ই প্রেরণ করা হবে:

SomeBooleanProperty=true
SomeBooleanProperty=false

কিন্তু সার্ভারটি =falseসংস্করণটিকে এড়িয়ে যাবে কারণ এটি সংস্করণটি দেখে =trueএবং তাই এটি যদি এটি না দেখায় তবে এটি =trueনির্ধারণ করতে পারে যে চেকবক্সটি রেন্ডার করা হয়েছিল এবং ব্যবহারকারী এটি পরীক্ষা করে নি - SomeBooleanPropertyইনপুটগুলিকে একেবারেই রেন্ডার করা হয়নি।


লক্ষণীয় যে আপনার যদি একাধিক ক্ষেত্র যেমন অতিরিক্ত লুকানো পাঠ্যবাক্স সহ, তবে ব্যাকএন্ডে মানগুলির একটি অ্যারে পাবেন।
সালামি

এটি কেবলমাত্র একটি অ্যারে পায় যদি আপনি []ইনপুট নামের শেষে ব্যবহার করেন, ডিফল্ট আচরণটি কেবলমাত্র সেই নামের সাথে শেষ উপাদানটি জমা দিতে হয়, সুতরাং যতক্ষণ না লুকানো ইনপুট চেকবক্সের আগে থাকে, এটি কাজ করবে।
beeglebug

একই নাম (লুকানো ক্ষেত্র + চেকবক্স ক্ষেত্র) সহ দুটি ক্ষেত্র থাকা এবং চেকবাক্স চেক করে পোস্ট মানটি মানগুলির একটি কমা দ্বারা পৃথক স্ট্রিং string "0,1" এর মতো কিছু
16

1
@Beglebug আপনি যা বর্ণনা করছেন তা হল পিএইচপি কীভাবে নাম এবং মানগুলি পরিচালনা করে, []প্রত্যয়টি এইচটিএমএল স্পেসিফিকেশনের অংশ নয় এবং ব্রাউজারগুলি এটিকে বিশেষভাবে আচরণ করে না। []পিএইচপি ছাড়াই সমস্ত মানগুলির পরিবর্তে কেবলমাত্র একক মান (শেষ মান) অ্যাক্সেসের অনুমতি দেবে।
দাই

1
চেকবক্সটি সমস্ত ব্রাউজারগুলিতে আমার জন্য কাজ করার আগে লুকানো সম্পত্তি ব্যবহার করে আমি পিএইচপি দিয়ে জিইটি এবং পোষ্ট ব্যবহার করে পরীক্ষা করেছি। আমি যখন এটি চেকবক্স নিয়ন্ত্রণের পরে স্থাপন করি এটি সর্বদা ফলাফলকে মিথ্যা বলে।
আদ্রিয়ানওয়াদে

16

যদি চেকবক্সটি চেক করা না থাকে তবে এটি ফর্ম জমা দেওয়ার সময় পাঠানো ডেটাতে অবদান রাখে না।

এইচটিএমএল 5 বিভাগ 4.10.22.4 ফর্ম ডেটা সেট তৈরি করা ফর্ম ডেটা তৈরির উপায় বর্ণনা করে:

নিম্নলিখিত শর্তগুলির মধ্যে যদি কোনটি পূরণ করা হয় তবে এই উপাদানটির জন্য এই সাবস্কিপগুলি এড়িয়ে যান: [...]

ক্ষেত্র উপাদানটি একটি ইনপুট উপাদান যাঁর ধরণের বিশিষ্টতা চেকবাক্স রাজ্যে এবং যার চেকডনেসটি মিথ্যা।

এবং তারপরে অনুপস্থিত onথাকলে ডিফল্ট মান নির্দিষ্ট করা valueহয়:

অন্যথায়, যদি ক্ষেত্র উপাদানটি কোনও ইনপুট উপাদান হয় যার ধরণের বৈশিষ্ট্যটি চেকবক্সের রাজ্যে বা রেডিও বোতামের রাজ্যে থাকে, তবে এই আরও নেস্টেড সাবসটপগুলি চালান:

যদি ক্ষেত্রের উপাদানটির একটি মান বৈশিষ্ট্য নির্দিষ্ট করা থাকে, তবে মানটিকে সেই গুণকের মান হতে দিন; অন্যথায়, মানটি "চালু" হয়ে যান।

ফর্ম ডেটা নির্মাণের সময় এই চেকবিহীন চেকবক্সগুলি বাদ দেওয়া হয়।

এইচটিএমএল 4 এর অধীনে অনুরূপ আচরণ প্রয়োজন । সমস্ত অনুগত ব্রাউজার থেকে এই আচরণটি আশা করা যুক্তিসঙ্গত।


10

চেকবক্সগুলি চেকবক্সটি যদি চেক করা হয় তবেই এবং 'মান' পোস্ট করে। চেকবাক্স মান ধরার জন্য অন্তর্ভুক্ত আপনি লুকানো ইনপুট ব্যবহার করতে পারেন

জেএস :

var chk = $('input[type="checkbox"]');
    chk.each(function(){
        var v = $(this).attr('checked') == 'checked'?1:0;
        $(this).after('<input type="hidden" name="'+$(this).attr('rel')+'" value="'+v+'" />');
    });

chk.change(function(){ 
        var v = $(this).is(':checked')?1:0;
        $(this).next('input[type="hidden"]').val(v);
    });

এইচটিএমএল :

<label>Active</label><input rel="active" type="checkbox" />

8

ফর্ম জমা দেওয়ার পরে যদি চেকবাক্স ইনপুট মান ডেটা পাঠানো হয় তবে এটি কি ব্রাউজারগুলির জন্য স্ট্যান্ডার্ড আচরণ?

হ্যাঁ, কারণ অন্যথায় চেকবক্সটি চেক করা হয়েছে কিনা তা নির্ধারণের কোনও শক্ত উপায়ই ছিল না (যদি এটির মান পরিবর্তন হয়, যদি আপনার পছন্দসই মানটি পরীক্ষা করা হয় তবে এটি একইরকম হতে পারে অদলবদল)।

এবং যদি কোনও মান ডেটা সরবরাহ না করা হয়, তবে কি ডিফল্ট মানটি সর্বদা "চালু" থাকে?

অন্যান্য উত্তরগুলি নিশ্চিত করে যে "অন" ডিফল্ট। তবে, আপনি যদি মানটির প্রতি আগ্রহী না হন তবে কেবল ব্যবহার করুন:

if (isset($_POST['the_checkbox'])){
    // name="the_checkbox" is checked
}

7

এইচটিএমএল 4 স্পেস থেকে, যা প্রায় সমস্ত ব্রাউজার জুড়েই সামঞ্জস্যপূর্ণ হওয়া উচিত:

http://www.w3.org/TR/html401/interact/forms.html#checkbox

চেকবাক্সগুলি (এবং রেডিও বোতামগুলি) স্যুইচগুলি চালু / বন্ধ রয়েছে যা ব্যবহারকারীরা টগল করতে পারে। যখন নিয়ন্ত্রণ উপাদানটির পরীক্ষিত বৈশিষ্ট্য সেট করা থাকে তখন একটি স্যুইচ "চালু" থাকে। যখন কোনও ফর্ম জমা দেওয়া হয়, কেবলমাত্র "চালু" চেকবক্স নিয়ন্ত্রণগুলি সফল হতে পারে।

সফল নিম্নলিখিত হিসাবে সংজ্ঞায়িত করা হয়:

একটি সফল নিয়ন্ত্রণ জমা দেওয়ার জন্য "বৈধ"। প্রতিটি সফল নিয়ন্ত্রণের জমা দেওয়া ফর্ম ডেটা সেটের অংশ হিসাবে তার নিয়ন্ত্রণের নামটি বর্তমান মান দিয়ে যুক্ত করে। একটি সফল নিয়ন্ত্রণ অবশ্যই একটি ফর্ম উপাদান মধ্যে সংজ্ঞায়িত করা উচিত এবং একটি নিয়ন্ত্রণ নাম থাকতে হবে।


5

ইনপুট প্রকার = "লুকানো" নাম = "is_main" মান = "0"

ইনপুট প্রকার = "চেকবক্স" নাম = "is_main" মান = "1"

যাতে আপনি অ্যাপ্লিকেশনটিতে যেমন করেছিলেন তেমন আপনি নিয়ন্ত্রণ করতে পারেন। যদি এটি পরীক্ষা করে থাকে তবে মান 1 অন্যথায় 0 প্রেরণ করুন


3

উপরের কোন উত্তরই আমাকে সন্তুষ্ট করেনি। আমি খুঁজে পেয়েছি সবচেয়ে ভাল সমাধান হ'ল প্রতিটি নামের সাথে একই চেকবক্স ইনপুটটির আগে একটি লুকানো ইনপুট অন্তর্ভুক্ত করা ।

<input type="hidden" name="foo[]" value="off"/>

<input type="checkbox" name="foo[]"/>

তারপরে সার্ভারের দিকে, একটু অ্যালগোরিদম ব্যবহার করে আপনি এইচটিএমএল সরবরাহ করার মতো আরও কিছু পেতে পারেন।

function checkboxHack(array $checkbox_input): array
{
    $foo = [];
    foreach($checkbox_input as $value) {
        if($value === 'on') {
            array_pop($foo);
        }
        $foo[] = $value;
    }
    return $foo;
}

এটি কাঁচা ইনপুট হবে

array (
    0 => 'off',
    1 => 'on',
    2 => 'off',
    3 => 'off',
    4 => 'on',
    5 => 'off',
    6 => 'on',
),

এবং ফাংশন ফিরে আসবে

array (
    0 => 'on',
    1 => 'off',
    2 => 'on',
    3 => 'on',
)  

1

আমার একটি পৃষ্ঠা (ফর্ম) যা গতিশীলভাবে চেকবাক্স তৈরি করে তাই এই উত্তরগুলি দারুণ সহায়ক হয়েছে। আমার সমাধান এখানে অনেকের সাথে একই রকম তবে এটি কার্যকর করা সহজ বলে আমি ভাবতে সহায়তা করতে পারি না।

প্রথমে আমি আমার চেকবক্সের সাথে মিল রেখে একটি লুকানো ইনপুট বাক্স রাখি

 <td><input class = "chkhide" type="hidden" name="delete_milestone[]" value="off"/><input type="checkbox" name="delete_milestone[]"   class="chk_milestone" ></td>

এখন যদি checkboxesসমস্তগুলি নির্বাচিত না হয় তবে লুকানো ক্ষেত্রের দ্বারা ফেরত মানগুলি সমস্ত বন্ধ হয়ে যাবে।

উদাহরণস্বরূপ, এখানে পাঁচটি গতিশীল inোকানো চেকবাক্স সহ POSTSনিম্নলিখিত মানগুলি রূপ দেয়:

  'delete_milestone' => 
array (size=7)
  0 => string 'off' (length=3)
  1 => string 'off' (length=3)
  2 => string 'off' (length=3)
  3 => string 'on' (length=2)
  4 => string 'off' (length=3)
  5 => string 'on' (length=2)
  6 => string 'off' (length=3)

এটি দেখায় যে কেবল তৃতীয় এবং চতুর্থ চেকবক্সগুলি হয় onবা checked

সংক্ষেপে ডামি বা লুকানো ইনপুট ক্ষেত্রটি কেবল ইঙ্গিত করে যে অফ ইনডেক্সের নীচে "অন" না থাকলে সবকিছু বন্ধ রয়েছে , যা ক্লায়েন্ট সাইড কোডের একক লাইন ছাড়াই আপনার প্রয়োজনীয় সূচকটি দেয়।


0

প্রকৃত চেকবক্সের (একই নামের) আগে একই নামের গোপন ইনপুটটি বাদ দেওয়া ঠিক যেমন এএসপি.নেট বৈকল্পিকের মতো। শুধুমাত্র শেষ মানগুলি প্রেরণ করা হবে। এইভাবে যদি কোনও বাক্স চেক করা থাকে তবে এর নাম এবং "অন" মান পাঠানো হয়, যদি এটি চেক না করা হয় তবে সংশ্লিষ্ট লুকানো ইনপুটটির নাম এবং আপনি যে মানটি দিতে চান তা প্রেরণ করা হবে। শেষ পর্যন্ত আপনি পড়ার জন্য $ _POST অ্যারে পাবেন এতে থাকা সমস্ত চেকড এবং চেক না করা উপাদানগুলির সাথে, "অন" এবং "ভুয়া" মানগুলি, কোনও সদৃশ কী নেই। পিএইচপি মধ্যে প্রক্রিয়া সহজ।


0

ফর্ম জমা দেওয়ার সময় পাঠানো হবে না এমন চেকবাক্সগুলি যাচাই করা একই সমস্যা রয়েছে, আমি চেকবাক্স আইটেমগুলি আয়না না করে অন্য একটি সমাধান নিয়ে এসেছি।

এর সাথে সমস্ত চেক না করা চেকবক্সগুলি পাওয়া

var checkboxQueryString;

$form.find ("input[type=\"checkbox\"]:not( \":checked\")" ).each(function( i, e ) {
  checkboxQueryString += "&" + $( e ).attr( "name" ) + "=N"
});

-2

আমি এই কোডটি দিয়ে সমস্যার সমাধান করেছি:

এইচটিএমএল ফর্ম

<input type="checkbox" id="is-business" name="is-business" value="off" onclick="changeValueCheckbox(this)" >
<label for="is-business">Soy empresa</label>

এবং জাভাস্ক্রিপ্ট ফাংশন চেকবক্স মান ফর্ম পরিবর্তন করে:

//change value of checkbox element
function changeValueCheckbox(element){
   if(element.checked){
    element.value='on';
  }else{
    element.value='off';
  }
}

এবং সার্ভার চেক করেছে যে ডেটা পোস্টটি "চালু" বা "অফ" আছে কিনা। আমি প্লেফ্রেমওয়ার্ক জাভা ব্যবহার করেছি

        final Map<String, String[]> data = request().body().asFormUrlEncoded();

        if (data.get("is-business")[0].equals('on')) {
            login.setType(new MasterValue(Login.BUSINESS_TYPE));
        } else {
            login.setType(new MasterValue(Login.USER_TYPE));
        }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.