За последние 24 часа нас посетили 59260 программистов и 1751 робот. Сейчас ищут 842 программиста ...

.innerHTML json select баг IE

Тема в разделе "JavaScript и AJAX", создана пользователем sapun, 16 окт 2011.

  1. sapun

    sapun Активный пользователь

    С нами с:
    30 авг 2011
    Сообщения:
    30
    Симпатии:
    0
    Доброго времени суток!
    Есть таких два скрипта
    [js]
    window.addEvent('domready', function() {
    var url = 'index.php?option=com_chronoforms&chronoform=form_act_oglyadu_tech&event=ajaxEvent1&format=raw';
    var article = $('article');
    article.addEvent('blur', function() {
    var value = article.value.trim();
    var jSonRequest = new Request.JSON({
    url : url,
    method : 'get',
    data : {article : article.value},
    onComplete : function(r) {

    $('descdefect').innerHTML += r.defect_ok;
    }
    }).send();
    });
    });[/js]

    PHP:
    1.  
    2. <?php
    3. // clean up the JSON message
    4. $defect = trim($_GET['article']);
    5. // check that the article field isn't empty
    6. //$response = false;
    7. if ( $defect ) {
    8.   // Check the database
    9.   $db =& JFactory::getDBO();
    10.   $query = "SELECT `defect` FROM `#__models`,`#__defect` WHERE `dSerialItem`= `mSerialItem` and LOWER(`article`) = ".$db->quote($defect).";";
    11.   $db->setQuery($query);
    12.   $list = $db->loadObjectList();
    13.  
    14.   foreach($list as $pdefect) {
    15.      $ldefect = $ldefect. '<option value="'. $pdefect->defect. '">'. $pdefect->defect. '</option>';}
    16.  
    17.   }
    18. $respdef = array('defect_ok' => $ldefect);
    19. //send the reply
    20.  
    21. echo json_encode($respdef);
    22.  
    23. // stop the from running
    24. $MyForm->stopRunning = true;
    25. ?>
    26.  
    Так вот в FF работает без проблем, а в IE выдает пустой селект, проковырял пол инете, нашел что вроде бага, а как лечить не могу понять, может кто подскажет?
     
  2. siiXth

    siiXth Активный пользователь

    С нами с:
    14 мар 2010
    Сообщения:
    1.447
    Симпатии:
    1
    насколько известно , .innerHTML равняется .html от jquery
     
  3. Михаил

    Михаил Активный пользователь

    С нами с:
    12 июл 2009
    Сообщения:
    545
    Симпатии:
    0
    Адрес:
    Bielarus
    @sapun
    видимо вам нужно вместо
    Код (Text):
    1. $('descdefect').innerHTML += r.defect_ok;
    написать
    Код (Text):
    1. $('descdefect').inject( r.defect_ok );
    http://mootools.net/docs/core/Element/E ... ent:inject

    нет не так.
    и при чём тут jQuery если это mootools?
     
  4. siiXth

    siiXth Активный пользователь

    С нами с:
    14 мар 2010
    Сообщения:
    1.447
    Симпатии:
    1
    ох я и поглюч =D сорри )
     
  5. sapun

    sapun Активный пользователь

    С нами с:
    30 авг 2011
    Сообщения:
    30
    Симпатии:
    0
    Заменил, теперь и в FF не работает, может еще что-то не так?
     
  6. Михаил

    Михаил Активный пользователь

    С нами с:
    12 июл 2009
    Сообщения:
    545
    Симпатии:
    0
    Адрес:
    Bielarus
    Может ошибки какие есть?
     
  7. sapun

    sapun Активный пользователь

    С нами с:
    30 авг 2011
    Сообщения:
    30
    Симпатии:
    0
    Пишет, что проблема как раз с этой строкой -
    [js]$('descdefect').inject( r.defect_ok ); [/js]

    Может ли быть из за того, что я использую

    PHP:
    1. $ldefect = $ldefect. '<option value="'. $pdefect->defect. '">'. $pdefect->defect. '</option>';}
    Для формирования r.defect_ok через JSON?
     
  8. Михаил

    Михаил Активный пользователь

    С нами с:
    12 июл 2009
    Сообщения:
    545
    Симпатии:
    0
    Адрес:
    Bielarus
    а покажите элемент вот этот $('descdefect')
     
  9. sapun

    sapun Активный пользователь

    С нами с:
    30 авг 2011
    Сообщения:
    30
    Симпатии:
    0
    HTML:
    1. <select id="descdefect" name="descdefect"><option value="0">Не вибрано</option> </select>
    Если я правильно Вас понял
     
  10. Михаил

    Михаил Активный пользователь

    С нами с:
    12 июл 2009
    Сообщения:
    545
    Симпатии:
    0
    Адрес:
    Bielarus
    А у вас может пхп код не валидный? $ldefect нигде выше не определена. хотя если в фф работает.
    Я предлагаю тогда:
    заменить эту строчку:
    Код (Text):
    1. foreach($list as $pdefect) {
    2.      $ldefect = $ldefect. '<option value="'. $pdefect->defect. '">'. $pdefect->defect. '</option>';}
    3.  
    на
    Код (Text):
    1.  
    2. $ldefect = array();
    3. foreach($list as $pdefect) {
    4.      $ldefect[] = $pdefect->defect;
    5. }
    6.  
    и соответсвующий код mootools

    [js]
    onComplete : function(r) {

    r.defect_ok.each(function(i){
    var opt = new Element('option').set('value',i);

    opt.set('text',i);

    $('descdefect').grab(opt);
    });
    }
    [/js]
     
  11. sapun

    sapun Активный пользователь

    С нами с:
    30 авг 2011
    Сообщения:
    30
    Симпатии:
    0
    Спасибо Михаил, Вы гуру!!!Получилось
     
  12. Михаил

    Михаил Активный пользователь

    С нами с:
    12 июл 2009
    Сообщения:
    545
    Симпатии:
    0
    Адрес:
    Bielarus
    пожалуйсто
     
  13. sapun

    sapun Активный пользователь

    С нами с:
    30 авг 2011
    Сообщения:
    30
    Симпатии:
    0
    Михаил, подскажите, а как предварительно очищать список перед загрузкой данных из БД, чтоб при новом значении не дописывать данные в селект?
     
  14. Михаил

    Михаил Активный пользователь

    С нами с:
    12 июл 2009
    Сообщения:
    545
    Симпатии:
    0
    Адрес:
    Bielarus
    удлалить все элементы списка:
    Код (Text):
    1.  
    2. $('descdefect').getChildren().invoke('dispose');
    все кроме первого:
    Код (Text):
    1.  
    2.  $('descdefect').getChildren().filter(function(i){return parseInt(i.get('value'))>0;}).invoke('dispose');