Bei der Arbeit mit JavaScript in Formularen ist es wichtig, Objekte und Variablen stets im beabsichtigten Scope (Gültigkeitsbereich) zu deklarieren. Werden Objekte oder Variablen unnötigerweise global deklariert, kann dies zu Beeinträchtigungen der Leistung führen.
In Designer 8.1 wurden strikte Scoping-Regeln eingeführt, um die Laufzeit und Speichernutzung von Formularen zu optimieren. In Designer sind strikte Scoping-Regeln für neue Formulare standardmäßig aktiviert. Für alte Formulare ist eine Option zum Aktivieren strikter Scoping-Regeln verfügbar.
Funktionsweise von Scopes in JavaScript
Scopes wirken nach außen hin. Dies bedeutet, dass der gesamte in geschweifte Klammern ({}) eingeschlossene Ausdruck über die geschweiften Klammern hinaus blicken kann. Ausdrücke außerhalb der geschweiften Klammern können jedoch nicht auf den in Klammern eingeschlossenen Ausdruck zugreifen.
Im folgenden Beispiel öffnet die erste geschweifte Klammer den Scope der Funktion, während die zweite ihn schließt. Sämtliche Angaben zwischen den geschweiften Klammern befinden sich im Scope von foo ().
Der Scope im folgenden Beispiel ist gültig, weil der in den geschweiften Klammern eingeschlossene Ausdruck
var nFooVar = nOutsideVar
den Ausdruck
var nOutsideVar = 2
außerhalb der geschweiften Klammern erkennt.
Das folgende Beispiel zeigt im Gegensatz dazu einen ungültigen Scope, da der Ausdruck
var nOutsideVar = nFooVar
nicht auf den Ausdruck
var nFooVar =4
innerhalb der geschweiften Klammern zugreifen kann.
Bei der Skripterstellung beschreiben Scopes Skriptelemente, die auf andere Elemente zugreifen können. Bei diesen Skriptelementen kann es sich um Variablen oder Funktionen handeln.
XML-Scope
In Formularentwürfen geht es bei Scopes um die Hierarchie. Beispiel: Um auf das Teilformular
inside
innerhalb der folgenden XML-Quelle zuzugreifen, müssen Sie
outside.inside
eingeben.
<subform name="outside">
<subform name="inside">
…
</subform>
</subform>
Geben Sie nicht
inside.outside
ein, da Sie zuerst auf das äußere Teilformular und erst dann auf untergeordnete Ebenen zugreifen müssen.
SOM-Ausdrücke und Scopes
In Formularen, die für Acrobat Adobe Reader 8.1 bestimmt sind, muss das Scoping für SOM-Ausdrücke wie im nachstehenden Beispiel erfolgen:
<subform name="a">
<subform name="b"/>
In für Acrobat oder Adobe Reader 8.0 bestimmten Formularen gibt der SOM-Ausdruck
a.b.a
das Teilformular
a
zurück. In für Acrobat oder Adobe Reader 8.1 bestimmten Formularen gibt der SOM-Ausdruck
a.b.a
den Wert
null
zurück, da das Teilformular
b
kein untergeordnetes Element mit dem Namen
a
enthält. In Acrobat oder Adobe Reader ab Version 9.0 gibt der Ausdruck einen Fehler zurück, da
a
kein gültiges untergeordnetes Element von
b
ist.
In Acrobat oder Adobe Reader 8.1 werden Funktionen und Variablen im Skript einer Node nicht zu globalen Funktionen oder Variablen (Skriptobjekte stellen eine Ausnahme dar). Beispiel:
<field name="field1">
event activity="initialize">
<script contentType="application/x-javascript">
// Function bar() is scoped to field1.initialize; nothing outside <event activity="initialize"> scope can see inside here (in 8.1)
function bar()
{
return "bar";
}
</script>
</event>
/field>
field name="field2">
<event activity="click">
<script contentType="application/x-javascript">
field1.bar();
</script>
</event>
</field>
Wenn Sie in einem für Acrobat oder Adobe Reader 8.0 bestimmten Formular auf
field 2
klicken, wird die Funktion
bar()
ausgeführt.
Wenn Sie in einem für Acrobat oder Adobe Reader 8.1 bestimmten Formular auf
field 2
klicken, wird die Funktion
bar()
nicht ausgeführt. Es erfolgt keine Ausführung, weil die Funktion
bar()
nur vom initialisierten Skript von
field1
aus verfügbar ist.
Scoping und Skriptobjekte
Skriptobjekte weisen einen globalen Scope auf. Daher kann der Zugriff darauf von einer beliebigen Position aus durch einen beliebigen Benutzer erfolgen. Wenn eine Methode auf
field1.initialize
und auf
field2.click
zugreifen soll, müssen Sie die Methode in einem Skriptobjekt platzieren. Bei striktem Scoping können Sie die Funktion
bar()
nicht von überall im Formular aufrufen. Es wird außerdem ein Laufzeitfehler angezeigt, der darüber informiert, dass die Funktion
bar()
nicht aufgelöst werden konnte. Das Skriptmodul hat in dem Scope, auf den Sie Zugriff haben, nach der Funktion
bar()
gesucht, konnte die Funktion jedoch nicht finden.
Scoping und Zielversion
Bei Verwendung des strikten Scopings erzielen Sie Verbesserungen der Leistung in Formularen, die für Acrobat oder Adobe Reader 8.1 und höher bestimmt sind. Vermeiden Sie striktes Scoping in Formularen, die für ältere Versionen von Acrobat oder Adobe Reader bestimmt sind. Andernfalls variiert die Funktionalität der Skripten in den Formularen. Erstellen Sie eine Sicherungskopie von vorhandenen Formularen, bevor Sie das strikte Scoping aktivieren. Überprüfen Sie das Skript anschließend. Wenn Sie das strikte Scoping aktivieren und danach die Zielversion auf eine Version vor Acrobat oder Adobe Reader 8.1 ändern, werden Warnungen angezeigt.
Verwendungsbereich des Scopings
Wurde bei Formularen für Acrobat oder Adobe Reader ab Version 8.1 das strikte Scoping aktiviert, werden deklarierte JavaScript-Variablen nach der Ausführung des jeweiligen Skripts freigegeben. Bei Formularen für Acrobat oder Adobe Reader ab Version 9.0 gibt das strikte Scoping nicht alle JavaScript-Variablen frei. Eine Ausnahme bildet das erneute Zusammenführen oder Importieren von neuen Daten.
Die Verbesserung der Leistung in Verbindung mit strikten Scoping-Regeln trifft für Formulare zu, die für Acrobat oder Adobe Reader 8.1 und höher bestimmt sind. Bei Formularen für ältere Versionen als Acrobat oder Adobe Reader 8 sollte von der Anwendung strikter Scoping-Regeln abgesehen werden. Die Skripten verhalten sich möglicherweise anders oder sind nicht funktionsfähig.
So aktivieren Sie das strikte Scoping
-
Wählen Sie „Datei“ > „Formulareigenschaften“ aus und klicken Sie auf die Registerkarte „Runtime“.
-
Wählen Sie „Strikte Scoping-Regeln in JavaScript erzwingen“, wenn die Option zur Verfügung steht, und klicken Sie dann auf „OK“.
Hinweis:
Wenn die Option zum Erzwingen strikter Scoping-Regeln auf der Registerkarte „Runtime“ nicht verfügbar ist, dann ist striktes Scoping bereits aktiviert.