问题
I am designing forms in PDF and validating user input using JavaScript and depending on the user selection different labels appear on the document. Please refer to my sample code below:
var countryofgrowth = this.getField("countryofgrowth").value;
var countryofgrowth = this.getField("sugarquality").value;
var countryofgrowth = this.getField("sugarQualitylevelhigh").value;
var countryofgrowth = this.getField("cornquantitymax").value;
var countryofgrowth = this.getField("cornquantity").value;
var type = this.getField("type").value;
if ((type == "sugar") && (countryofgrowth == "Afghanistan [AF]" || countryofgrowth == "Albania [AL]" || countryofgrowth == "Algeria [DZ]" || countryofgrowth == "Angola [AO]" || countryofgrowth == "Argentina [AR]" || ……) )
{
getField("sugarlabel").display=display.visible;
getField("goodsugar").display=display.hidden;
getField("sugarQualitylevellow").display=display.hidden;
getField("sugarQualitylevelhigh").display=display.hidden;
getField("sugarQualitylevelhighmorethan75").display=display.hidden;
getField("sugarQualitylevelhighlessthan75").display=display.hidden;
getField("cornquantity").display=display.hidden;
getField("cornquantitymorethan500").display=display.hidden;
getField("cornquantitymax").display=display.hidden;
getField("cornquantitymaxyes").display=display.hidden;
getField("cornquantitymaxno").display=display.hidden;
}
else if ((type == "sugar") && (countryofgrowth == "Australia [AU]" || countryofgrowth == "Belgium [BE]" || countryofgrowth == "Canada [CA]" || countryofgrowth == "Czech Republic [CZ]" || countryofgrowth == "Denmark [DK]" || …..))
{
getField("sugarlabel").display=display.hidden;
getField("sugarquality").display=display.visible;
getField("sugarQualitylevellow").display=display.hidden;
getField("sugarQualitylevelhigh").display=display.hidden;
getField("sugarQualitylevelhighmorethan75").display=display.hidden;
getField("sugarQualitylevelhighlessthan75").display=display.hidden;
getField("cornquantity").display=display.hidden;
getField("cornquantitymorethan500").display=display.hidden;
getField("cornquantitymax").display=display.hidden;
getField("cornquantitymaxyes").display=display.hidden;
getField("cornquantitymaxno").display=display.hidden;
if (sugarquality == "Low Quality")
{
getField("sugarlabel").display=display.hidden;
getField("sugarquality").display=display.visible;
getField("sugarQualitylevellow").display=display.visible;
getField("sugarQualitylevelhigh").display=display.hidden;
getField("sugarQualitylevelhighmorethan75").display=display.hidden;
getField("sugarQualitylevelhighlessthan75").display=display.hidden;
getField("cornquantity").display=display.hidden;
getField("cornquantitymorethan500").display=display.hidden;
getField("cornquantitymax").display=display.hidden;
getField("cornquantitymaxyes").display=display.hidden;
getField("cornquantitymaxno").display=display.hidden;
}
else if (sugarquality == "High Quality")
{
getField("sugarlabel").display=display.hidden;
getField("sugarquality").display=display.visible;
getField("sugarQualitylevellow").display=display.hidden;
getField("sugarQualitylevelhigh").display=display.visible;
getField("sugarQualitylevelhighmorethan75").display=display.hidden;
getField("sugarQualitylevelhighlessthan75").display=display.hidden;
getField("cornquantity").display=display.hidden;
getField("cornquantitymorethan500").display=display.hidden;
getField("cornquantitymax").display=display.hidden;
getField("cornquantitymaxyes").display=display.hidden;
getField("cornquantitymaxno").display=display.hidden;
if (sugarQualitylevelhigh == " More than 75%")
{
getField("sugarlabel").display=display.hidden;
getField("sugarquality").display=display.visible;
getField("sugarQualitylevellow").display=display.hidden;
getField("sugarQualitylevelhigh").display=display.visible;
getField("sugarQualitylevelhighmorethan75").display=display.visible;
getField("sugarQualitylevelhighlessthan75").display=display.hidden;
getField("cornquantity").display=display.hidden;
getField("cornquantitymorethan500").display=display.hidden;
getField("cornquantitymax").display=display.hidden;
getField("cornquantitymaxyes").display=display.hidden;
getField("cornquantitymaxno").display=display.hidden;
}
else if (sugarQualitylevelhigh == "Less than 75%")
{
getField("sugarlabel").display=display.hidden;
getField("sugarquality").display=display.visible;
getField("sugarQualitylevellow").display=display.hidden;
getField("sugarQualitylevelhigh").display=display.visible;
getField("sugarQualitylevelhighmorethan75").display=display.hidden;
getField("sugarQualitylevelhighlessthan75").display=display.visible;
getField("cornquantity").display=display.hidden;
getField("cornquantitymorethan500").display=display.hidden;
getField("cornquantitymax").display=display.hidden;
getField("cornquantitymaxyes").display=display.hidden;
getField("cornquantitymaxno").display=display.hidden;
}
}
}
else if ((type == "Corn") && (countryofgrowth == "Aland Islands [AX]" || countryofgrowth == "Alderney" || countryofgrowth == "American Samoa [AS]" || countryofgrowth == "Andorra [AD]" || countryofgrowth == "Anguilla [AI]" || countryofgrowth == "Antarctica [AQ]" || ……))
{
getField("sugarlabel").display=display.hidden;
getField("sugarquality").display=display.hidden;
getField("sugarQualitylevellow").display=display.hidden;
getField("sugarQualitylevelhigh").display=display.hidden;
getField("sugarQualitylevelhighmorethan75").display=display.hidden;
getField("sugarQualitylevelhighlessthan75").display=display.hidden;
getField("cornquantity").display=display.visible;
getField("cornquantitymorethan500").display=display.hidden;
getField("cornquantitymax").display=display.hidden;
getField("cornquantitymaxyes").display=display.hidden;
getField("cornquantitymaxno").display=display.hidden;
if (cornquantity == "More than 500t")
{
getField("sugarlabel").display=display.hidden;
getField("sugarquality").display=display.hidden;
getField("sugarQualitylevellow").display=display.hidden;
getField("sugarQualitylevelhigh").display=display.hidden;
getField("sugarQualitylevelhighmorethan75").display=display.hidden;
getField("sugarQualitylevelhighlessthan75").display=display.hidden;
getField("cornquantity").display=display.visible;
getField("cornquantitymorethan500").display=display.visible;
getField("cornquantitymax").display=display.hidden;
getField("cornquantitymaxyes").display=display.hidden;
getField("cornquantitymaxno").display=display.hidden;
}
else if (cornquantity == "More than 1000t")
{
getField("sugarlabel").display=display.hidden;
getField("sugarquality").display=display.hidden;
getField("sugarQualitylevellow").display=display.hidden;
getField("sugarQualitylevelhigh").display=display.hidden;
getField("sugarQualitylevelhighmorethan75").display=display.hidden;
getField("sugarQualitylevelhighlessthan75").display=display.hidden;
getField("cornquantity").display=display.visible;
getField("cornquantitymorethan500").display=display.hidden;
getField("cornquantitymax").display=display.visible;
getField("cornquantitymaxyes").display=display.hidden;
getField("cornquantitymaxno").display=display.hidden;
if (cornquantitymax == "Yes")
{
getField("sugarlabel").display=display.hidden;
getField("sugarquality").display=display.hidden;
getField("sugarQualitylevellow").display=display.hidden;
getField("sugarQualitylevelhigh").display=display.hidden;
getField("sugarQualitylevelhighmorethan75").display=display.hidden;
getField("sugarQualitylevelhighlessthan75").display=display.hidden;
getField("cornquantity").display=display.visible;
getField("cornquantitymorethan500").display=display.hidden;
getField("cornquantitymax").display=display.visible;
getField("cornquantitymaxyes").display=display.visible;
getField("cornquantitymaxno").display=display.hidden;
}
else if (cornquantitymax == "No")
{
getField("sugarlabel").display=display.hidden;
getField("sugarquality").display=display.hidden;
getField("sugarQualitylevellow").display=display.hidden;
getField("sugarQualitylevelhigh").display=display.hidden;
getField("sugarQualitylevelhighmorethan75").display=display.hidden;
getField("sugarQualitylevelhighlessthan75").display=display.hidden;
getField("cornquantity").display=display.visible;
getField("cornquantitymorethan500").display=display.hidden;
getField("cornquantitymax").display=display.visible;
getField("cornquantitymaxyes").display=display.hidden;
getField("cornquantitymaxno").display=display.visible;
}
}
}
My current issue is that each of this || - has between 20 to 90 Countries. Currently I have 4 different sets of Countries. My question is there any way to group or declare all this sets of countries within 4 different variables, and then just call single variable when required?
My desired outcome would of been something like this, however I am not entirely sure how to accomplish, below code does not work, just for illustration purpose to reflect desired outcome:
var countryofgrowth = this.getField("countryofgrowth").value;
var countryofgrowth = this.getField("sugarquality").value;
var countryofgrowth = this.getField("sugarQualitylevelhigh").value;
var countryofgrowth = this.getField("cornquantitymax").value;
var countryofgrowth = this.getField("cornquantity").value;
var type = this.getField("type").value;
var Highriskcountries = ["Afghanistan [AF]", "Albania [AL]", "Algeria [DZ]", "Angola [AO]", "Argentina [AR]", .....];
var Lowriskcountries = ["Australia [AU]", "Belgium [BE]", "Canada [CA]", "Czech Republic [CZ]", "Denmark [DK]", .....];
var Mediumriskcountries = ["Aland Islands [AX]", "Alderney", "American Samoa [AS]", "Andorra [AD]", "Anguilla [AI]", "Antarctica [AQ]", .....];
var Acceptablecountries = ["Aland Islands [AX]", "Alderney", "American Samoa [AS]", "Andorra [AD]", "Anguilla [AI]", "Antarctica [AQ]", "Australia [AU]", "Belgium [BE]", "Canada [CA]", "Czech Republic [CZ]", "Denmark [DK]", .....];
if ((type == "sugar") && (countryofgrowth == Highriskcountries))
{
getField("sugarlabel").display=display.visible;
getField("goodsugar").display=display.hidden;
getField("sugarQualitylevellow").display=display.hidden;
getField("sugarQualitylevelhigh").display=display.hidden;
getField("sugarQualitylevelhighmorethan75").display=display.hidden;
getField("sugarQualitylevelhighlessthan75").display=display.hidden;
getField("cornquantity").display=display.hidden;
getField("cornquantitymorethan500").display=display.hidden;
getField("cornquantitymax").display=display.hidden;
getField("cornquantitymaxyes").display=display.hidden;
getField("cornquantitymaxno").display=display.hidden;
}
else if ((type == "sugar") && (countryofgrowth == Lowriskcountries))
{
getField("sugarlabel").display=display.hidden;
getField("sugarquality").display=display.visible;
getField("sugarQualitylevellow").display=display.hidden;
getField("sugarQualitylevelhigh").display=display.hidden;
getField("sugarQualitylevelhighmorethan75").display=display.hidden;
getField("sugarQualitylevelhighlessthan75").display=display.hidden;
getField("cornquantity").display=display.hidden;
getField("cornquantitymorethan500").display=display.hidden;
getField("cornquantitymax").display=display.hidden;
getField("cornquantitymaxyes").display=display.hidden;
getField("cornquantitymaxno").display=display.hidden;
}
Also here is the dropdown fields I am using to ask users initial questions, depending on their answers further dropdown fields will become visible.
Below are text fields where I currently keep my code, as I already stated in my comments below, all my code currently works fine, however due to the code size limits, each of the text fields can hold, I had to split code between 3 text fields, however I have encountered problem where, I am not able to split some of the deeply nested if...else statements, hence I am asking for help to shrink my code, by grouping countries.
回答1:
What about something like this? It may need some adjustments and I haven't tested, but basically you want to create a data structure that will allow you to generically handle every scenarios the same way.
Using objects as maps here rather than arrays to hold countries is just an optimization that would make the country lookup faster, but it's probably not necessary.
var fieldKeys = ['sugar', 'corn', 'wheet', 'potatoes'];
var fields = fieldKeys.reduce(function (res, type) {
res[type] = getField(type + 'label');
return res;
}, {});
var countriesByType = {
sugar: {
'Afghanistan': true,
'Albania': true
},
corn: {
'Australia': true,
'Belgium': true
}
};
updateFieldsVisibility({ type: 'corn', country: 'Albania' });
function updateFieldsVisibility(selection) {
var countries = countriesByType[selection.type];
hideOtherTypeFields();
fields[selection.type].display = display[countries[selection.country]? 'visible' : 'hidden'];
function hideOtherTypeFields() {
fieldKeys
.filter(function (field) {
return field != selection.type;
})
.forEach(function (field) {
fields[field].display = display.hidden;
});
}
}
As you can see for sugar and wheet & corn and potatoes I have the same sequence of countries, so I was hoping to group them somehow to prevent me from repeating them again and again
You could just do the following and use the same approach as above:
var sugarAndWheatCountries = {
'Afghanistan': true,
'Albania': true,
...
};
var cornAndPotatoesCountries = {
'Australia': true,
'Belgium': true,
...
};
var countriesByType = {
sugar: sugarAndWheatCountries,
wheat: sugarAndWheatCountries,
corn: cornAndPotatoesCountries,
potatoes: cornAndPotatoesCountries
};
To make the code smaller you may create maps dynamically from arrays:
var sugarAndWheatCountries = mapFromStringArray(['Afghanistan', 'Albania', ...]);
function mapFromStringArray(arr) {
return arr.reduce(function (acc, str) {
acc[str] = true;
return acc;
}, {});
}
来源:https://stackoverflow.com/questions/37634581/adobe-pdf-javascript-for-forms-grouping-conditions-from-if-else-statement