Странное поведение CAutoComplete в IE

Общие вопросы по использованию фреймворка. Если не знаете как что-то сделать и это про Yii, вам сюда.
Ответить
Vic
Сообщения: 109
Зарегистрирован: 2010.03.12, 01:55

Странное поведение CAutoComplete в IE

Сообщение Vic » 2010.10.27, 00:37

Странное поведение наблюдаю:

- при переходе по ссылке загружается страничка с полем CAutoComplete, при вводе буковок появляется индикатор запроса и все - так и остается висеть, на сервер ничего не посылается ( смотрю по логам сервера, вообще в логах загрузка только странички по адресу из ссылки ).

- при нажатии на кнопку обновления поле начинает нормально работать ( в логах сервера кроме загрузки этой странички появляются еще все скрипты, стили, картинки )

Как можно заставить IE сразу с перехода по ссылке все загружать?

IE 8 версия ( 8.0.6001.18702 )

Аватара пользователя
samdark
Администратор
Сообщения: 8781
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: Странное поведение CAutoComplete в IE

Сообщение samdark » 2010.10.27, 00:40

Что такое «кнопка обновления»?

Vic
Сообщения: 109
Зарегистрирован: 2010.03.12, 01:55

Re: Странное поведение CAutoComplete в IE

Сообщение Vic » 2010.10.27, 00:55

Это такая кнопочка, на которой нарисованы 2 стрелочки по условной окружности, тыкающие друг друга в задницу ( или, проще говоря, то что по эффекту совпадает с нажатием на F5 )

Аватара пользователя
samdark
Администратор
Сообщения: 8781
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: Странное поведение CAutoComplete в IE

Сообщение samdark » 2010.10.27, 01:09

Похоже, какой-то кеш. Вообще, лучше всего не использовать устаревший CAutoComplete, а сразу попробовать http://www.yiiframework.com/doc/api/1.1 ... oComplete/.

Vic
Сообщения: 109
Зарегистрирован: 2010.03.12, 01:55

Re: Странное поведение CAutoComplete в IE

Сообщение Vic » 2010.10.28, 11:16

Sam Dark писал(а):Похоже, какой-то кеш. Вообще, лучше всего не использовать устаревший CAutoComplete, а сразу попробовать http://www.yiiframework.com/doc/api/1.1 ... oComplete/.
Я в нем ничего не ковырял, стоит из коробки. :(

По поводу CJuiAutoComplete: такая штука получается:

Код: Выделить всё

$this->widget('zii.widgets.jui.CJuiAutoComplete', array(
    'name'=>CHtml::activeName($model,'name'),
    'sourceUrl'=>array('autocomplete', 'json'=>1),
    // additional javascript options for the autocomplete plugin
    'options'=>array(
        'showAnim'=>'fold',
        'select'=>'function(event, ui) { alert("select"); this.value = ui.item.value; }',
        'minLength'=>2
    ),
    'htmlOptions'=>array(
        'style'=>'height:20px;'
    ),
));
 
он опцию 'select' заворачивает в строку, вместо функции.

Код: Выделить всё

jQuery('#Recipe_pat_name').autocomplete(
  {
    'showAnim':'fold',
    'select':'function(event, ui) { alert(\"select\"); this.value = ui.item.value; }',
    'minLength':2,
    'source':'/index.php?r=patient/autocomplete&json=1'
  }
);
 
Поэтому не срабатывает событие. Правка ручками ( убираение одинатрных кавычек и слешей ) запускает все в норму.

Какой есть способ, кроме как пройтись своими грязными ногами по коду виджета?

Аватара пользователя
BuCeFaL
Сообщения: 447
Зарегистрирован: 2010.03.17, 21:22
Откуда: Kiev
Контактная информация:

Re: Странное поведение CAutoComplete в IE

Сообщение BuCeFaL » 2010.10.28, 11:22

Код: Выделить всё

'select':'js:function(event, ui) { alert(\"select\"); this.value = ui.item.value; }', 

Vic
Сообщения: 109
Зарегистрирован: 2010.03.12, 01:55

Re: Странное поведение CAutoComplete в IE

Сообщение Vic » 2010.10.28, 11:26

Продолжу ( ничего, что я сам с собой тут разговариваю? ):

Вот что дает эксплоурер по поводу ошибок ( при переходе по ссылке на страницу ), кстати, и на новом виджете тоже самое, поэтому он тоже работает только после нажатия F5:
Сведения об ошибке на веб-странице

Агент пользователя: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727; InfoPath.2)
штамп времени: Thu, 28 Oct 2010 08:17:26 UTC

