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 11 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.