سؤال

لدي بعض التعليمات البرمجية للقيام بذلك:

 var changes = document.getElementsByName(from);
 for (var c=0; c<changes.length; c++) {
   var ch = changes[c];
   var current = new String(ch.innerHTML);
   etc.
 }

يعمل هذا بشكل جيد في FF وChrome ولكن ليس في IE7.من المفترض أن getElementsByName لا يعمل في IE.ما هو الحل الأفضل؟

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

المحلول

في حال كنت لا أعرف لماذا هذا لا يعمل في IE، وهنا <لأ href = "http://msdn.microsoft.com/en-us/library/ms536438(VS.85).aspx "يختلط =" noreferrer "> وثائق MSDN على أن وظيفة :

<اقتباس فقرة>   

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

     ليست مدرجة

وعناصر التي تدعم يتم تضمين كل من السمة اسم والسمة ID في جمع إرجاعها بواسطة الأسلوب getElementsByName، ولكن العناصر مع expando الاسم في التحصيل. وبالتالي، لا يمكن استخدام هذا الأسلوب لاسترداد العلامات المخصصة بالاسم.

وفايرفوكس يتيح getElementsByName() لاسترداد العناصر التي استخدام expando الاسم، والذي هو السبب في أنه يعمل. أم لا هذا هو الشيء ™ جيد قد يكون للنقاش، ولكن هذا هو واقع فيه.

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

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

<div id="Change0">...</div>
<div id="Change1">...</div>
<div id="Change2">...</div>
<div id="Change3">...</div>

وبعد ذلك جافا سكريبت مثل هذا:

// assumes consecutive numbering, starting at 0
function getElementsByModifiedId(baseIdentifier) {
    var allWantedElements = [];
    var idMod = 0;
    while(document.getElementById(baseIdentifier + idMod)) { // will stop when it can't find any more
        allWantedElements.push(document.getElementById(baseIdentifier + idMod++));
    }
    return allWantedElements;
}

// call it like so:
var changes = getElementsByModifiedId("Change");

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

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

نصائح أخرى

هناك مشكلتان:

  1. IE مربك بالفعل id="" مع name=""
  2. name="" غير مسموح به <span>

للإصلاح أقترح:

  1. تغيير كل name="" ل class=""
  2. قم بتغيير الكود الخاص بك مثل هذا:

-

var changes = document.getElementById('text').getElementsByTagName('span');
for (var c=0; c<changes.length; c++) {
 var ch = changes[c];

 if (ch.className != from)
continue;

 var current = new String(ch.innerHTML);

وانها ليست شائعة جدا للعثور على العناصر باستخدام الخاصية NAME. أوصي التحول إلى الملكية ID.

ولكن يمكنك إيجاد العناصر مع اسم محدد باستخدام مسج:

 $("*[name='whatevernameYouWant']");

وهذا سيعود جميع العناصر مع اسم معين.

ويدعم getElementsByName في IE، ولكن هناك أخطاء. وعلى وجه الخصوص فإنها ترجع العناصر التي "الهوية" تطابق قيمة معينة، وكذلك 'اسم'. لا أستطيع أن أقول إذا كان هذا هو المشكلة التي تواجهك دون أكثر قليلا السياق، رمز ورسائل الخطأ الفعلية بالرغم من ذلك.

في عام، وربما الأفضل تجنبها getElementsByName، لأن 'اسم' السمة في HTML لديها العديد من أغراض المتداخلة التي لا يمكن الخلط بين. باستخدام getElementById هو أكثر موثوقية. عند العمل على وجه التحديد مع حقول النموذج، يمكنك استخدام أكثر موثوقية form.elements [اسم] لاسترداد الحقول التي كنت تبحث عنها.

ولقد كان نجاح استخدام المجمع لإرجاع مجموعة من العناصر. يعمل في IE 6 و 7 أيضا. نضع في اعتبارنا انها ليست 100٪ نفس الشيء بالضبط كما document.getElementsByName، لأنها ليست NodeList. ولكن لماذا أنا في حاجة إليها ل، وهو لتشغيل فقط لحلقة على مجموعة من العناصر للقيام بأشياء بسيطة مثل الإعداد .disabled = صحيح، وأنها تعمل بشكل جيد بما فيه الكفاية.

وعلى الرغم من أن هذه الوظيفة لا يزال يستخدم getElementsByName، وأنها تعمل في حالة استخدامها بهذه الطريقة. انظر لنفسك.

function getElementsByNameWrapper(name) {
  a = new Array();

  for (var i = 0; i < document.getElementsByName(name).length; ++i) {
    a.push(document.getElementsByName(name)[i]);
  }

  return a;
}

والحل

                var listOfElements = document.getElementsByName('aName'); // Replace aName with the name you're looking for
            // IE hack, because it doesn't properly support getElementsByName
            if (listOfElements.length == 0) { // If IE, which hasn't returned any elements
                var listOfElements = [];
                var spanList = document.getElementsByTagName('*'); // If all the elements are the same type of tag, enter it here (e.g.: SPAN)
                for(var i = 0; i < spanList.length; i++) {
                    if(spanList[i].getAttribute('name') == 'aName') {
                        listOfElements.push(spanList[i]);
                    }
                }
            }
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top