Сообщение: Объект не поддерживает это свойство или метод
Строка: 4954
Символ: 5
Код: 0
URI-код: http://ru/assets/8641cb4f/jquery.js
вот что интересного в этом файле jquery.js:

Код: Выделить всё

  xhr: window.XMLHttpRequest && (window.location.protocol !== "file:" || !window.ActiveXObject) ?
    function() {
      return new window.XMLHttpRequest(); // вот эта строка 4954 
    } :
    function() {
      try {
        return new window.ActiveXObject("Microsoft.XMLHTTP");
      } catch(e) {}
  },
 
я плохо разбираюсь в том, что должно быть у эксплоурера, но обычно говорят про ActiveXObject()

Vic
Сообщения: 109
Зарегистрирован: 2010.03.12, 01:55

Re: Странное поведение CAutoComplete в IE

Сообщение Vic » 2010.10.28, 11:29

BuCeFaL писал(а):

Код: Выделить всё

'select':'js:function(event, ui) { alert(\"select\"); this.value = ui.item.value; }', 
Вау-вау !!!
Спасибо огромное !!!

( подозреваю, что проход грязными ногами по коду привел к бы к такому же результату, только за большее время, правда, с большим понимаем внутренностей yii )

Еще раз огромное спасибо!!!

Аватара пользователя
BuCeFaL
Сообщения: 447
Зарегистрирован: 2010.03.17, 21:22
Откуда: Kiev
Контактная информация:

Re: Странное поведение CAutoComplete в IE

Сообщение BuCeFaL » 2010.10.28, 11:36

http://www.yiiframework.com/doc/api/1.1 ... ode-detail

Код: Выделить всё

public static function encode($value)
{
    if(is_string($value))
    {
        if(strpos($value,'js:')===0)
            return substr($value,3);
        else
            return "'".self::quote($value)."'";
    }
//...
}
 
в документации про js: не нашел, но есть отличный комент:
This function doesn't add quotes around value if content is string and begins from "js:" without quotes.

Vic
Сообщения: 109
Зарегистрирован: 2010.03.12, 01:55

Re: Странное поведение CAutoComplete в IE

Сообщение Vic » 2010.10.28, 11:40

проверка такого кода:

Код: Выделить всё

<script>
alert(new window.ActiveXObject("Microsoft.XMLHTTP"));
alert(new window.XMLHttpRequest());
</script>
дает предсказуемый результат:
первая строка говорит "object"
вторая - ошибку

получается, jquery где-то промахивается в условии приназначении свойства:

Код: Выделить всё

<script>
alert(window.XMLHttpRequest?"yes":"no");
</script>
говорит "yes" в эксплоурере, есть над чем подумать :(

странно:

Код: Выделить всё

<script>
alert(window.XMLHttpRequest);
alert(new window.XMLHttpRequest());
</script>
первый алерт говорит, что все хорошо ( см. приложенный рисунок )
а второй говорит ошибку:
Сведения об ошибке на веб-странице

Агент пользователя: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727; InfoPath.2)
штамп времени: Thu, 28 Oct 2010 08:40:11 UTC

