1. Друзья, в это тяжёлое и непонятное для всех нас время мы просим вас воздержаться от любых упоминаний политики на форуме, - этим ситуации не поможешь, а только возникнут ненужные ссоры и обиды. Это касается также шуток и юмора на тему конфликта. Пусть войны будут только виртуальными, а политики решают разногласия дипломатическим путём. С уважением, администрация Old-Games.RU.

    Скрыть объявление
  2. Пожалуйста, внимательно прочитайте правила раздела.
  3. Если Вы видите это сообщение, значит, вы ещё не зарегистрировались на нашем форуме.

    Зарегистрируйтесь, если вы хотите принять участие в обсуждениях. Перед регистрацией примите к сведению:
    1. Не регистрируйтесь с никами типа asdfdadhgd, 354621 и тому подобными, не несущими смысловой нагрузки (ник должен быть читаемым!): такие пользователи будут сразу заблокированы!
    2. Не регистрируйте больше одной учётной записи. Если у вас возникли проблемы при регистрации, то вы можете воспользоваться формой обратной связи внизу страницы.
    3. Регистрируйтесь с реально существующими E-mail адресами, иначе вы не сможете завершить регистрацию.
    4. Обязательно ознакомьтесь с правилами поведения на нашем форуме, чтобы избежать дальнейших конфликтов и непонимания.
    С уважением, администрация форума Old-Games.RU
    Скрыть объявление

Soft Вопрос по Perl

