Динамический OnClick в IE, Safari, Firefox - PullRequest
0 голосов
/ 11 февраля 2010

У меня есть следующий бит кода. Я пытаюсь динамически добавлять параметры раскрывающегося списка ко второму раскрывающемуся списку на основе выбора в первом раскрывающемся списке. Оба генерируются с помощью Ajax-вызова скрипта, который извлекает данные из базы данных. Вот соответствующий код.

 function setSub(doc) {
  // Setup some variables
  var sNode = document.getElementById('4'); // GRAB THE ELEMENT HERE
  var rmiData = doc.getElementById('rmiData').innerHTML;
  var aItems = rmiData.split("|");
  var aVals;
  // Set some background
  sNode.style.background = "#fff";
  // Loop through adding options to the drop down
  for (var x = 0; x < (aItems.length -1); x ++) {
   aVals = aItems[x].split("=");
   // ADD OPTIONS DYNAMICALLY TO SECOND DROP-DOWN HERE
   sNode.options[x+1] = new Option(aVals[1],aVals[0],false,false);
   // PROBLEM HERE: ADD ONCLICK TO THE OPTION WE JUST CREATED
   sNode.options[x+1].onclick = function() { fixDayList(); };
   //sNode.options[x+1].onclick = new Function("fixDayList();");
   //sNode.options[x+1].setAttribute("onclick", "fixDayList();");
   // END PROBLEM LINES
  }
  // Set the length
  sNode.length = x+1;
  // Select the first item in the list
  sNode[0].selected = true;
 }

Если вы заметили раздел после строки «// ПРОБЛЕМА ЗДЕСЬ», я попытался добавить событие onclick тремя различными способами. Все 3 работают правильно в Firefox. Ни одна из трех не работает в IE6 или Safari (не уверен в IE8). Есть предложения по этому поводу? Остальная часть кода использует какой-то старый школьный JavaScript, который я скопировал из существующего фрагмента старого кода, который работает, и я просто пытаюсь добавить onclick к своей версии (желательно без переписывания большого количества кода).

Есть мысли о том, почему события onclick не запускаются из Safari и IE?

У меня есть доступ к jQuery в моем коде. Так что, если jQuery исправит это внутренне, и я смогу выбрать подходящий селектор, это сработает. Но я не уверен, как именно это выбрать. Я попробовал:

$ ('# 4'). Options [x + 1] .click (function () {fixDayList ();});

Но этот селектор плох, и я не уверен, как именно выбрать правильный (я зеленый в способах jQuery).

1 Ответ

0 голосов
/ 11 февраля 2010

Используйте что-то вроде этого:

if(window.addEventListener){
   sNode.options[x+1].addEventListener('click', fixDayList, false);
} else if (window.attachEvent){
   sNode.options[x+1].attachEvent('onclick', fixDayList);
} else {
   sNode.options[x+1].onclick = fixDayList;
}

Обновление

В Safari, если элементы option не видны и не отображаются в виде раскрывающегося списка, они никогда не вызовут событие click. Но если вы добавите size=10 или что-то еще к своему элементу select, Safari будет вызывать события щелчка на элементах option.

Лучше всего будет послушать событие change на элементе select вместо попытки использовать click на options.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...