Сообщение: Объект не поддерживает это свойство или метод
Строка: 49
Символ: 1
Код: 0
URI-код: http://ru/index.php?r=recipe/create
вот как-то так :(
Вложения
2010-10-28_123717.png
2010-10-28_123717.png (3.28 КБ) 1757 просмотров

Аватара пользователя
BuCeFaL
Сообщения: 447
Зарегистрирован: 2010.03.17, 21:22
Откуда: Kiev
Контактная информация:

Re: Странное поведение CAutoComplete в IE

Сообщение BuCeFaL » 2010.10.28, 11:45

IE реализуют ассинхронный js чезез объект ActiveXObject в то время как остальные через объект XMLHttpRequest.
как результат у IE нету XMLHttp ,а у остальных Activex. в jquery ошибки нету, они выполнели большую часть работы за программиста а именно :
определение какой же объект использовать и обработку событий + состояний.

Vic
Сообщения: 109
Зарегистрирован: 2010.03.12, 01:55

Re: Странное поведение CAutoComplete в IE

Сообщение Vic » 2010.10.28, 11:47

BuCeFaL писал(а):

Код: Выделить всё

public static function encode($value)
{
    if(is_string($value))
    {
        if(strpos($value,'js:')===0)
            return substr($value,3);
        else
            return "'".self::quote($value)."'";
    }
//...
}
 
в документации про js: не нашел, но есть отличный комент:
This function doesn't add quotes around value if content is string and begins from "js:" without quotes.
Да, я тоже про это и говорю - проход по коду значительно расширяет кругозор в yii :)

Vic
Сообщения: 109
Зарегистрирован: 2010.03.12, 01:55

Re: Странное поведение CAutoComplete в IE

Сообщение Vic » 2010.10.28, 11:56

BuCeFaL писал(а): IE реализуют ассинхронный js чезез объект ActiveXObject в то время как остальные через объект XMLHttpRequest.
как результат у IE нету XMLHttp ,а у остальных Activex. в jquery ошибки нету, они выполнели большую часть работы за программиста а именно :
определение какой же объект использовать и обработку событий + состояний.
вот я же привел результаты алертов - том видно, что что-то не так в датком королевстве:
то ли кто-то определяет такой объект, то ли экплоурер подвирает, но первая проверка выходит в true, и поэтому эксплоурер уходит не в ту ветку.

теперь еще один эксперимент:

Код: Выделить всё

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">

<head>
  <title>alert</title>
</head>

<body>
<script>
alert(window.XMLHttpRequest);
alert(new window.XMLHttpRequest());
</script>

</body>

</html>
такой код выплнился без ошибок: два раза сказали про object

Vic
Сообщения: 109
Зарегистрирован: 2010.03.12, 01:55

Re: Странное поведение CAutoComplete в IE

Сообщение Vic » 2010.10.28, 12:04

Вот еще:

Код: Выделить всё

function Dump(d,l) {
    if (l == null) l = 1;
    var s = '';
    if (typeof(d) == "object") {
        s += " {\n";
        for (var k in d) {
            for (var i=0; i<l; i++) s += "  ";
            s += k+": " + Dump(d[k],l+1);
        }
        for (var i=0; i<l-1; i++) s += "  ";
        s += "}\n"
    } else {
        s += "" + d + "\n";
    }
    return s;
}
document.write(Dump(window.XMLHttpRequest));
 
дает в IE:
{ }
профит :(

Vic
Сообщения: 109
Зарегистрирован: 2010.03.12, 01:55

Re: Странное поведение CAutoComplete в IE

Сообщение Vic » 2010.10.28, 13:25

пришлось походить грязными ногами по коду и вставил в layout такой пошлый кусок:

Код: Выделить всё

<script type="text/javascript">
/*<![CDATA[*/
jQuery(function($) {
    if( $.browser.msie )
         jQuery.ajaxSetup({
            xhr: function() {
                try {
                    return new window.ActiveXObject("Microsoft.XMLHTTP");
                } catch(e) {}
            }
        })
    });
/*]]>*/
</script>

Тебя излупят плетками и ты запрыгаешь, как миленькая
Может, напоследок, кто-нибудь подскажет, куда вписать красиво этот кусок?

Vic
Сообщения: 109
Зарегистрирован: 2010.03.12, 01:55

Re: Странное поведение CAutoComplete в IE

Сообщение Vic » 2010.10.28, 13:35

Ну и еще вопрос: как заставить не отсылать форму при выборе значения в autocomplete клавишей "Enter" ?

тут с точностью до наоборот:
в IE, Firefox, Chrome форма не отправляется
в Опере - отправляется :(

Ответить