Как Сократить Код На Javascript?

Тема в разделе "Lotus - Программирование", создана пользователем Anonimous, 15 июн 2012.

  1. Anonimous

    Anonimous Well-Known Member

    Регистрация:
    15 июн 2012
    Сообщения:
    120
    Симпатии:
    0
    Добрый день, коллеги!

    Впервые использую Dojo. У меня возник вопрос. Я имею приложение, которое используется только в клиенте Notes. В этом приложении есть форма, а на ней используется объект WebBrowser. При создании документа на форме в этом браузере JavaScript -м рисуется таблица, в которую вводятся данные. Мне надо уменьшить размер кода(чтобы не прописывать каждую функцию ручками). Попытка использовать jQuery не привела ни к чему, так как эта библиотека, видимо, работает только в браузере, а приложение не для веб.
    Пытаюсь теперь использовать Dojo библиотеку, добавленную в ресурсы File, как файл js.
    На форме пытаюсь вызвать и через слои, и через HTML Header кодом

    "<script type=\"text/javascript\" src=\"/"+dbpath +"/data/domino/js/dojo-1.4.3/dojo/dojo.js\" djConfig=\"parseOnLoad:true\"></script>"

    или

    dbpath := @ReplaceSubstring(@Subset(@DbName; -1); "\\"; "/");
    "<script src=\"/"+dbpath+"$files/dojo.js\"></script>"

    и непосредственно перед самим javascript, который находится в одном из Sub в разделе формы Declaraions


    <script type="text/javascript" src="<явный путь к базе>$files/dojo.js" djConfig="parseOnLoad:true, isDebug:false"></script>
    а потом пытаюсь выполнить это для теста

    <script type="text/javascript">
    var init = function(){
    alert(1243);
    };
    dojo.addOnLoad(init);
    dojo.require("dijit.Dialog");
    dojo.require("dijit.form.Button");
    function Test()
    {
    dojo.byId("testcontent").innerHTML = "<button dojoType=\"dijit.form.Button\" id=\"myButton2\" onClick=\"alert(123)\"> New BUTTON </button>";
    }

    </script>

    что-то там, потом

    <div id="testcontent"
    <p>I am the Content of div id="testcontent".</p>
    </div>
    <button dojoType="dijit.form.Button" id="myButton"
    onClick="Test()">
    Add New Button
    </button>
    </body></html>


    Ели путь указываем в HTML Header, кнопка на форме появляется, но при ее нажатии код не выполняется. А если в Sub прописываем, то вообще форма пустая.

    Скажите, пожалуйста, это я что-то делаю не так или Dojo только для Веб-интерфейса? И есть ли еще способы сократить код на javascript в данном случае, чтобы не прописывать каждую функцию?

    Заранее спасибо
     
  2. turumbay

    Регистрация:
    13 мар 2009
    Сообщения:
    625
    Симпатии:
    2
    Четыре раза перечитал, ничего не понял.
    При чем тут WebBrowser Object и какое отношение имеет к нему js хедер формы? Что за "javascript, который находится в одном из Sub в разделе формы Declaraions"? Зачем понадобилось прикручивать jquery и dojo в клиента, что вы хотите от них получить? Что значит ""сократить код на javascript, чтобы не прописывать каждую функцию". Как в этом может помочь dojo?

    Что jquery, что dojo - оба заточены под работу с DOM и обработку событий в нормальных браузерах. Модель DOM в клиенте LN - это netscape середины девяностых годов прошлого века. ЕМНИП div-ов там нет - вместо них как раз использовались layers, у документа отсутствуют getElementById и проч., модель событий "слегка" отличается от стандартной w3c.

    Программно изменить обработчик js на кнопке, отрисованной через pass-thru, в принципе несложно: на форме pass-thru html текст:
    Код (Text):
    <input type="button" id="myButton" onClick="Test()" value="Button"" />
    в js Header формы
    Код (Text):
    var Test = function(){
    alert( "старый обработчик" )
    Test = function(){
    alert( "новый обработчик" )
    }
    }
    . Переменная Test доступна в глобальном js контексте (через window.Test ) и может быть переопределена программно.( В примере - она переопределяет сама себя при первом вызове ).
    Таким образом можно отрисовать форму и определить обработчики некоторый событий...

    Опишите решаемую задачу: что нужно делать ( а не как нужно делать )
     
  3. Anonimous

    Anonimous Well-Known Member

    Регистрация:
    15 июн 2012
    Сообщения:
    120
    Симпатии:
    0
    Попытаюсь описать так.

    Дано:

    1. приложение, которое используется только в клиенте, не в браузере

    2. В приложении форма, на которой отрисовывается таблица, в которой может быть сколько угодно строк, это определяет пользователь. А чтобы отрисовать столько строк, сколько пользователь захочет, на этой форме создан объект с именем WebBrowser (control), в котором один Sub рисует таблицу javascript -ом.

    Все хорошо, все работает, только в этом Sub между тегами
    <script language="javascript">

    и
    </script>

    используется много функций, которые проверяют правильность ввода данных и выполняют всякие подсчеты, чтобы отобразить результаты пользователю в таблице. В результате код Sub получился очень длинным. Надо его упростить и сделать короче.
    А как это сделать? Нашел, что для этих целей используют jquery или dojo. У них даже такие лозунги: THE WRITE LESS, DO MORE

    Ладно, добавил эти библиотеки в ресурсы Files, а в Sub прописал:

    <script type="text/javascript" src="<явный путь к базе>$files/dojo.js" djConfig="parseOnLoad:true, isDebug:false"></script>

    Не заработало, система библиотеки использовать не стала.

    Стал мучать HTML Header, пытаясь добиться хоть какого-то эффекта

    "<script type=\"text/javascript\" src=\"/"+dbpath +"/data/domino/js/dojo-1.4.3/dojo/dojo.js\" djConfig=\"parseOnLoad:true\"></script>"

    Тоже библиотеки не заработали. Вопрос в том, можно ли сделать так, чтоб они заработали в клиенте? Если нет, то существуют ли в природе библиотеки с такой же возможностью THE WRITE LESS, DO MORE, но которые в клиенте прокатят?
     
  4. Gandliar

    Gandliar Well-Known Member

    Регистрация:
    16 фев 2004
    Сообщения:
    222
    Симпатии:
    0
    попробуйте insert resource в js формы
     
  5. Anonimous

    Anonimous Well-Known Member

    Регистрация:
    15 июн 2012
    Сообщения:
    120
    Симпатии:
    0
    Делаю Create > Resource > Insert Resourse. Однако выбрать файлы не дает, а когда вставляю код dojo или jquery в js библиотеку, вылетает ошибка, и библиотеку сохранить не могу. Или я не так понял?
     
  6. Gandliar

    Gandliar Well-Known Member

    Регистрация:
    16 фев 2004
    Сообщения:
    222
    Симпатии:
    0
    яваскриптовые функции вынесите в явоскриптовую библиотеку, которую подключаете как ресурс к форме.
     
  7. Anonimous

    Anonimous Well-Known Member

    Регистрация:
    15 июн 2012
    Сообщения:
    120
    Симпатии:
    0
    Я бы с удовольствием вынес. Говорю, что бьюсь уже так по очереди с jquery и dojo.
    Вынес, хочу сохранить. При сохранении этой яваскриптовой библиотеки с яваскриптовыми функциями лотус ругается. Он выделяет первую строчку кода библиотеки и пишет ошибку:
    Error in compiling JavaScript

    А когда делаю тоже с jquery-1.5.1.min, он ругается по-другому:

    Save failed

    test for equality (==) mistyped as assignment (=)?

    прощупывал место, где он есть, корежил функцию ручками, лучше не стало.

    А когда пытаюсь сохранить яваскриптовую библиотеку, в которую скопировал функции dojo, он ругается:

    Save failed

    invalid flag after regular expression

    Оттого и стал импортировать jquery и dojo в файловые ресурсы, а ресурсы система не видит, и библиотеки не использует.
     
  8. rinsk

    rinsk Lotus team
    Lotus team

    Регистрация:
    12 ноя 2009
    Сообщения:
    797
    Симпатии:
    78
    Тут все же нужно разобраться - что и откуда вызывается. На сколько я понял изначально в ФОРМЕ присутствует некий JavaScript? посредством которых осуществляется манипулирование контейнером объекта WebBrowser. Вам уже сказали, что более высокоуровневые библиотеки из за убогости JS интерпретатора клиента лотуса подключить не удастся. Как вариант - подключить эти библиотеки в самом объекте WebBrowser. Но при этом полный URI будут указывать только или на внешний ресурс или на файловую систему. Ибо COM объект не в курсах о неких "файловых" ресурсах базы лотуса.
    Т.е. при открытии формы выкладываете\обновляете на диск библу jQuery\Dojio, создаете временный HTML файл. делаете obj.navigate2("file:c:\tmp\html.html") В этом случае из JS ФОРМЫ будут доступны ф-ции из библиотеки. без временного файла у меня не получилось модифицировать подгрузить JS... дальше не копал.
     
  9. Anonimous

    Anonimous Well-Known Member

    Регистрация:
    15 июн 2012
    Сообщения:
    120
    Симпатии:
    0
    Да, в форме присутствует javascript
    Можно уточнить, значит библа лежит в Ресурсах. При открытии формы я лотусскриптом экспортирую ее на диск, затем создаю временный файл html там же
    <html>

    <head>
    <title>Test </title>

    <script type="text/javascript" src="jquery.js"
    djConfig="parseOnLoad:true, isDebug:false"></script>
    </head>
    <body>

    </body>
    </html>

    затем делаю navigate,

    а в Sub-е при прорисовке таблице могу вызывать методы библы?
     
  10. turumbay

    Регистрация:
    13 мар 2009
    Сообщения:
    625
    Симпатии:
    2
    Итого, задача "нужна динамическая таблица на клиенте". Какие требования к таблице? Она read-only, или данные в ячейках можно редактировать? Какова структура данных? Каким образом добавляются строки? Внутри таблицы есть какая-то логика: суммирование ячеек и прочие вычисления?
    В качестве решения выбран activex - ембеднутый в форму IE неизвестной версии ( 6.0? ). Оно конечно спорно, ну да ладно - лишь бы решало задачу.
    Снова загадочный Sub... Там код на каком-то языке? Или таки чистая html разметка???
    Вопрос неправильный. Вам не нужно чтоб они работали в клиенте, т.к. ваша проблема вообще не имеет к клиенту отношения: вам нужно, чтобы они заработали в activex Web Browser ( который ничего о клиенте не знает ).
    Через "<явный путь к базе>$files/dojo.js" вы точно ничего не подключите. Попробуйте для начала подключить через CDN <script src="http://ajax.googleapis.com/ajax/libs/dojo/1.7.2/dojo/dojo.js"></script>. Если взлетит - можно думать как прикрутить локальную версию ( например, как предложил rinsk: ресурс/аттач в БД + выгрузка в ФС )
     
  11. Anonimous

    Anonimous Well-Known Member

    Регистрация:
    15 июн 2012
    Сообщения:
    120
    Симпатии:
    0
    Данные в таблице можно редактировать. Мне бы просто использовать библиотеки и выполнить хотя бы примитивный код на jquery или dojo.

    Все идет так. В событии формы PostOpen такой код

    Sub Postopen(Source As Notesuidocument)
    Set objBrowser = Source.GetObject( "WebBrowser" )
    objBrowser.navigate "about:blank"

    Set g_rptDocument = New HtmlReportDocument( objBrowser.document ) // в него САБ будет писать, HtmlReportDocument - класс с рядом функций, которые делают проверки того, что пишем
    ...

    //отсюда вызов САБа, который пишет, его имя FormatDocument

    End Sub


    Этот Sub, который должен "рисовать" методами библиотек, такой, и лотусскрипт, и отрисовка HTML. К примеру dojo

    Sub FormatDocument( unids As Variant )
    Dim session As New NotesSession
    Dim db As NotesDatabase
    Dim doc As NotesDocument
    Dim eval As Variant

    // обращение к нужным базам, откуда берутся данные


    //После обращения к базам "рисуем" в объекте на форме. Wr - это тоже САБ, он пишет приведенные ниже строки в g_rptDocument, чтобы g_rptDocument написал своим методом в объект браузер

    Wr |
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
    <html><head><title></title>

    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/dojo/1.7.2/dojo/dojo.js"></script>
    <script type="text/javascript">
    var init = function(){
    alert(1243);
    };
    dojo.addOnLoad(init);
    dojo.require("dijit.Dialog");
    dojo.require("dijit.form.Button");
    function Test()
    {
    dojo.byId("testcontent").innerHTML = "<button dojoType=\"dijit.form.Button\" id=\"myButton2\" onClick=\"alert(123)\"> New BUTTON </button>";
    }

    </script>
    </head>

    <body>

    |

    //потом еще что-то на лотусскрипте, потом

    wr {<div id="testcontent">}
    wr {<p>I am the Content of div id="testcontent".</p>}
    wr {</div>}
    wr {<button dojoType="dijit.form.Button" id="myButton"}
    wr {onClick="Test()">}
    wr {Add New Button}
    wr {</button>}
    wr {</body></html>}

    End Sub

    Вот такой код с dojo пытаюсь выполнить, чтобы понять, используется библиотека или нет.

    Вот уже попытался, ноль эмоций.
     
  12. turumbay

    Регистрация:
    13 мар 2009
    Сообщения:
    625
    Симпатии:
    2
    тоже попытался. темная сторона силы работает...
    код на кнопке на форме
    Код (Text):
    Sub Click(Source As Button)
    Dim ws As New NotesUIWorkspace
    Dim ie As Variant

    Set ie = ws.CurrentDocument.GetObject("WebBrowser")
    ie.navigate "about:blank"
    ie.document.write(|<p id='pp'>click me</p>|)
    ie.document.write(|<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>|)
    ie.document.write(|<script language="javascript">$(document.body).css( "background", "green" )</script>|)                          
    ie.document.write(|<script language="javascript">$("#pp").click(function(){alert("never use activex in production")})</script>|)                       
    End Sub
     
  13. Anonimous

    Anonimous Well-Known Member

    Регистрация:
    15 июн 2012
    Сообщения:
    120
    Симпатии:
    0
    Но почему эта темная сторона силы <script src="http://ajax.googleapis.com/ajax/libs/dojo/1.7.2/dojo/dojo.js"></script> не работает в событии формы или в том же Sub FormatDocument, или в Head Content? Мне бы туда это впихнуть, пользователь-то на кнопку жать не будет.

    Вставил на PostOpen

    Sub Postopen(Source As Notesuidocument)
    Set objBrowser = Source.GetObject( "WebBrowser" )
    objBrowser.navigate "about:blank"
    objBrowser.document.write(|<p id='pp'>click me</p>|)
    objBrowser.document.write(|<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>|)
    objBrowser.document.write(|<script language="javascript">$(document.body).css( "background", "green" )</script>|)
    objBrowser.document.write(|<script language="javascript">$("#pp").click(function(){alert("never use activex in production")})</script>|)


    Set g_rptDocument = New HtmlReportDocument( objBrowser.document )
    ...
    //вызов FormatDocument
    End Sub

    click me - и ничего
     
  14. turumbay

    Регистрация:
    13 мар 2009
    Сообщения:
    625
    Симпатии:
    2
    Да кто ж его знает, почему оно не работает в PostOpen. Это ж activex: вчера работало, сегодня перестало, завтра снова заработает, но уже не так как вчера. Зато у них есть печеньки...

    В данном случае можно повесить таймер в PostOpen и пнуть функцию по таймеру - есть надежда, что что-нить доинициализируется.

    А не думали переписать без activex? Не знаю конкретных требований к вашей таблице, но вариантов масса:
    • xpages
    • pass-thru html на форме
    • html import
    • ембеднутая вьюха
    • rt поле
    • multivalue fields
     
  15. Anonimous

    Anonimous Well-Known Member

    Регистрация:
    15 июн 2012
    Сообщения:
    120
    Симпатии:
    0
    Да, кнопку кликнуть можно javascript-oм. Если ресурс сторонний, то все хорошо. Только ресурс желательно расположить на диске. И тогда при вызове кода возникают те же ошибки, что выскакивали при попытке сохранить jquery в яваскриптовой библе.

    Пока попробую сделать динамическую таблицу, о ней поспрашиваю. Но все равно спасибо всем. :rolleyes:
     
  16. Anonimous

    Anonimous Well-Known Member

    Регистрация:
    15 июн 2012
    Сообщения:
    120
    Симпатии:
    0
    Понял причину этой ошибки. У jquery код слишком большой. Здесь прочитал. ТЫК
    Поэтому-то, когда пишу src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"
    все работает, а когда обращаюсь к ресурсу базы
    src="//СЕРВЕР/ПАПКА/БАЗА.nsf$files/jquery-1.7.2.js"
    снова в клиенте ошибка копмиляции при вызове кода. Просто не всегда есть возможность ссылаться на сторонние ресурсы.
    Попытался распилить jquery на несколько модулей, разделяя их по слову function, и Лотус позволил сохранить его как библиотеку.
    Затем прописал несколько раз

    Dim ws As New NotesUIWorkspace
    Dim ie As Variant

    Set ie = ws.CurrentDocument.GetObject("Microsoft Web Browser")
    ie.navigate "about:blank"
    ie.document.write(|<p id='pp'>click me</p>|)

    src="//СЕРВЕР/ПАПКА/БАЗА.nsf$files/jquery1"
    src="//СЕРВЕР/ПАПКА/БАЗА.nsf$files/jquery2"
    src="//СЕРВЕР/ПАПКА/БАЗА.nsf$files/jquery3"
    src="//СЕРВЕР/ПАПКА/БАЗА.nsf$files/jquery4"
    src="//СЕРВЕР/ПАПКА/БАЗА.nsf$files/jquery5"

    ie.document.write(|<script language="javascript">$(document.body).css( "background", "green" )</script>|)
    ie.document.write(|<script language="javascript">$("#pp").click(function(){alert("Hi, hi")})</script>|)

    Библиотеки сохранились, только при вызове кода опять Лотус жалуется на ошибку в компиляции
    Кто-нибудь когда-нибудь пилил так библиотеки?
     

    Вложения:

  17. rinsk

    rinsk Lotus team
    Lotus team

    Регистрация:
    12 ноя 2009
    Сообщения:
    797
    Симпатии:
    78
    Для начала надо попытаться исполнить этот метод в чистом HTML. Т.е. создать пустой HTML с кнопкой для заполнения Body вышеприведенным компотом. Вполне вероятно что при document.write(|<script language="javascript">$(document.body).css( "background", "green" )</script>|) не строится дерево DOM конкретной реализации IE.
     
Загрузка...

Поделиться этой страницей