普通WEB程序是由浏览器发出请求,服务器以HTML形式返回结果。一般情况下我们在PB的事件里编写的任何对客户端事件的响应代码都会产生一次与服务器的交互过程:当一个客户端事件被触发时,JavaScript中有一个对应的事件去向服务器发起请求,服务器端会调用对应事件的代码并将结果返回给客户端,对于客户来说一个直接的感观就是屏幕被刷新了一次。为了减少这样的postback,我们可以利用JavaScript对客户端进行编程以提高WEB程序的性能和用户体验。
要对客户端事件进行编程,必需将我们的代码包含在一个条件编译的代码块里面,编译器会识别并与普通power script代码区分开来。在自定义的JavaScript事件里可以通过使用调用Document.Form.Submit或PB缺省的已定义事件来接管被触发的事件。
下面的例子通过一个自定义的客户端JavaScript事件代码来取代DATAWINDOW的ItemChanged事件,这段代码的意思是如果是第一列或第二列的值被改变,那么调用缺省的JavaScript事件PBDataWindow_ItemChangedReject来取消值的改变。在这个例子里缺省事件将不会产生postback,如果不是第一和第二列将不会触发客户端代码。
//Start MyScriptFile.js
function MyItemChanged(sender, rowNumber, columnName, newValue)
{
if(columnName == "column1" || columnName == "column2")
{
// The default function is invoked
return PBDataWindow_ItemChangedReject(sender, rowNumber, columnName, newValue)
}
else
{
//do nothing
}
}
//End MyScriptFile.js
接管的JavaScript事件写在一个条件编译代码块里:
#IF DEFINED PBWEBFORM THEN
dw_1.JavaScriptFile = "MyScriptFile.js"
dw_1.OnClientItemChanged = "MyItemChanged"
#END IF
缺省的JavaScript事件
当我们发布程序时文件PBDataWindow.js 会拷贝到服务器applicationName\Scripts目录下,在这个文件里定义了一些缺省事件供我们调用。调用这些缺省的事件将会导致一次postback或延时的postbak,也有些事件不产生postback,面的列表列出了这些事件和差别。在前面的例子中我们使用类似dw_1.OnClient事件名 = "自定义JS函数"这样的代码接管了对应的DW对应事件的代码,写在DW对应事件里的代码将不会再被调用,如果我们想重新触发这些代码,就必需使用下表的JavaScript事件了,调用这些事件时必需使用和DATAWINDOW的客户端事件相同的参数。
Client-side Event | Default JavaScript handler (postback action) | Used under the following conditions for server-side events: |
---|
Clicked | PBDataWindow_Clicked (postback) | Clicked is handled, but DoubleClicked is not |
Clicked and ButtonClicked are handled, but DoubleClicked is not | | |
Clicked and ButtonClicking is handled, but DoubleClicked is not | | |
PBDataWindow_DelayedClicked (delayed postback) | Clicked and DoubleClicked are handled | |
Clicked, DoubleClicked, and ButtonClicked are handled | | |
Clicked, DoubleClicked, and ButtonClicking are handled | | |
PBDataWindow_ClickedDifferentRow (postback) | RowFocusChanging is handled, but Clicked and DoubleClicked are not | |
RowFocusChanged is handled, but Clicked and DoubleClicked are not | | |
PBDataWindow_DelayedClickedDifferentRow (delayed postback) | RowFocusChanging and DoubleClicked are handled, but Clicked is not | |
RowFocusChanged and DoubleClicked are handled, but Clicked is not | | |
DoubleClicked | PBDataWindow_DoubleClicked (postback) | DoubleClicked is handled |
RButtonDown | PBDataWindow_RButtonDown (postback) | RButtonDown is handled |
ButtonClicked | PBDataWindow_ButtonClicked (postback) | ButtonClicked is handled and/or ButtonClicking is handled |
ButtonClicking | PBDataWindow_ButtonClicking (postback) | ButtonClicked is handled and/or ButtonClicking is handled |
ItemFocusChanged | PBDataWindow_ItemFocusChanged (postback) | ItemFocusChanged is handled |
PBDataWindow_ItemFocusChanged_AND_ItemChanged_OR_ItemError (postback) | ItemChanged and ItemError are handled, but ItemFocusChanged is not | |
PBDataWindow_ItemFocusChanged_AND_ItemChanged (postback) | ItemChanged is handled, but ItemFocusChanged and ItemError are not | |
PBDataWindow_ItemFocusChanged_AND_ItemError (postback) | ItemError is handled, but ItemChanged and ItemFocusChanged are not | |
ItemError | PBDataWindow_ItemError (no postback) | ItemChanged is handled and/or ItemError is handled |
ItemChanged | PBDataWindow_ItemChangedReject (no postback) | ItemChanged is handled |
RowFocusChanged | PBDataWindow_RowFocusChanged (postback) | RowFocusChanging is handled, but ItemFocusChanged is not |
| | |
下表列出了Web DataWindow在客户端支持的事件列表,要使用这些事件需要在前面加前缀"OnClient"
Event | Arguments | Return Codes |
---|
ButtonClicked | sender, rowNumber, buttonName | 0 – Continue processing |
ButtonClicking | sender, rowNumber, buttonName | 0 – Execute action assigned to button, then trigger ButtonClicked 1 – Do not execute action or trigger ButtonClicked |
Clicked | sender, rowNumber, objectName | 0 – Continue processing1 – Prevent focus change |
DoubleClicked | sender, rowNumber, objectName | 0 – Continue processing1 – Prevent focus change |
ItemChanged | sender, rowNumber, columnName, newValue | 0 – Accept data value 1 – Reject data value and prevent focus change 2 – Reject data value but allow focus change |
ItemError | sender, rowNumber, columnName, newValue | 0 – Reject data value and show error message 1 – Reject data value with no error message 2 – Accept data value 3 – Reject data value but allow focus change |
ItemFocusChanged | sender, rowNumber, columnName | 0 – Continue processing |
RButtonDown | sender, rowNumber, objectName | 0 – Continue processing1 – Prevent focus change |
RowFocusChanged | sender, newRowNumber | 0 – Continue processing |
RowFocusChanging | sender, currentRowNumber, newRowNumber | 0 – Continue processing 1 – Prevent focus change |