سؤال

أنا أعمل مع برنامج الإكمال التلقائي ajax الذي يعمل بشكل رائع.هدفي هو إعادة التوجيه بين وظيفة التحرير لعنصر موجود، أو وظيفة الإنشاء لعنصر لم يتم العثور عليه.

أقوم بإدخال معرف محدد لكل li، وبالتالي يمكنني استخدامه لوظيفة التحرير مع خيار afterUpdateElement.

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

كنت أفكر في اختبار القيمة الكاملة التي أرسلها طلب اياكس.لكن لم أجد كيف أحمله..

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

المحلول

لذا، وجدت أخيرًا طريقة للتحقق مما إذا تم تحديد النتائج أم لا (بمساعدة كبيرة من Gwyohm):

  1. أولاً، قمنا بإعداد حقل مخفي والذي سيتم تسجيله إذا تم تحديد النتيجة (صواب/خطأ).افتراضيًا، يتم تعيينه على FALSE.
  2. يتم استخدام afterUpdateElement فقط بعد التحديد.لذلك نستخدم aferUpdateElement لتحويل الحقل المخفي إلى TRUE.
  3. إذا قام المستخدم بتغيير قيمة حقل البحث، ولم يتم تحديد قيمة جديدة تمامًا، فلن يتم استخدام afterUpdateElement، وستظل القيمة المخفية مضبوطة على TRUE.الحل لهذه المشكلة هو الاستماع إلى مفتاح مضغوط.إذا تم الضغط على أحد المفاتيح، فسيعود الحقل المخفي إلى FALSE.يعمل هذا مع جميع المفاتيح، حتى مفتاح Enter المستخدم فعليًا لإجراء التحديد.لذلك هذا استثناء يجب أن نزيله من مستمع الضغط على المفاتيح.لذا، أخيرًا دعونا نلقي نظرة على الدالة الإضافية:

    $(id-of-text-field).observe("keyup"، وظيفة(e) {

    if (window.event) keycode = window.event.keyCode;
    وإلا إذا (ه) رمز المفتاح = e.what؛
    إذا (رمز المفتاح!=13) {

    $(id-of-hidden-field).value="FALSE";

    }

    }.bindAsEventListener($(id-of-text-field)));

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

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

نصائح أخرى

ويمكنك محاولة الكتابة طريقة updateChoices مثل ذلك:

Ajax.Autocompleter.prototype.updateChoices =  function (choices) {
if(!this.changed && this.hasFocus) {

      if(!choices) {
        //do your "new item" thing here
      }
      else {
         this.update.innerHTML = choices;
         Element.cleanWhitespace(this.update);
         Element.cleanWhitespace(this.update.down());

         if(this.update.firstChild && this.update.down().childNodes) {
           this.entryCount =
             this.update.down().childNodes.length;
           for (var i = 0; i < this.entryCount; i++) {
             var entry = this.getEntry(i);
             entry.autocompleteIndex = i;
             this.addObservers(entry);
           }
         } else {
           this.entryCount = 0;
         }

         this.stopIndicator();
         this.index = 0;

         if(this.entryCount==1 && this.options.autoSelect) {
           this.selectEntry();
           this.hide();
         } else {
           this.render();
         }
      }
   }
}

وانها ليست ideea جيد للكتابة في controls.js. وبدلا من ذلك يمكنك إضافة هذه إلى شبيبة الجديد وإدراجه بعد المكتبة.

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

      if(!choices) {
        //do your "new item" thing here
      }
      else {}

وكتلة. أيضا، لم أكن اختبار التعليمات البرمجية، ولكن أعتقد أنه يجب أن تعمل.

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