• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

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

    Запись на курс до 25 апреля. Получить промодоступ ...

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

  • Автор темы Anonimous
  • Дата начала
A

Anonimous

Добрый день, коллеги!

Впервые использую 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 в данном случае, чтобы не прописывать каждую функцию?

Заранее спасибо
 
T

turumbay

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

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

Anonimous

Попытаюсь описать так.

Дано:

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, но которые в клиенте прокатят?
 
A

Anonimous

Делаю Create > Resource > Insert Resourse. Однако выбрать файлы не дает, а когда вставляю код dojo или jquery в js библиотеку, вылетает ошибка, и библиотеку сохранить не могу. Или я не так понял?
 

Gandliar

Lotus Team
16.02.2004
556
26
BIT
40
яваскриптовые функции вынесите в явоскриптовую библиотеку, которую подключаете как ресурс к форме.
 
A

Anonimous

Я бы с удовольствием вынес. Говорю, что бьюсь уже так по очереди с 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 в файловые ресурсы, а ресурсы система не видит, и библиотеки не использует.
 

rinsk

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

Anonimous

Да, в форме присутствует 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-е при прорисовке таблице могу вызывать методы библы?
 
T

turumbay

2. В приложении форма, на которой отрисовывается таблица, в которой может быть сколько угодно строк, это определяет пользователь.
Итого, задача "нужна динамическая таблица на клиенте". Какие требования к таблице? Она read-only, или данные в ячейках можно редактировать? Какова структура данных? Каким образом добавляются строки? Внутри таблицы есть какая-то логика: суммирование ячеек и прочие вычисления?
А чтобы отрисовать столько строк, сколько пользователь захочет, на этой форме создан объект с именем WebBrowser (control), в котором один Sub рисует таблицу javascript -ом.
В качестве решения выбран activex - ембеднутый в форму IE неизвестной версии ( 6.0? ). Оно конечно спорно, ну да ладно - лишь бы решало задачу.
...а в Sub прописал:
<script type="text/javascript" src="<явный путь к базе>$files/dojo.js" djConfig="parseOnLoad:true, isDebug:false"></script>
Снова загадочный Sub... Там код на каком-то языке? Или таки чистая html разметка???
Вопрос в том, можно ли сделать так, чтоб они заработали в клиенте?
Вопрос неправильный. Вам не нужно чтоб они работали в клиенте, т.к. ваша проблема вообще не имеет к клиенту отношения: вам нужно, чтобы они заработали в activex Web Browser ( который ничего о клиенте не знает ).
Через "<явный путь к базе>$files/dojo.js" вы точно ничего не подключите. Попробуйте для начала подключить через <script src="http://ajax.googleapis.com/ajax/libs/dojo/1.7.2/dojo/dojo.js"></script>. Если взлетит - можно думать как прикрутить локальную версию ( например, как предложил rinsk: ресурс/аттач в БД + выгрузка в ФС )
 
A

Anonimous

Данные в таблице можно редактировать. Мне бы просто использовать библиотеки и выполнить хотя бы примитивный код на 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 пытаюсь выполнить, чтобы понять, используется библиотека или нет.

Через "<явный путь к базе>$files/dojo.js" вы точно ничего не подключите. Попробуйте для начала подключить через CDN <script src="http://ajax.googleapis.com/ajax/libs/dojo/1.7.2/dojo/dojo.js"></script>. Если взлетит - можно думать как прикрутить локальную версию ( например, как предложил rinsk: ресурс/аттач в БД + выгрузка в ФС )

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

turumbay

Вот уже попытался, ноль эмоций.
тоже попытался. темная сторона силы работает...
код на кнопке на форме
Код:
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
 
A

Anonimous

Но почему эта темная сторона силы <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 - и ничего
 
T

turumbay

Но почему эта темная сторона силы <script src="http://ajax.googleapis.com/ajax/libs/dojo/1.7.2/dojo/dojo.js"></script> не работает в событии формы или в том же Sub FormatDocument, или в Head Content? Мне бы туда это впихнуть, пользователь-то на кнопку жать не будет.
Да кто ж его знает, почему оно не работает в PostOpen. Это ж activex: вчера работало, сегодня перестало, завтра снова заработает, но уже не так как вчера. Зато у них есть печеньки...

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

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

Anonimous

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

А не думали переписать без activex? Не знаю конкретных требований к вашей таблице, но вариантов масса:

xpages
pass-thru html на форме
html import
ембеднутая вьюха
rt поле
multivalue fields

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

Anonimous

При сохранении этой яваскриптовой библиотеки с яваскриптовыми функциями лотус ругается. Он выделяет первую строчку кода библиотеки и пишет ошибку:
Error in compiling JavaScript

Понял причину этой ошибки. У 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>|)

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

Вложения

  • распиленная_библа.rar
    21,2 КБ · Просмотры: 161

rinsk

Lotus Team
12.11.2009
1 151
125
BIT
3
Понял причину этой ошибки. У 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>|)

Библиотеки сохранились, только при вызове кода опять Лотус жалуется на ошибку в компиляции
Кто-нибудь когда-нибудь пилил так библиотеки?
Для начала надо попытаться исполнить этот метод в чистом HTML. Т.е. создать пустой HTML с кнопкой для заполнения Body вышеприведенным компотом. Вполне вероятно что при document.write(|<script language="javascript">$(document.body).css( "background", "green" )</script>|) не строится дерево DOM конкретной реализации IE.
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!