Тема в разделе "Hard & Soft", создана пользователем Helmut, 24 мар 2010.

  1. Helmut Herr Mannelig

    Helmut

    Переводчик

    Регистрация:
    18 мар 2008
    Сообщения:
    7.083
    Сижу и вспоминаю, вроде бы была отдельная команда для вывода большого куска html-кода. Не print qq, а что-то другое, ограничивающее блок текста до следующей команды. Вылетело из головы, хотя вроде бы помню, что было такое. Или, млин, у меня глюки? Если кто в курсе, напомните пожалуста.
     
  2. oFF_rus .

    oFF_rus

    Legacy

    Регистрация:
    25 фев 2007
    Сообщения:
    2.164
    Helmut нравится это.
  3. Helmut Herr Mannelig

    Helmut

    Переводчик

    Регистрация:
    18 мар 2008
    Сообщения:
    7.083
    Кажется да. Не уверен, но то, что мне упорно вспоминается, похоже вообще из другого языка. В любом случае, спасибо, это вполне то, что нужно.
     
  4. Helmut Herr Mannelig

    Helmut

    Переводчик

    Регистрация:
    18 мар 2008
    Сообщения:
    7.083
    Вопрос не по сабжу а по javascript, но не стал создавать новую тему. Жабаскрипт я совсем не знаю, но сейчас срочно понадобилось написать функцию передачи данных из формы обработчику, написанному на Perl.
    Имеется html-код:

    PHP:
    <form name="myform">
    ...
    <
    input type="button" name="save" value="Сохранить" onclick="SendForm('cgi/test.cgi', this.form, 'ErrorMsg')">
    </
    form>
    <
    div id="ErrorMsg"></div>
    При клике запускается функция, которая собирает все данные из этой формы и передает обработчику, а возвращаемые ответы помещает в div. Сам понимаю, что коряво и неоптимально, но как я говорил, жабаскрипта не знаю, не до жиру, лишь бы работало.

    PHP:
    function SendForm(urlformdiv) {
        var 
    string '';
        for (var 
    0form.elements.lengthi++) {
            var 
    element form.elements[i];
            if (
    element.type == "text" || element.type == "hidden" || element.type == "password" || element.type == "textarea") {
                
    string += (element.name '=' escape(element.value) + '&');
            }
            if (
    element.type == "radio" || element.type == "checkbox") {
                if (
    element.checked) {
                    
    string += (element.name '=' escape(element.value) + '&');
                }        
            }
            if (
    element.type == "select-one") {
                
    string += (element.name '=' element.options[element.selectedIndex].value '&');
            }
        }
        var 
    rnd Math.random();
        
    string += ('random=' rnd);
        
    xmlHttp.open("POST"urltrue);
        
    xmlHttp.setRequestHeader("Content-Type""application/x-www-form-urlencoded");
        
    xmlHttp.onreadystatechange updatePOST;
        
    xmlHttp.send(string);    
        function 
    updatePOST() {
            if (
    xmlHttp.readyState == 4) {
                var 
    response xmlHttp.responseText;
                if (
    xmlHttp.status == 200)
                    
    document.getElementById(div).innerHTML response;
                else
                    
    document.getElementById(div).innerHTML 'Error server request: ' xmlHttp.status;
            }
        }
    }
    Вобщем, в таком виде все работает, и не было бы проблемы. А теперь сам вопрос: При вызове функции ей передается this.form. Очевидно, что такой вызов может происходить только изнутри формы. А мне нужно то же самое, но вызываемое совсем из другой формы. Чтобы функции в качестве аргумента передавалось в виде текста name нужной формы, т.е. 'myform'. Все варианты, которые я перепробовал (например, document.forms[form].elements) срабатывают нормально только один раз, при повторном вызове функции вызывают сбой. Может кто-нибудь помочь решить эту задачку? Заранее благодарен.
     
    Последнее редактирование: 2 июн 2011
  5. Newbilius Программуль

    Newbilius

    Регистрация:
    24 авг 2007
    Сообщения:
    4.607
  6. Helmut Herr Mannelig

    Helmut

    Переводчик

    Регистрация:
    18 мар 2008
    Сообщения:
    7.083
    Nubilius, Пробовал. Во-первых, это не есть удобно, поскольку придется прописывать ID куче форм на чужих страницах, где есть только name. А во-вторых, как его использовать для формы? var form = document.getElementById(formID); тоже работает не так, как нужно.

    ЗЫ: хотелось бы, конечно, по name, избавило бы от кучи дополнительных забот, но на худой конец можно и по ID, если подскажешь, как корректно вызвать в данном случае.
     
    Последнее редактирование: 2 июн 2011
  7. Archanon

    Archanon

    Регистрация:
    18 фев 2011
    Сообщения:
    211
    Метод getElementsByName возвращает коллекцию, состоящую из всех элементов, имеющих значение атрибута name, равное elementName. Если таких элементов нет, то возвращается пустая коллекция. В результирующую коллекцию включаются только те элементы, наличие у которых атрибута name допускается стандартом HTML. Пример:

    var imgList = document.getElementsByName("MyImage");
    alert(imgList.length);


    Вот ещё пример применения
     
  8. Helmut Herr Mannelig

    Helmut

    Переводчик

    Регистрация:
    18 мар 2008
    Сообщения:
    7.083
    Archanon, Спасибо, но тоже пробовал. Возвращается список (в нем только одно значение, поскольку имя формы уникально на странице). Я добавлял цикл (на всякий случай, вдруг где-то окажется не уникальное), выбирающий из списка значение tagName = 'FORM'. Один черт, срабатывает один раз. При повторном вызове функции в нем оказывается либо null, либо какая-то муть.

    ЗЫ: Мне кажется, может быть где-то нужно что-то обнулять после каждого вызова функции, но где и что?
     
    Последнее редактирование: 2 июн 2011
  9. Archanon

    Archanon

    Регистрация:
    18 фев 2011
    Сообщения:
    211
    Скорее наоборот. То что функция getElementssByName срабатывает лишь при первом вызове, говорит о том, что, где то есть конструкции типа form.name='!hbUb'

    Для примера - приаттаченый html создан на основе приведённых вами функций и отлично работает(в качестве url указан 0.php, кнопка формы сохраняет другую форму(Проверялось в Opera10,Firefox4 и Ie7,8)).
     

    Вложения:

    • 1.rar
      Размер файла:
      1,2 КБ
      Просмотров:
      47
    Helmut нравится это.
  10. Helmut Herr Mannelig

    Helmut

    Переводчик

    Регистрация:
    18 мар 2008
    Сообщения:
    7.083
    Archanon, Да, так работает, если использовать непосредственно на странице. У меня по прежнему при повторном вызове сбоит, на этот раз form.length оказывается равной 0 при том, что form.name остается правильным. Конструкций типа form.name='!hbUb' нету, используется всего несколько скриптов и большинство из них занимается открыванием-закрыванием DIV-ов через style:display.

    Поскольку в вашем примере все работает как надо, становится очевидно, что дело в единственной разнице, отличающей мой вариант - у меня самой формы (как и кнопки вызова) изначально нет на странице, она создается в DIV через print перловским скриптом по вызову из определенного события. Похоже, вопрос все-таки по Перл. Что может быть не так, и что с этим делать?

    ЗЫ: создавать заранее внутри DIV-а пустую форму нецелесообразно, она является результатом обработки множества данных из БД и других форм, ее ID, содержимое, количество полей, их тип, имена, ID и т.д. меняется в зависимости от рассчетов, и при определенных условиях может быть разбито на несколько форм или выносить часть данных за форму.
     
    Последнее редактирование: 3 июн 2011
  11. Archanon

    Archanon

    Регистрация:
    18 фев 2011
    Сообщения:
    211
    Нет, возможно в перле и есть ошибки, но сбоят-то клиентские скрипты,, значит их и нужно копать.

    То есть теперь форму всегда можно найти по имени (кстати, почему он так изменил поведение?), но после первого вызова SendForm исчезает коллекция элементов управления. Причём сама форма тоже добавляется через скриптом по определённому событию.
    Логичнее всего предположить, что это событие почему-то вызывается и при вызове SendForm, и добавляет форму внутрь уже существующей.

    А вообще, можно взглянуть на эту удивительную страницу?
     
  12. Helmut Herr Mannelig

    Helmut

    Переводчик

    Регистрация:
    18 мар 2008
    Сообщения:
    7.083
    Не представляю, как это может происходить. Функция, вызывающая perl-овский скрипт, который создает форму и помещает ее в div, вызывается только один раз. Все, больше в этом div-е не происходит никаких процессов, не задействуется никаких скриптов. К форме тоже никто больше не обращается. Логично предположить, что и вызов по событию одной и той же функции должен приводить к одному и тому же результату.

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

    Страницы пока не существует. Есть кучка файлов с фрагментами html и cgi-обработчиками.
     
    Последнее редактирование: 3 июн 2011
  13. Archanon

    Archanon

    Регистрация:
    18 фев 2011
    Сообщения:
    211
    Мысль у меня такая. Что-то курочит DOM странички.

    Предположим, что проблема на серверной стороне, а у клиента всё правильно, пока он данные не отослал. Что у нас тогда получается?

    • Вызывается функция SendForm - всё хорошо.
    • Функция подготавливает и отсылает данные - всё хорошо... пока
    • Ждём ответа - всё хорошо, а в это время апач готовит порцию кривых данных
    • Ответ получен - да такой, что всё летит к чертям, причём независимо от браузера.
    Мне сложно представить такое.

    С другой стороны, я вполне могу представить, как может выглядеть кривой клиентский скрипт, дающий подобный эффект (пример мой несколько натянут, но возможно есть и более "изящные" реализации)

    PS
    Но есть ведь какая-то модельная страничка?

    PPS
    Я бы заменил отправку данных на заглушку, и посмотрел, что получится.

    PPPS
    А что показывает Firebug?
     

    Вложения:

    • error.rar
      Размер файла:
      2 КБ
      Просмотров:
      38
  14. Helmut Herr Mannelig

    Helmut

    Переводчик

    Регистрация:
    18 мар 2008
    Сообщения:
    7.083
    Теперь уже в понедельник продолжу разбираться. По поводу вашего примера - у меня нигде нет обработчиков событий по mouseClick или как-то иначе. Везде только button или <a></a> с onclick. По-моему от них сложно добиться срабатывания чего-то еще, кроме них самих. По поводу двойных ID или name я тоже уже десяток раз прошерстил поиском все файлы. К тому же я проверял функцию, убрав со страницы вообще все, кроме DIV-а и кнопки вызова для нее, а из перловского скрипта все, кроме print формы с одним <input type="text"> и кнопкой отправки в ней.

    Пока ничего такого, что не стыдно было бы показать. Суть в том, что имеется непрерывно расширяющаяся и усложняющаяся БД. Я накропал обработчик одного из ее разделов целиком на перле, но пока это делал, уже и этот раздел разросся настолько, что при обновлении страницы для обработки данных каждой из функций сохранение текущего состояние каждой из них и содержимое передаваемого между ними пакета данных начало приводить к логическим парадоксам, т.к. функции вызывают друг друга в разных последовательностях, в т.ч. рекурсивно. Размер обработчика событий и вызовов функций стал на порядок превышать размер собственно функций. В общем, пришел к выводу, что надо пока не поздно переделывать все нафиг на динамичный html, тогда основные события будут оставаться на странице доступными в любой момент для всех функций.

    Если интересно, вот тестовая страничка той части, на которой используется функция, про которую спрашивал (вернее, один из вариантов на каком-то из этапов работы над ним, который сохранился на флэшке). Должна позволить юзеру выбрать данные из нескольких разделов БД (а так же дополнить и/или отредактировать их), ввести дополнительные данные и создать новую запись в БД. В принципе, сейчас здесь вполне можно обойтись и вызовом this.form, но когда эта часть будет объединена с другими, один черт потребуются перекрестные вызовы.

    html
     
    Последнее редактирование: 4 июн 2011
  15. Archanon

    Archanon

    Регистрация:
    18 фев 2011
    Сообщения:
    211
    Не пашет даже если всё до предела упростить? Тогда и не знаю, куда ещё можно копнуть.
     
  16. Helmut Herr Mannelig

    Helmut

    Переводчик

    Регистрация:
    18 мар 2008
    Сообщения:
    7.083
    Я думал, может сами по себе такие функции требуют какой-нибудь реинициализации, просто я не знаю. Я жабаскрипт никогда не изучал, а раз сейчас понадобилось, разбираюсь на ходу, методом тыка. Только что увидел, что если полученный по запросу html-текст, помещаемый в DIV через innerHTML, содержит жабаскрипт, то он нифига не выполняется. Надо будет дополнить функции вызовов, чтобы из ответа как-нибудь выдирали скрипты и выполняли принудительно.
    Вот и про повторные запросы form спросил, может там просто как-то иначе делается. Но раз говорят, что все должно работать и так, как есть, похоже, все-таки какие-то локальные глюки. Надо будет попробовать упрощенный пример залить на реальный хост и проверить.

    Спасибо за советы.
     
    Последнее редактирование: 4 июн 2011
  17. Helmut Herr Mannelig

    Helmut

    Переводчик

    Регистрация:
    18 мар 2008
    Сообщения:
    7.083
    Кто-нибудь может подсказать, как грамотно уточнить MySQL запрос?
    Имеется (упрощенно) 3 таблицы: две с данными и одна промежуточная для связи множество к множеству - blank (id, number), naklad (id, number) и temp(id, blank, naklad).
    если составить запрос вида
    SELECT blank.id, blank.number, naklad.number FROM blank INNER JOIN temp ON temp.blank = blank.id INNER JOIN naklad ON naklad.id = temp.naklad GROUP BY blank.id ORDER BY blank.number
    она работает нормально, но в случае, если один бланк последовательно проходил по нескольким накладным, в результате выдает номер накладной, выбранный непонятно как.
    Буду очень благодарен, если подскажете мне, как составить запрос так, чтобы данные из таблицы накладных (в примере привел только номер, есть и другие поля) брались по самой последней (по автоинкрементируемому id) накладной. Т.е. группировка нужна по бланкам, выводить по одной записи на бланк, но данные по накладным сортировать отдельно. Что-то подсказывает мне, что нужен вложенный запрос, но не могу сообразить, как прикрутить.
     
    Последнее редактирование: 13 янв 2012
  18. CSX

    CSX

    Регистрация:
    11 мар 2011
    Сообщения:
    186
    Код:
    SELECT * FROM blank, (SELECT blank, naklad FROM temp) AS t, (SELECT id AS n_id, number AS n_number FROM naklad ORDER BY id DESC) AS n WHERE t.naklad = n.n_id AND t.blank = blank.id GROUP BY blank.number
    Первое, что приходит в голову. Не уверен насчёт производительности.
     
    Helmut нравится это.
  19. AxXxB неадекват

    AxXxB

    Legacy

    Регистрация:
    13 ноя 2006
    Сообщения:
    1.663
    Может, дело в этом? Лучше было бы создавать в диве кнопку через DOM (вот так, например)

    ---------- Сообщение добавлено в 14:10 ---------- Предыдущее сообщение размещено в 14:06 ----------

    Не, там плохо написано. В общем, создать кнопку через document.createElement и засунуть ее в div через appendChild.
     
    Helmut нравится это.
  20. Helmut Herr Mannelig

    Helmut

    Переводчик

    Регистрация:
    18 мар 2008
    Сообщения:
    7.083
    CSX, Нет, один черт при наличии нескольких накладных берет номер не последней, ORDER BY id не срабатывает.

    Производительность пока уж хрен сней, хотя в итоге в запросе должен быть INNER JOIN еще одной таблицы + SELECT еще из четырех таблиц + дополнительные условия выборки диапазона бланков.

    AxXxB, Ага, я примерно так и сделал. Ну и изменил аяксовский скрипт, вызывающий перл.
     
    Последнее редактирование: 13 янв 2012
  1. На этом сайте используются файлы cookie, чтобы персонализировать содержимое, хранить Ваши предпочтения и держать Вас авторизованным в системе, если Вы зарегистрировались.
    Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie.
    Скрыть объявление