ФорумПрограммированиеПыхнуть хотите?Готовые решения → Ojaebu().preSearch (что-то похожее на Google Suggest).

Ojaebu().preSearch (что-то похожее на Google Suggest).

  • krasun

    Сообщения: 1370 Репутация: N Группа: Джедаи

    Spritz 13 июля 2009 г. 20:32

    Изучаю JavaScript, не знал какое задании себе придумать, и придумал. Мне понравился Google Suggest поиск.
    Решил сделать не что подобное, естественно более проще, но мне этого было достаточно.

    Что бы заработал поиск необходимо подключить файл Ojaebu.js и написать следующее:

    Ojaebu().preSearch(
    '/ojaebupresearch/search.php', // куда отсылаем запрос
    document.getElementById('query'), // текстовое поле запроса
    document.getElementById('result'), // ссылка на див с результатом
    2000, // интервал, через который будет происходить обновление
    3 // количество элементов в ответе
    );


    Желательно этот код поставить на onload, точнее необходимо.

    Как работает поиск? Аналогично, Google Suggest, то есть пользователь набирает текст, но! запрос отсылается не на onkeydown, а через определенный интервал ибо есть люди, которые уж очень быстро набирают текст, я думаю это будет накладно для сервера.
    Так же предусмотрено кэширование, для чего оно надо? Например, человек написал "ap", а потом заметил, что p добавил случайно и нажал backspace, теперь в строке запроса "a", зачем отсылать новый запрос, если это можно достать из кэша?

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

    код с примером
    Спустя 244 сек.
    для примера, ввести можно "p" или "a", там в файле search.php есть $data
    Спустя 263 сек.
    хотя там и кода в общем мало, хуйня какая-то
    Спустя 55 сек.
    и если кто знает, аналогичные скрипты, дайте ссылку
  • md5

    Сообщения: 11949 Репутация: N Группа: в ухо

    Spritz 13 июля 2009 г. 20:43, спустя 11 минут 2 секунды

    я использовал
    /**
    * Extending jQuery with autocomplete
    * Version: 1.4.2
    * Author: Yanik Gleyzer (clonyara)
    */

    ОЧЕНЬ простая в использовании
    все умрут, а я изумруд
  • krasun

    Сообщения: 1370 Репутация: N Группа: Джедаи

    Spritz 13 июля 2009 г. 20:50, спустя 7 минут 1 секунду

    вообще, я смотрел. Единственное, я пока не хочу jQuery трогать, я еще в js не разобрался, а так сойдет
    Спустя 141 сек.
    http://docs.jquery.com/Plugins/Autocomplete я это смотрел, если это оно
  • Trej Gun

    Сообщения: 5299 Репутация: N Группа: в ухо

    Spritz 14 июля 2009 г. 3:05, спустя 6 часов 15 минут 14 секунд

    я так понимаю там 80% кода не твоего

    смотри сюда
    http://mabp.kiev.ua/2008/04/08/autocomplete/
  • krasun

    Сообщения: 1370 Репутация: N Группа: Джедаи

    Spritz 14 июля 2009 г. 5:27, спустя 2 часа 21 минуту 42 секунды

    CTAPbIu_MABP, с чего вы взяли? я весь код писал сам.  
    Спустя 332 сек.
    там у вас Example 8, вот что я хотел сделать. мне не надо jQuery, MoTools, Dojo и т.п.
    такие простые вещи я и сам в силах написать, тем более мне это интересно, мне просто хотелось узнать, что там с кодом, норм., не норм. так как я только начал программировать и хочется совета от более опытного программиста
  • Trej Gun

    Сообщения: 5299 Репутация: N Группа: в ухо

    Spritz 14 июля 2009 г. 5:55, спустя 28 минут 7 секунд

    krasun, нефиг со мной на Вы я еще маленький совсем!

    я почему сказал что не твой код - я придраться практически не к чему не могу, писал очень грамотный человек

    много что слизано с фрейворков
    например подход
    _Ojaebu.prototype.removeChildNodes = function(element)
    {
    while (element.childNodes[0]) {
    element.removeChild(element.childNodes[0]);
    }
    }

    только childNodes[0] == firstChild

    или вот это
    _Ojaebu.prototype.createXHR = function () 
    {
    var xhr = false;

    try {
    xhr = new ActiveXObject('Msxml2.XMLHTTP');
    } catch (e) {
    try {
    xhr = new ActiveXObject('Microsoft.XMLHTTP');
    } catch (e) {
    xhr = false;
    }

    }

    if (!xhr && typeof XMLHttpRequest != 'undefined') {
    xhr = new XMLHttpRequest();
    }

    return xhr;
    }


    везде торчит _Ojaebu.prototype , посмотри как я от него избавился - засунул все свойствами в объект

        if (type.toLowerCase() == 'get') { 
    url += '?' + parameters;
    parameters = null;
    }

    вот тут неплохо было бы проверить есть ли параметры у url и если есть добавлять не ? а &

    callback(eval("(" + responseText + ")"));

    я против eval в любом виде вместо него надо использовать вот такую конструкцию

    var head = document.getElementsByTagName("head")[0] || document.documentElement,
    script = document.createElement("script");

    script.type = "text/javascript";
    if ( jQuery.support.scriptEval )
    script.appendChild( document.createTextNode( data ) );
    else
    script.text = data;
    head.insertBefore( script, head.firstChild );
    head.removeChild( script );

    код взят из жуквери

    parameters.substring(0, parameters.length - 1)

    вместо этого можно использовать join

    но это все не существенно
    Спустя 91 сек.
    а почему именно Example 8 он ведь ничем не отличается от Example 1 только открывается наверх
  • krasun

    Сообщения: 1370 Репутация: N Группа: Джедаи

    Spritz 14 июля 2009 г. 9:26, спустя 3 часа 30 минут 59 секунд


    krasun, нефиг со мной на Вы я еще маленький совсем!

    я почему сказал что не твой код - я придраться практически не к чему не могу, писал очень грамотный человек

    это радует, спасибо, что посмотрел (теперь на ты)

    это пришло постепенно само, сначала был цикл по всем чайлднодам, потом это, теперь ты подсказал firstChild исправить


    _Ojaebu.prototype.removeChildNodes = function(element)
    {
       while (element.childNodes[0]) {
           element.removeChild(element.childNodes[0]);
       }
    }





    само создание XMLHttpRequest, да действительно взял, там ibm.com были статьи, вот оттуда я и взял создание этого обьекта.


    _Ojaebu.prototype.createXHR = function () 
    {
       var xhr = false;
           
       try {
           xhr = new ActiveXObject('Msxml2.XMLHTTP');        
       } catch (e) {
           try {
               xhr = new ActiveXObject('Microsoft.XMLHTTP');    
           } catch (e) {
               xhr = false;
           }
           
       }
           
       if (!xhr && typeof XMLHttpRequest != 'undefined') {
           xhr = new XMLHttpRequest();
       }  

       return xhr;    
    }



    потом, когда я заметил, что везде пользуюсь JSON, я понял, что это можно в одну функцию, потом сделал удобную передачу параметров для себя,
    {param1: value1, param2: valu2}.

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

    а на счет прототайп, я подумаю, я еще в js не разобрался.

    еще раз спасибо, что посмотрел
    Спустя 10961 сек.
    а как в FireFox отключить, выпадающий список, того что набирал ?
  • Trej Gun

    Сообщения: 5299 Репутация: N Группа: в ухо

    Spritz 14 июля 2009 г. 11:25, спустя 1 час 59 минут 1 секунду

    а как в FireFox отключить, выпадающий список, того что набирал ?

    thml атрибут autocomplete="off"
  • krasun

    Сообщения: 1370 Репутация: N Группа: Джедаи

    Spritz 14 июля 2009 г. 14:59, спустя 3 часа 33 минуты 15 секунд


    а как в FireFox отключить, выпадающий список, того что набирал ?

    thml атрибут autocomplete="off"


    оно, благодарю.
  • Trej Gun

    Сообщения: 5299 Репутация: N Группа: в ухо

    Spritz 14 июля 2009 г. 15:41, спустя 42 минуты 11 секунд

    krasun, рад помочь

Пожалуйста, авторизуйтесь, чтобы написать комментарий!