سؤال

لدي صفحة تحتوي على نموذجين وحقل مخفي خارج كلا النموذجين.

كيف يمكن تقديم الحقل المخفي مع أي من النموذجين؟

فكرت في القيام بشيء كهذا باستخدام jQuery:

<script type="text/javascript">
    $(function() {
        $('form').submit(function() {
            // do something to move or copy the
            // hidden field to the submitting form
        });
    });
</script>

هل سيعمل هذا؟هل هناك أي أفكار أخرى؟

يحرر

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

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

المحلول

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


شيء من هذا القبيل:

<script type="text/javascript">
    $(function() {
        $('form').submit(function() {
            $("#hidden_element").clone().appendTo(this);
        });
    });
</script>

إذا كنت تريد استخدام نفس العنصر تمامًا لكلا النموذجين دون إنشاء نسخة جديدة، فلا تستخدمه clone()


انظر الوثائق ل استنساخ () ولل إلحاق()

يحرر:

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

عند تحميل الصفحة، شيء مثل هذا:

$.post("page.php", { reallyBigObject : $("#hiddenfield").val() }, function(insertedID){
  $("#hiddenfield").val(insertedID);
});

ثم، في رمز جانب الخادم:

//insert $_POST["reallyBigObject"] into databse
//get the just inserted id (in php it's done with mysql_insert_id())
//echo, or print the just inserted id, and exit

بهذه الطريقة يحصل Js الخاص بك على رد الاتصال.

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

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

اسمحوا لي أن أعرف إذا كان لديك أي أسئلة أخرى...

نصائح أخرى

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

وإلحاق الحقل إلى كل من الأشكال في تحميل الصفحة:

$(function() {
    $('#form1, #form2').append($('input[name=fieldName]'));
});

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

 $(function() {
        $('form').submit(function() {
             $('input.yourhiddenSubmit').appendTo(this);
        });
    });

والطريقة الوحيدة لتمرير المتغير إلى النموذج القادم هو أن يكون هذا المتغير في البيانات التي يتم تمريرها عندما يقدم النموذج (إما GET أو POST)، إلا إذا كنت تريد استخدام AJAX. على افتراض انك تريد أن يكون خارج متغير مخفي من النموذج الفعلي ل"سبب وجيه"، أود أن أوصي باستخدام مسج لتشمل حقل إدخال مخفي في شكل قبل تقديمها، كما يلي:

<script type="text/javascript">
    $(function() {
        $('form').submit(function() {
            $(this).append("<input type='hidden' name='hiddenField' value='"+$("#hiddenField").val()+"' />");
            return true;
        });
    });
</script>

واستبدال كافة مثيلات "hiddenField" مع معرف حقل مخفي بك خارج النموذج. وهذا خلق مدخلات جديدة داخل النموذج قبل تقديمه مع قيمة الحقل المخفي الذي هو في مكان آخر على الصفحة.

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

لاحظ أن رمز أعلاه يجب أن تعمل من الناحية النظرية، ولكن لم يكن لدي فرصة لاختبار الواقع بها نفسي.

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